]> Pileus Git - ~andy/linux/blobdiff - fs/read_write.c
lift sb_start_write() out of ->write()
[~andy/linux] / fs / read_write.c
index e6dd1c2d05920a86469030c7878413ef0fff2fc0..a1f4d44cbc03e4ab9e64bcc4f035d8702a8104c6 100644 (file)
@@ -398,7 +398,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
        struct kiocb kiocb;
        ssize_t ret;
 
-       file_start_write(filp);
        init_sync_kiocb(&kiocb, filp);
        kiocb.ki_pos = *ppos;
        kiocb.ki_left = len;
@@ -414,7 +413,6 @@ ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, lof
        if (-EIOCBQUEUED == ret)
                ret = wait_on_sync_kiocb(&kiocb);
        *ppos = kiocb.ki_pos;
-       file_end_write(filp);
        return ret;
 }
 
@@ -458,6 +456,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
        ret = rw_verify_area(WRITE, file, pos, count);
        if (ret >= 0) {
                count = ret;
+               file_start_write(file);
                if (file->f_op->write)
                        ret = file->f_op->write(file, buf, count, pos);
                else
@@ -467,6 +466,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
                        add_wchar(current, ret);
                }
                inc_syscw(current);
+               file_end_write(file);
        }
 
        return ret;
@@ -758,16 +758,18 @@ static ssize_t do_readv_writev(int type, struct file *file,
        } else {
                fn = (io_fn_t)file->f_op->write;
                fnv = file->f_op->aio_write;
+               file_start_write(file);
        }
 
-       if (fnv) {
-               file_start_write(file);
+       if (fnv)
                ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
                                                pos, fnv);
-               file_end_write(file);
-       } else
+       else
                ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 
+       if (type != READ)
+               file_end_write(file);
+
 out:
        if (iov != iovstack)
                kfree(iov);
@@ -936,16 +938,18 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
        } else {
                fn = (io_fn_t)file->f_op->write;
                fnv = file->f_op->aio_write;
+               file_start_write(file);
        }
 
-       if (fnv) {
-               file_start_write(file);
+       if (fnv)
                ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
                                                pos, fnv);
-               file_end_write(file);
-       } else
+       else
                ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 
+       if (type != READ)
+               file_end_write(file);
+
 out:
        if (iov != iovstack)
                kfree(iov);