[PATCH v5 6/7] fs: pass iocb to generic_write_sync

2014-11-05 Thread Milosz Tanski
From: Christoph Hellwig 

Clean up the generic_write_sync by just passing an iocb and a bytes
written / negative errno argument.  In addition to simplifying the
callers this also prepares for passing a per-operation O_DSYNC
flag.  Two callers didn't quite fit that scheme:

 - dio_complete didn't both to update ki_pos as we don't need it
   on a iocb that is about to be freed, so we had to add it. Additionally
   it also synced out written data in the error case, which has been
   changed to operate like the other callers.
 - gfs2 also used generic_write_sync to implement a crude version
   of fallocate.  It has been switched to use an open coded variant
   instead.

Signed-off-by: Christoph Hellwig 
---
 fs/block_dev.c |  8 +---
 fs/btrfs/file.c|  7 ++-
 fs/cifs/file.c |  8 +---
 fs/direct-io.c |  8 ++--
 fs/ext4/file.c |  8 +---
 fs/gfs2/file.c |  9 +++--
 fs/ntfs/file.c |  8 ++--
 fs/udf/file.c  | 11 ++-
 fs/xfs/xfs_file.c  |  8 +---
 include/linux/fs.h |  8 +---
 mm/filemap.c   | 30 --
 11 files changed, 40 insertions(+), 73 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index cc9d411..c529b1c 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1568,18 +1568,12 @@ static long block_ioctl(struct file *file, unsigned 
cmd, unsigned long arg)
  */
 ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
-   struct file *file = iocb->ki_filp;
struct blk_plug plug;
ssize_t ret;
 
blk_start_plug(&plug);
ret = __generic_file_write_iter(iocb, from);
-   if (ret > 0) {
-   ssize_t err;
-   err = generic_write_sync(file, iocb->ki_pos - ret, ret);
-   if (err < 0)
-   ret = err;
-   }
+   ret = generic_write_sync(iocb, ret);
blk_finish_plug(&plug);
return ret;
 }
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index a18ceab..4f4a6f7 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1820,11 +1820,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
 */
BTRFS_I(inode)->last_trans = root->fs_info->generation + 1;
BTRFS_I(inode)->last_sub_trans = root->log_transid;
-   if (num_written > 0) {
-   err = generic_write_sync(file, pos, num_written);
-   if (err < 0)
-   num_written = err;
-   }
+
+   num_written = generic_write_sync(iocb, num_written);
 
if (sync)
atomic_dec(&BTRFS_I(inode)->sync_writers);
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index c485afa..32359de 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2706,13 +2706,7 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
rc = __generic_file_write_iter(iocb, from);
mutex_unlock(&inode->i_mutex);
 
-   if (rc > 0) {
-   ssize_t err;
-
-   err = generic_write_sync(file, iocb->ki_pos - rc, rc);
-   if (err < 0)
-   rc = err;
-   }
+   rc = generic_write_sync(iocb, rc);
} else {
mutex_unlock(&inode->i_mutex);
}
diff --git a/fs/direct-io.c b/fs/direct-io.c
index e181b6b..b72ac83 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -257,12 +257,8 @@ static ssize_t dio_complete(struct dio *dio, loff_t 
offset, ssize_t ret,
inode_dio_done(dio->inode);
if (is_async) {
if (dio->rw & WRITE) {
-   int err;
-
-   err = generic_write_sync(dio->iocb->ki_filp, offset,
-transferred);
-   if (err < 0 && ret > 0)
-   ret = err;
+   dio->iocb->ki_pos = offset + transferred;
+   ret = generic_write_sync(dio->iocb, ret);
}
 
aio_complete(dio->iocb, ret, 0);
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index aca7b24..79b000c 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -175,13 +175,7 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter 
*from)
ret = __generic_file_write_iter(iocb, from);
mutex_unlock(&inode->i_mutex);
 
-   if (ret > 0) {
-   ssize_t err;
-
-   err = generic_write_sync(file, iocb->ki_pos - ret, ret);
-   if (err < 0)
-   ret = err;
-   }
+   ret = generic_write_sync(iocb, ret);
if (o_direct)
blk_finish_plug(&plug);
 
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index 80dd44d..3fafeca 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -895,8 +895,13 @@ retry:
gfs2_quota_unlock(ip);
}
 
-   if (error == 0)
-   error = generic_write_sync(file, pos, count);
+   if (error)
+   goto out_unlock;
+
+

Re: [Linux-NTFS-Dev] [PATCH v5 6/7] fs: pass iocb to generic_write_sync

2014-11-06 Thread Milosz Tanski
On Thu, Nov 6, 2014 at 5:52 AM, Anton Altaparmakov  wrote:
> Hi,
>
>> On 5 Nov 2014, at 23:14, Milosz Tanski  wrote:
>>
>> From: Christoph Hellwig 
>>
>> Clean up the generic_write_sync by just passing an iocb and a bytes
>> written / negative errno argument.  In addition to simplifying the
>> callers this also prepares for passing a per-operation O_DSYNC
>> flag.  Two callers didn't quite fit that scheme:
>>
>> - dio_complete didn't both to update ki_pos as we don't need it
>>   on a iocb that is about to be freed, so we had to add it. Additionally
>>   it also synced out written data in the error case, which has been
>>   changed to operate like the other callers.
>> - gfs2 also used generic_write_sync to implement a crude version
>>   of fallocate.  It has been switched to use an open coded variant
>>   instead.
>>
>> Signed-off-by: Christoph Hellwig 
>> ---
>> fs/block_dev.c |  8 +---
>> fs/btrfs/file.c|  7 ++-
>> fs/cifs/file.c |  8 +---
>> fs/direct-io.c |  8 ++--
>> fs/ext4/file.c |  8 +---
>> fs/gfs2/file.c |  9 +++--
>> fs/ntfs/file.c |  8 ++--
>> fs/udf/file.c  | 11 ++-
>> fs/xfs/xfs_file.c  |  8 +---
>> include/linux/fs.h |  8 +---
>> mm/filemap.c   | 30 --
>> 11 files changed, 40 insertions(+), 73 deletions(-)
>>
>> diff --git a/fs/block_dev.c b/fs/block_dev.c
>> index cc9d411..c529b1c 100644
>> --- a/fs/block_dev.c
>> +++ b/fs/block_dev.c
>> @@ -1568,18 +1568,12 @@ static long block_ioctl(struct file *file, unsigned 
>> cmd, unsigned long arg)
>>  */
>> ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
>> {
>> - struct file *file = iocb->ki_filp;
>>   struct blk_plug plug;
>>   ssize_t ret;
>>
>>   blk_start_plug(&plug);
>>   ret = __generic_file_write_iter(iocb, from);
>> - if (ret > 0) {
>> - ssize_t err;
>> - err = generic_write_sync(file, iocb->ki_pos - ret, ret);
>> - if (err < 0)
>> - ret = err;
>> - }
>> + ret = generic_write_sync(iocb, ret);
>>   blk_finish_plug(&plug);
>>   return ret;
>> }
>> diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
>> index a18ceab..4f4a6f7 100644
>> --- a/fs/btrfs/file.c
>> +++ b/fs/btrfs/file.c
>> @@ -1820,11 +1820,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb 
>> *iocb,
>>*/
>>   BTRFS_I(inode)->last_trans = root->fs_info->generation + 1;
>>   BTRFS_I(inode)->last_sub_trans = root->log_transid;
>> - if (num_written > 0) {
>> - err = generic_write_sync(file, pos, num_written);
>> - if (err < 0)
>> - num_written = err;
>> - }
>> +
>> + num_written = generic_write_sync(iocb, num_written);
>>
>>   if (sync)
>>   atomic_dec(&BTRFS_I(inode)->sync_writers);
>> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
>> index c485afa..32359de 100644
>> --- a/fs/cifs/file.c
>> +++ b/fs/cifs/file.c
>> @@ -2706,13 +2706,7 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
>>   rc = __generic_file_write_iter(iocb, from);
>>   mutex_unlock(&inode->i_mutex);
>>
>> - if (rc > 0) {
>> - ssize_t err;
>> -
>> - err = generic_write_sync(file, iocb->ki_pos - rc, rc);
>> - if (err < 0)
>> - rc = err;
>> - }
>> + rc = generic_write_sync(iocb, rc);
>>   } else {
>>   mutex_unlock(&inode->i_mutex);
>>   }
>> diff --git a/fs/direct-io.c b/fs/direct-io.c
>> index e181b6b..b72ac83 100644
>> --- a/fs/direct-io.c
>> +++ b/fs/direct-io.c
>> @@ -257,12 +257,8 @@ static ssize_t dio_complete(struct dio *dio, loff_t 
>> offset, ssize_t ret,
>>   inode_dio_done(dio->inode);
>>   if (is_async) {
>>   if (dio->rw & WRITE) {
>> - int err;
>> -
>> - err = generic_write_sync(dio->iocb->ki_filp, offset,
>> -  transferred);
>> - if (err < 0 && ret > 0)
>> - ret = err;
>> + 

[PATCH v6 6/7] fs: pass iocb to generic_write_sync

2014-11-10 Thread Milosz Tanski
From: Christoph Hellwig 

Clean up the generic_write_sync by just passing an iocb and a bytes
written / negative errno argument.  In addition to simplifying the
callers this also prepares for passing a per-operation O_DSYNC
flag.  Two callers didn't quite fit that scheme:

 - dio_complete didn't both to update ki_pos as we don't need it
   on a iocb that is about to be freed, so we had to add it. Additionally
   it also synced out written data in the error case, which has been
   changed to operate like the other callers.
 - gfs2 also used generic_write_sync to implement a crude version
   of fallocate.  It has been switched to use an open coded variant
   instead.

Signed-off-by: Christoph Hellwig 
[Small change in generic_write_sync() suggested by Anton Altaparmakov]
Signed-off-by: Milosz Tanski 
Acked-by: Steven Whitehouse 
Acked-by: Anton Altaparmakov 
Reviewed-by: Jan Kara 
---
 fs/block_dev.c |  8 +---
 fs/btrfs/file.c|  7 ++-
 fs/cifs/file.c |  8 +---
 fs/direct-io.c |  8 ++--
 fs/ext4/file.c |  8 +---
 fs/gfs2/file.c |  9 +++--
 fs/ntfs/file.c |  8 ++--
 fs/udf/file.c  | 11 ++-
 fs/xfs/xfs_file.c  |  8 +---
 include/linux/fs.h |  8 +---
 mm/filemap.c   | 31 +--
 11 files changed, 41 insertions(+), 73 deletions(-)

diff --git a/fs/block_dev.c b/fs/block_dev.c
index cc9d411..c529b1c 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1568,18 +1568,12 @@ static long block_ioctl(struct file *file, unsigned 
cmd, unsigned long arg)
  */
 ssize_t blkdev_write_iter(struct kiocb *iocb, struct iov_iter *from)
 {
-   struct file *file = iocb->ki_filp;
struct blk_plug plug;
ssize_t ret;
 
blk_start_plug(&plug);
ret = __generic_file_write_iter(iocb, from);
-   if (ret > 0) {
-   ssize_t err;
-   err = generic_write_sync(file, iocb->ki_pos - ret, ret);
-   if (err < 0)
-   ret = err;
-   }
+   ret = generic_write_sync(iocb, ret);
blk_finish_plug(&plug);
return ret;
 }
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index a18ceab..4f4a6f7 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1820,11 +1820,8 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
 */
BTRFS_I(inode)->last_trans = root->fs_info->generation + 1;
BTRFS_I(inode)->last_sub_trans = root->log_transid;
-   if (num_written > 0) {
-   err = generic_write_sync(file, pos, num_written);
-   if (err < 0)
-   num_written = err;
-   }
+
+   num_written = generic_write_sync(iocb, num_written);
 
if (sync)
atomic_dec(&BTRFS_I(inode)->sync_writers);
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index c485afa..32359de 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2706,13 +2706,7 @@ cifs_writev(struct kiocb *iocb, struct iov_iter *from)
rc = __generic_file_write_iter(iocb, from);
mutex_unlock(&inode->i_mutex);
 
-   if (rc > 0) {
-   ssize_t err;
-
-   err = generic_write_sync(file, iocb->ki_pos - rc, rc);
-   if (err < 0)
-   rc = err;
-   }
+   rc = generic_write_sync(iocb, rc);
} else {
mutex_unlock(&inode->i_mutex);
}
diff --git a/fs/direct-io.c b/fs/direct-io.c
index e181b6b..b72ac83 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -257,12 +257,8 @@ static ssize_t dio_complete(struct dio *dio, loff_t 
offset, ssize_t ret,
inode_dio_done(dio->inode);
if (is_async) {
if (dio->rw & WRITE) {
-   int err;
-
-   err = generic_write_sync(dio->iocb->ki_filp, offset,
-transferred);
-   if (err < 0 && ret > 0)
-   ret = err;
+   dio->iocb->ki_pos = offset + transferred;
+   ret = generic_write_sync(dio->iocb, ret);
}
 
aio_complete(dio->iocb, ret, 0);
diff --git a/fs/ext4/file.c b/fs/ext4/file.c
index aca7b24..79b000c 100644
--- a/fs/ext4/file.c
+++ b/fs/ext4/file.c
@@ -175,13 +175,7 @@ ext4_file_write_iter(struct kiocb *iocb, struct iov_iter 
*from)
ret = __generic_file_write_iter(iocb, from);
mutex_unlock(&inode->i_mutex);
 
-   if (ret > 0) {
-   ssize_t err;
-
-   err = generic_write_sync(file, iocb->ki_pos - ret, ret);
-   if (err < 0)
-   ret = err;
-   }
+   ret = generic_write_sync(iocb, ret);
if (o_direct)
blk_finish_plug(&plug