Fix uninit written in scoutfs_file_write_iter

scoutfs_file_write_iter tried to track written bytes and return those
unless there was an error.  But written was uninitialized if we got
errors in any of the calls leading up to performing the write.  The
bytes written were also not being passed to the generic_write_sync
helper.  This fixes up all those inconsistencies and makes it look like
the write_iter path in other filesystems.

Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
Zach Brown
2024-01-31 17:13:39 -08:00
parent c385eea9a1
commit 3f773a8594

View File

@@ -203,8 +203,7 @@ ssize_t scoutfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
struct scoutfs_lock *scoutfs_inode_lock = NULL;
SCOUTFS_DECLARE_PER_TASK_ENTRY(pt_ent);
DECLARE_DATA_WAIT(dw);
int ret;
int written;
ssize_t ret;
retry:
inode_lock(inode);
@@ -231,7 +230,7 @@ retry:
/* XXX: remove SUID bit */
written = __generic_file_write_iter(iocb, from);
ret = __generic_file_write_iter(iocb, from);
out:
scoutfs_per_task_del(&si->pt_data_lock, &pt_ent);
@@ -244,10 +243,10 @@ out:
goto retry;
}
if (ret > 0 || ret == -EIOCBQUEUED)
ret = generic_write_sync(iocb, written);
if (ret > 0)
ret = generic_write_sync(iocb, ret);
return written ? written : ret;
return ret;
}
#endif