]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ocfs2:btrfs: aio-dio-loop changes broke setrlimit behavior [orabug 14207636]
authorDave Kleikamp <dave.kleikamp@oracle.com>
Wed, 20 Jun 2012 21:05:59 +0000 (16:05 -0500)
committerDave Kleikamp <dave.kleikamp@oracle.com>
Wed, 20 Jun 2012 21:05:59 +0000 (16:05 -0500)
The aio-dio changes for the loop device driver broke ocfs2 and btrfs's
handling of rlimit. generic_write_checks() adjusts the IO byte count to
account for the rlimit, but the updated count was not being reflected in
the iov_iter data structure.

Signed-off-by: Dave Kleikamp <dave.kleikamp@oracle.com>
fs/btrfs/file.c
fs/ocfs2/file.c
mm/iov-iter.c

index 0afdb8f81a2092e8fdd3a2905a2d054e98086028..a458d1397e28f1c0856b300ec69cd7ac97405281 100644 (file)
@@ -1338,13 +1338,13 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
        u64 start_pos;
        ssize_t num_written = 0;
        ssize_t err = 0;
-       size_t count;
+       size_t count, ocount;
 
        vfs_check_frozen(inode->i_sb, SB_FREEZE_WRITE);
 
        mutex_lock(&inode->i_mutex);
 
-       count = iov_iter_count(iter);
+       ocount = count = iov_iter_count(iter);
 
        current->backing_dev_info = inode->i_mapping->backing_dev_info;
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
@@ -1396,6 +1396,9 @@ static ssize_t btrfs_file_write_iter(struct kiocb *iocb,
                num_written = __btrfs_direct_write(iocb, iter, pos, ppos,
                                                   count);
        } else {
+               if (count != ocount)
+                       iov_iter_shorten(iter, count);
+
                num_written = __btrfs_buffered_write(file, iter, pos);
                if (num_written > 0)
                        *ppos = pos + num_written;
index 87bcf38dfa213e5286471adbadbc3305d66d2b89..2df0c6392348cc8f7954afefade594ce914d5a2a 100644 (file)
@@ -2223,7 +2223,7 @@ static ssize_t ocfs2_file_write_iter(struct kiocb *iocb,
        int ret, direct_io, appending, rw_level, have_alloc_sem  = 0;
        int can_do_direct, has_refcount = 0;
        ssize_t written = 0;
-       size_t count;           /* after file limit checks */
+       size_t count, ocount;
        loff_t old_size, *ppos = &iocb->ki_pos;
        u32 old_clusters;
        struct file *file = iocb->ki_filp;
@@ -2352,7 +2352,7 @@ relock:
        ocfs2_iocb_set_rw_locked(iocb, rw_level);
 
 
-       count = iov_iter_count(iter);
+       ocount = count = iov_iter_count(iter);
        ret = generic_write_checks(file, ppos, &count,
                                   S_ISBLK(inode->i_mode));
        if (ret)
@@ -2366,6 +2366,9 @@ relock:
                        goto out_dio;
                }
        } else {
+               if (count != ocount)
+                       iov_iter_shorten(iter, count);
+
                current->backing_dev_info = file->f_mapping->backing_dev_info;
                written = generic_file_buffered_write_iter(iocb, iter, *ppos,
                                                           ppos, 0);
index 5a0b94951d87869180dce5e912d9ac480180cd03..5006cdbfb5dc38af2f926df5409a030f113cdf96 100644 (file)
@@ -358,6 +358,7 @@ static int ii_iovec_shorten(struct iov_iter *i, size_t count)
 {
        struct iovec *iov = (struct iovec *)i->data;
        i->nr_segs = iov_shorten(iov, i->nr_segs, count);
+       i->count = count;
        return 0;
 }