aboutsummaryrefslogtreecommitdiffstats
path: root/fs/read_write.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-03-20 13:04:20 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2013-04-09 14:12:56 -0400
commit03d95eb2f2578083a3f6286262e1cb5d88a00c02 (patch)
treea82585b55080628e0ba0028dfb100886bf5b4099 /fs/read_write.c
parent72ec35163f9f728ba1579fd80682e51e933dfa8a (diff)
lift sb_start_write() out of ->write()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/read_write.c')
-rw-r--r--fs/read_write.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/fs/read_write.c b/fs/read_write.c
index e6dd1c2d0592..a1f4d44cbc03 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -398,7 +398,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
398 struct kiocb kiocb; 398 struct kiocb kiocb;
399 ssize_t ret; 399 ssize_t ret;
400 400
401 file_start_write(filp);
402 init_sync_kiocb(&kiocb, filp); 401 init_sync_kiocb(&kiocb, filp);
403 kiocb.ki_pos = *ppos; 402 kiocb.ki_pos = *ppos;
404 kiocb.ki_left = len; 403 kiocb.ki_left = len;
@@ -414,7 +413,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
414 if (-EIOCBQUEUED == ret) 413 if (-EIOCBQUEUED == ret)
415 ret = wait_on_sync_kiocb(&kiocb); 414 ret = wait_on_sync_kiocb(&kiocb);
416 *ppos = kiocb.ki_pos; 415 *ppos = kiocb.ki_pos;
417 file_end_write(filp);
418 return ret; 416 return ret;
419} 417}
420 418
@@ -458,6 +456,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
458 ret = rw_verify_area(WRITE, file, pos, count); 456 ret = rw_verify_area(WRITE, file, pos, count);
459 if (ret >= 0) { 457 if (ret >= 0) {
460 count = ret; 458 count = ret;
459 file_start_write(file);
461 if (file->f_op->write) 460 if (file->f_op->write)
462 ret = file->f_op->write(file, buf, count, pos); 461 ret = file->f_op->write(file, buf, count, pos);
463 else 462 else
@@ -467,6 +466,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
467 add_wchar(current, ret); 466 add_wchar(current, ret);
468 } 467 }
469 inc_syscw(current); 468 inc_syscw(current);
469 file_end_write(file);
470 } 470 }
471 471
472 return ret; 472 return ret;
@@ -758,16 +758,18 @@ static ssize_t do_readv_writev(int type, struct file *file,
758 } else { 758 } else {
759 fn = (io_fn_t)file->f_op->write; 759 fn = (io_fn_t)file->f_op->write;
760 fnv = file->f_op->aio_write; 760 fnv = file->f_op->aio_write;
761 file_start_write(file);
761 } 762 }
762 763
763 if (fnv) { 764 if (fnv)
764 file_start_write(file);
765 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, 765 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
766 pos, fnv); 766 pos, fnv);
767 file_end_write(file); 767 else
768 } else
769 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); 768 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
770 769
770 if (type != READ)
771 file_end_write(file);
772
771out: 773out:
772 if (iov != iovstack) 774 if (iov != iovstack)
773 kfree(iov); 775 kfree(iov);
@@ -936,16 +938,18 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
936 } else { 938 } else {
937 fn = (io_fn_t)file->f_op->write; 939 fn = (io_fn_t)file->f_op->write;
938 fnv = file->f_op->aio_write; 940 fnv = file->f_op->aio_write;
941 file_start_write(file);
939 } 942 }
940 943
941 if (fnv) { 944 if (fnv)
942 file_start_write(file);
943 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len, 945 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
944 pos, fnv); 946 pos, fnv);
945 file_end_write(file); 947 else
946 } else
947 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); 948 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
948 949
950 if (type != READ)
951 file_end_write(file);
952
949out: 953out:
950 if (iov != iovstack) 954 if (iov != iovstack)
951 kfree(iov); 955 kfree(iov);