]> Git Repo - linux.git/commitdiff
Merge tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <[email protected]>
Sat, 12 Oct 2013 19:55:15 +0000 (12:55 -0700)
committerLinus Torvalds <[email protected]>
Sat, 12 Oct 2013 19:55:15 +0000 (12:55 -0700)
Pull ext4 bugfixes from Ted Ts'o:
 "A bug fix and performance regression fix for ext4"

* tag 'ext4_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
  ext4: fix memory leak in xattr
  ext4: fix performance regression in writeback of random writes

1  2 
fs/ext4/inode.c

diff --combined fs/ext4/inode.c
index 0d424d7ac02b0a30f98e713bb10403e90ced51b5,4cf2619f007cbf07e6cfff894a35a10b48e502b5..e274e9c1171f9095829aff07224dfff650a85ed2
@@@ -727,12 -727,8 +727,12 @@@ static int _ext4_get_block(struct inod
  
        ret = ext4_map_blocks(handle, inode, &map, flags);
        if (ret > 0) {
 +              ext4_io_end_t *io_end = ext4_inode_aio(inode);
 +
                map_bh(bh, inode->i_sb, map.m_pblk);
                bh->b_state = (bh->b_state & ~EXT4_MAP_FLAGS) | map.m_flags;
 +              if (io_end && io_end->flag & EXT4_IO_END_UNWRITTEN)
 +                      set_buffer_defer_completion(bh);
                bh->b_size = inode->i_sb->s_blocksize * map.m_len;
                ret = 0;
        }
@@@ -2563,7 -2559,7 +2563,7 @@@ retry
                        break;
        }
        blk_finish_plug(&plug);
-       if (!ret && !cycled) {
+       if (!ret && !cycled && wbc->nr_to_write > 0) {
                cycled = 1;
                mpd.last_page = writeback_index - 1;
                mpd.first_page = 0;
@@@ -3028,13 -3024,19 +3028,13 @@@ static int ext4_get_block_write_nolock(
  }
  
  static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset,
 -                          ssize_t size, void *private, int ret,
 -                          bool is_async)
 +                          ssize_t size, void *private)
  {
 -      struct inode *inode = file_inode(iocb->ki_filp);
          ext4_io_end_t *io_end = iocb->private;
  
        /* if not async direct IO just return */
 -      if (!io_end) {
 -              inode_dio_done(inode);
 -              if (is_async)
 -                      aio_complete(iocb, ret, 0);
 +      if (!io_end)
                return;
 -      }
  
        ext_debug("ext4_end_io_dio(): io_end 0x%p "
                  "for inode %lu, iocb 0x%p, offset %llu, size %zd\n",
        iocb->private = NULL;
        io_end->offset = offset;
        io_end->size = size;
 -      if (is_async) {
 -              io_end->iocb = iocb;
 -              io_end->result = ret;
 -      }
 -      ext4_put_io_end_defer(io_end);
 +      ext4_put_io_end(io_end);
  }
  
  /*
@@@ -3129,6 -3135,7 +3129,6 @@@ static ssize_t ext4_ext_direct_IO(int r
                        ret = -ENOMEM;
                        goto retake_lock;
                }
 -              io_end->flag |= EXT4_IO_END_DIRECT;
                /*
                 * Grab reference for DIO. Will be dropped in ext4_end_io_dio()
                 */
                if (ret <= 0 && ret != -EIOCBQUEUED && iocb->private) {
                        WARN_ON(iocb->private != io_end);
                        WARN_ON(io_end->flag & EXT4_IO_END_UNWRITTEN);
 -                      WARN_ON(io_end->iocb);
 -                      /*
 -                       * Generic code already did inode_dio_done() so we
 -                       * have to clear EXT4_IO_END_DIRECT to not do it for
 -                       * the second time.
 -                       */
 -                      io_end->flag = 0;
                        ext4_put_io_end(io_end);
                        iocb->private = NULL;
                }
@@@ -4587,6 -4601,7 +4587,6 @@@ int ext4_setattr(struct dentry *dentry
  
        if (attr->ia_valid & ATTR_SIZE && attr->ia_size != inode->i_size) {
                handle_t *handle;
 -              loff_t oldsize = inode->i_size;
  
                if (!(ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))) {
                        struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
                 * Truncate pagecache after we've waited for commit
                 * in data=journal mode to make pages freeable.
                 */
 -              truncate_pagecache(inode, oldsize, inode->i_size);
 +                      truncate_pagecache(inode, inode->i_size);
        }
        /*
         * We want to call ext4_truncate() even if attr->ia_size ==
This page took 0.083854 seconds and 4 git commands to generate.