lift sb_start_write/sb_end_write out of ->aio_write()
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 20 Mar 2013 01:01:03 +0000 (21:01 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 9 Apr 2013 18:12:55 +0000 (14:12 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/aio.c
fs/btrfs/file.c
fs/cifs/file.c
fs/compat.c
fs/fuse/file.c
fs/ntfs/file.c
fs/ocfs2/file.c
fs/read_write.c
fs/xfs/xfs_file.c
include/linux/fs.h
mm/filemap.c

index 3f941f2..4ec28f1 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1324,6 +1324,8 @@ static ssize_t aio_rw_vect_retry(struct kiocb *iocb)
        if (iocb->ki_pos < 0)
                return -EINVAL;
 
+       if (opcode == IOCB_CMD_PWRITEV)
+               file_start_write(file);
        do {
                ret = rw_op(iocb, &iocb->ki_iovec[iocb->ki_cur_seg],
                            iocb->ki_nr_segs - iocb->ki_cur_seg,
@@ -1336,6 +1338,8 @@ static ssize_t aio_rw_vect_retry(struct kiocb *iocb)
        } while (ret > 0 && iocb->ki_left > 0 &&
                 (opcode == IOCB_CMD_PWRITEV ||
                  (!S_ISFIFO(inode->i_mode) && !S_ISSOCK(inode->i_mode))));
+       if (opcode == IOCB_CMD_PWRITEV)
+               file_end_write(file);
 
        /* This means we must have transferred all that we could */
        /* No need to retry anymore */
index 5b4ea5f..254aeb7 100644 (file)
@@ -1514,8 +1514,6 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
        size_t count, ocount;
        bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host);
 
-       sb_start_write(inode->i_sb);
-
        mutex_lock(&inode->i_mutex);
 
        err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
@@ -1617,7 +1615,6 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
        if (sync)
                atomic_dec(&BTRFS_I(inode)->sync_writers);
 out:
-       sb_end_write(inode->i_sb);
        current->backing_dev_info = NULL;
        return num_written ? num_written : err;
 }
index 7a0dd99..2d4a231 100644 (file)
@@ -2520,8 +2520,6 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov,
 
        BUG_ON(iocb->ki_pos != pos);
 
-       sb_start_write(inode->i_sb);
-
        /*
         * We need to hold the sem to be sure nobody modifies lock list
         * with a brlock that prevents writing.
@@ -2545,7 +2543,6 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov,
        }
 
        up_read(&cinode->lock_sem);
-       sb_end_write(inode->i_sb);
        return rc;
 }
 
index d487985..daa3b77 100644 (file)
@@ -1103,10 +1103,12 @@ static ssize_t compat_do_readv_writev(int type, struct file *file,
                fnv = file->f_op->aio_write;
        }
 
-       if (fnv)
+       if (fnv) {
+               file_start_write(file);
                ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
                                                pos, fnv);
-       else
+               file_end_write(file);
+       } else
                ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 
 out:
index 34b80ba..d15c6f2 100644 (file)
@@ -971,7 +971,6 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
                return err;
 
        count = ocount;
-       sb_start_write(inode->i_sb);
        mutex_lock(&inode->i_mutex);
 
        /* We can write back this queue in page reclaim */
@@ -1030,7 +1029,6 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
 out:
        current->backing_dev_info = NULL;
        mutex_unlock(&inode->i_mutex);
-       sb_end_write(inode->i_sb);
 
        return written ? written : err;
 }
index 5b2d4f0..1da4b81 100644 (file)
@@ -2129,7 +2129,6 @@ static ssize_t ntfs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
 
        BUG_ON(iocb->ki_pos != pos);
 
-       sb_start_write(inode->i_sb);
        mutex_lock(&inode->i_mutex);
        ret = ntfs_file_aio_write_nolock(iocb, iov, nr_segs, &iocb->ki_pos);
        mutex_unlock(&inode->i_mutex);
@@ -2138,7 +2137,6 @@ static ssize_t ntfs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
                if (err < 0)
                        ret = err;
        }
-       sb_end_write(inode->i_sb);
        return ret;
 }
 
index 6474cb4..1c93e77 100644 (file)
@@ -2248,8 +2248,6 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
        if (iocb->ki_left == 0)
                return 0;
 
-       sb_start_write(inode->i_sb);
-
        appending = file->f_flags & O_APPEND ? 1 : 0;
        direct_io = file->f_flags & O_DIRECT ? 1 : 0;
 
@@ -2423,7 +2421,6 @@ out_sems:
                ocfs2_iocb_clear_sem_locked(iocb);
 
        mutex_unlock(&inode->i_mutex);
-       sb_end_write(inode->i_sb);
 
        if (written)
                ret = written;
index f7b5a23..3e1791a 100644 (file)
@@ -398,6 +398,7 @@ 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;
@@ -413,6 +414,7 @@ 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;
 }
 
@@ -758,10 +760,12 @@ static ssize_t do_readv_writev(int type, struct file *file,
                fnv = file->f_op->aio_write;
        }
 
-       if (fnv)
+       if (fnv) {
+               file_start_write(file);
                ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
                                                pos, fnv);
-       else
+               file_end_write(file);
+       } else
                ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
 
 out:
index f03bf1a..3800128 100644 (file)
@@ -775,8 +775,6 @@ xfs_file_aio_write(
        if (ocount == 0)
                return 0;
 
-       sb_start_write(inode->i_sb);
-
        if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
                ret = -EIO;
                goto out;
@@ -800,7 +798,6 @@ xfs_file_aio_write(
        }
 
 out:
-       sb_end_write(inode->i_sb);
        return ret;
 }
 
index 2c28271..578a66e 100644 (file)
@@ -2223,6 +2223,20 @@ static inline struct inode *file_inode(struct file *f)
        return f->f_inode;
 }
 
+static inline void file_start_write(struct file *file)
+{
+       if (!S_ISREG(file_inode(file)->i_mode))
+               return;
+       __sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true);
+}
+
+static inline void file_end_write(struct file *file)
+{
+       if (!S_ISREG(file_inode(file)->i_mode))
+               return;
+       __sb_end_write(file_inode(file)->i_sb, SB_FREEZE_WRITE);
+}
+
 /*
  * get_write_access() gets write permission for a file.
  * put_write_access() releases this write permission.
index e1979fd..cbde884 100644 (file)
@@ -2528,7 +2528,6 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
 
        BUG_ON(iocb->ki_pos != pos);
 
-       sb_start_write(inode->i_sb);
        mutex_lock(&inode->i_mutex);
        ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos);
        mutex_unlock(&inode->i_mutex);
@@ -2540,7 +2539,6 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
                if (err < 0 && ret > 0)
                        ret = err;
        }
-       sb_end_write(inode->i_sb);
        return ret;
 }
 EXPORT_SYMBOL(generic_file_aio_write);