]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/commitdiff
Merge tag 'writeback' of git://git.kernel.org/pub/scm/linux/kernel/git/wfg/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 28 May 2012 16:54:45 +0000 (09:54 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 28 May 2012 16:54:45 +0000 (09:54 -0700)
Pull writeback tree from Wu Fengguang:
 "Mainly from Jan Kara to avoid iput() in the flusher threads."

* tag 'writeback' of git://git.kernel.org/pub/scm/linux/kernel/git/wfg/linux:
  writeback: Avoid iput() from flusher thread
  vfs: Rename end_writeback() to clear_inode()
  vfs: Move waiting for inode writeback from end_writeback() to evict_inode()
  writeback: Refactor writeback_single_inode()
  writeback: Remove wb->list_lock from writeback_single_inode()
  writeback: Separate inode requeueing after writeback
  writeback: Move I_DIRTY_PAGES handling
  writeback: Move requeueing when I_SYNC set to writeback_sb_inodes()
  writeback: Move clearing of I_SYNC into inode_sync_complete()
  writeback: initialize global_dirty_limit
  fs: remove 8 bytes of padding from struct writeback_control on 64 bit builds
  mm: page-writeback.c: local functions should not be exposed globally

17 files changed:
1  2 
fs/autofs4/inode.c
fs/block_dev.c
fs/btrfs/inode.c
fs/cifs/cifsfs.c
fs/ext2/inode.c
fs/ext3/inode.c
fs/ext4/super.c
fs/fuse/inode.c
fs/hugetlbfs/inode.c
fs/inode.c
fs/proc/inode.c
fs/sysfs/inode.c
fs/ubifs/super.c
fs/xfs/xfs_super.c
include/linux/fs.h
ipc/mqueue.c
mm/shmem.c

diff --combined fs/autofs4/inode.c
index 6e488ebe7784458623139c91ebd42fbba0752074,df31ddb5822858896cf2f2ff51c48ad5be7395f8..8a4fed8ead30a5a051fded49a2cbfd07a1ff9630
@@@ -19,6 -19,7 +19,6 @@@
  #include <linux/parser.h>
  #include <linux/bitops.h>
  #include <linux/magic.h>
 -#include <linux/compat.h>
  #include "autofs_i.h"
  #include <linux/module.h>
  
@@@ -100,7 -101,7 +100,7 @@@ static int autofs4_show_options(struct 
  
  static void autofs4_evict_inode(struct inode *inode)
  {
-       end_writeback(inode);
+       clear_inode(inode);
        kfree(inode->i_private);
  }
  
@@@ -224,6 -225,7 +224,6 @@@ int autofs4_fill_super(struct super_blo
        set_autofs_type_indirect(&sbi->type);
        sbi->min_proto = 0;
        sbi->max_proto = 0;
 -      sbi->compat_daemon = is_compat_task();
        mutex_init(&sbi->wq_mutex);
        mutex_init(&sbi->pipe_mutex);
        spin_lock_init(&sbi->fs_lock);
                printk("autofs: could not open pipe file descriptor\n");
                goto fail_dput;
        }
 -      if (!pipe->f_op || !pipe->f_op->write)
 +      if (autofs_prepare_pipe(pipe) < 0)
                goto fail_fput;
        sbi->pipe = pipe;
        sbi->pipefd = pipefd;
diff --combined fs/block_dev.c
index ba11c30f302dd37012d361a14c96db7c8ca22d0f,d8a7959a96546ceada3165ca811270639c781b88..c2bbe1fb132632c14ebb2ea0675ad78500441a52
@@@ -70,7 -70,7 +70,7 @@@ static void bdev_inode_switch_bdi(struc
        spin_unlock(&dst->wb.list_lock);
  }
  
 -static sector_t max_block(struct block_device *bdev)
 +sector_t blkdev_max_block(struct block_device *bdev)
  {
        sector_t retval = ~((sector_t)0);
        loff_t sz = i_size_read(bdev->bd_inode);
@@@ -163,7 -163,7 +163,7 @@@ static in
  blkdev_get_block(struct inode *inode, sector_t iblock,
                struct buffer_head *bh, int create)
  {
 -      if (iblock >= max_block(I_BDEV(inode))) {
 +      if (iblock >= blkdev_max_block(I_BDEV(inode))) {
                if (create)
                        return -EIO;
  
@@@ -185,7 -185,7 +185,7 @@@ static in
  blkdev_get_blocks(struct inode *inode, sector_t iblock,
                struct buffer_head *bh, int create)
  {
 -      sector_t end_block = max_block(I_BDEV(inode));
 +      sector_t end_block = blkdev_max_block(I_BDEV(inode));
        unsigned long max_blocks = bh->b_size >> inode->i_blkbits;
  
        if ((iblock + max_blocks) > end_block) {
@@@ -487,7 -487,7 +487,7 @@@ static void bdev_evict_inode(struct ino
        struct list_head *p;
        truncate_inode_pages(&inode->i_data, 0);
        invalidate_inode_buffers(inode); /* is it needed here? */
-       end_writeback(inode);
+       clear_inode(inode);
        spin_lock(&bdev_lock);
        while ( (p = bdev->bd_inodes.next) != &bdev->bd_inodes ) {
                __bd_forget(list_entry(p, struct inode, i_devices));
diff --combined fs/btrfs/inode.c
index 61b16c641ce0975fcbd302fc6156820233c15c93,5c058c4d3283e9c1f97876a560483f8be3568db7..ceb7b9c9edcc1436693178fd6d2ff62f2334ada7
@@@ -1947,7 -1947,7 +1947,7 @@@ static int btrfs_writepage_end_io_hook(
   * extent_io.c will try to find good copies for us.
   */
  static int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end,
 -                             struct extent_state *state)
 +                             struct extent_state *state, int mirror)
  {
        size_t offset = start - ((u64)page->index << PAGE_CACHE_SHIFT);
        struct inode *inode = page->mapping->host;
@@@ -3756,7 -3756,7 +3756,7 @@@ void btrfs_evict_inode(struct inode *in
        btrfs_end_transaction(trans, root);
        btrfs_btree_balance_dirty(root, nr);
  no_delete:
-       end_writeback(inode);
+       clear_inode(inode);
        return;
  }
  
@@@ -4069,7 -4069,7 +4069,7 @@@ static struct inode *new_simple_dir(str
        BTRFS_I(inode)->dummy_inode = 1;
  
        inode->i_ino = BTRFS_EMPTY_SUBVOL_DIR_OBJECTID;
 -      inode->i_op = &simple_dir_inode_operations;
 +      inode->i_op = &btrfs_dir_ro_inode_operations;
        inode->i_fop = &simple_dir_operations;
        inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO;
        inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
@@@ -4140,18 -4140,14 +4140,18 @@@ struct inode *btrfs_lookup_dentry(struc
  static int btrfs_dentry_delete(const struct dentry *dentry)
  {
        struct btrfs_root *root;
 +      struct inode *inode = dentry->d_inode;
  
 -      if (!dentry->d_inode && !IS_ROOT(dentry))
 -              dentry = dentry->d_parent;
 +      if (!inode && !IS_ROOT(dentry))
 +              inode = dentry->d_parent->d_inode;
  
 -      if (dentry->d_inode) {
 -              root = BTRFS_I(dentry->d_inode)->root;
 +      if (inode) {
 +              root = BTRFS_I(inode)->root;
                if (btrfs_root_refs(&root->root_item) == 0)
                        return 1;
 +
 +              if (btrfs_ino(inode) == BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)
 +                      return 1;
        }
        return 0;
  }
@@@ -4192,6 -4188,7 +4192,6 @@@ static int btrfs_real_readdir(struct fi
        struct btrfs_path *path;
        struct list_head ins_list;
        struct list_head del_list;
 -      struct qstr q;
        int ret;
        struct extent_buffer *leaf;
        int slot;
  
                while (di_cur < di_total) {
                        struct btrfs_key location;
 -                      struct dentry *tmp;
  
                        if (verify_dir_item(root, leaf, di))
                                break;
                        d_type = btrfs_filetype_table[btrfs_dir_type(leaf, di)];
                        btrfs_dir_item_key_to_cpu(leaf, di, &location);
  
 -                      q.name = name_ptr;
 -                      q.len = name_len;
 -                      q.hash = full_name_hash(q.name, q.len);
 -                      tmp = d_lookup(filp->f_dentry, &q);
 -                      if (!tmp) {
 -                              struct btrfs_key *newkey;
 -
 -                              newkey = kzalloc(sizeof(struct btrfs_key),
 -                                               GFP_NOFS);
 -                              if (!newkey)
 -                                      goto no_dentry;
 -                              tmp = d_alloc(filp->f_dentry, &q);
 -                              if (!tmp) {
 -                                      kfree(newkey);
 -                                      dput(tmp);
 -                                      goto no_dentry;
 -                              }
 -                              memcpy(newkey, &location,
 -                                     sizeof(struct btrfs_key));
 -                              tmp->d_fsdata = newkey;
 -                              tmp->d_flags |= DCACHE_NEED_LOOKUP;
 -                              d_rehash(tmp);
 -                              dput(tmp);
 -                      } else {
 -                              dput(tmp);
 -                      }
 -no_dentry:
 +
                        /* is this a reference to our own snapshot? If so
 -                       * skip it
 +                       * skip it.
 +                       *
 +                       * In contrast to old kernels, we insert the snapshot's
 +                       * dir item and dir index after it has been created, so
 +                       * we won't find a reference to our own snapshot. We
 +                       * still keep the following code for backward
 +                       * compatibility.
                         */
                        if (location.type == BTRFS_ROOT_ITEM_KEY &&
                            location.objectid == root->root_key.objectid) {
diff --combined fs/cifs/cifsfs.c
index 541ef81f6ae8ffe99ebcfa9c303f9c15975dd8c7,acb138f0eba09c754c6e8fd76fa36269ed24687b..0a0fa0250e99857481bb87d8c13d50a23fcba15d
@@@ -272,7 -272,7 +272,7 @@@ static voi
  cifs_evict_inode(struct inode *inode)
  {
        truncate_inode_pages(&inode->i_data, 0);
-       end_writeback(inode);
+       clear_inode(inode);
        cifs_fscache_release_inode_cookie(inode);
  }
  
@@@ -370,13 -370,13 +370,13 @@@ cifs_show_options(struct seq_file *s, s
                                   (int)(srcaddr->sa_family));
        }
  
 -      seq_printf(s, ",uid=%d", cifs_sb->mnt_uid);
 +      seq_printf(s, ",uid=%u", cifs_sb->mnt_uid);
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_UID)
                seq_printf(s, ",forceuid");
        else
                seq_printf(s, ",noforceuid");
  
 -      seq_printf(s, ",gid=%d", cifs_sb->mnt_gid);
 +      seq_printf(s, ",gid=%u", cifs_sb->mnt_gid);
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_OVERR_GID)
                seq_printf(s, ",forcegid");
        else
                seq_printf(s, ",noperm");
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO)
                seq_printf(s, ",strictcache");
 +      if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPUID)
 +              seq_printf(s, ",backupuid=%u", cifs_sb->mnt_backupuid);
 +      if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_BACKUPGID)
 +              seq_printf(s, ",backupgid=%u", cifs_sb->mnt_backupgid);
  
 -      seq_printf(s, ",rsize=%d", cifs_sb->rsize);
 -      seq_printf(s, ",wsize=%d", cifs_sb->wsize);
 +      seq_printf(s, ",rsize=%u", cifs_sb->rsize);
 +      seq_printf(s, ",wsize=%u", cifs_sb->wsize);
        /* convert actimeo and display it in seconds */
 -              seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
 +      seq_printf(s, ",actimeo=%lu", cifs_sb->actimeo / HZ);
  
        return 0;
  }
@@@ -699,7 -695,7 +699,7 @@@ static loff_t cifs_llseek(struct file *
         * origin == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate
         * the cached file length
         */
 -      if (origin != SEEK_SET || origin != SEEK_CUR) {
 +      if (origin != SEEK_SET && origin != SEEK_CUR) {
                int rc;
                struct inode *inode = file->f_path.dentry->d_inode;
  
diff --combined fs/ext2/inode.c
index f9fa95f8443d79275b5cdbf73dda982f40b4b11d,37b8bf606f4555ee30faf712cad39035eb021855..264d315f6c4753d6bee17f28ea86c6497b560449
@@@ -90,7 -90,7 +90,7 @@@ void ext2_evict_inode(struct inode * in
        }
  
        invalidate_inode_buffers(inode);
-       end_writeback(inode);
+       clear_inode(inode);
  
        ext2_discard_reservation(inode);
        rsv = EXT2_I(inode)->i_block_alloc_info;
@@@ -1293,8 -1293,6 +1293,8 @@@ struct inode *ext2_iget (struct super_b
        struct inode *inode;
        long ret = -EIO;
        int n;
 +      uid_t i_uid;
 +      gid_t i_gid;
  
        inode = iget_locked(sb, ino);
        if (!inode)
        }
  
        inode->i_mode = le16_to_cpu(raw_inode->i_mode);
 -      inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
 -      inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
 +      i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
 +      i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
        if (!(test_opt (inode->i_sb, NO_UID32))) {
 -              inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
 -              inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
 +              i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
 +              i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
        }
 +      i_uid_write(inode, i_uid);
 +      i_gid_write(inode, i_gid);
        set_nlink(inode, le16_to_cpu(raw_inode->i_links_count));
        inode->i_size = le32_to_cpu(raw_inode->i_size);
        inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
@@@ -1417,8 -1413,8 +1417,8 @@@ static int __ext2_write_inode(struct in
        struct ext2_inode_info *ei = EXT2_I(inode);
        struct super_block *sb = inode->i_sb;
        ino_t ino = inode->i_ino;
 -      uid_t uid = inode->i_uid;
 -      gid_t gid = inode->i_gid;
 +      uid_t uid = i_uid_read(inode);
 +      gid_t gid = i_gid_read(inode);
        struct buffer_head * bh;
        struct ext2_inode * raw_inode = ext2_get_inode(sb, ino, &bh);
        int n;
@@@ -1533,8 -1529,8 +1533,8 @@@ int ext2_setattr(struct dentry *dentry
  
        if (is_quota_modification(inode, iattr))
                dquot_initialize(inode);
 -      if ((iattr->ia_valid & ATTR_UID && iattr->ia_uid != inode->i_uid) ||
 -          (iattr->ia_valid & ATTR_GID && iattr->ia_gid != inode->i_gid)) {
 +      if ((iattr->ia_valid & ATTR_UID && !uid_eq(iattr->ia_uid, inode->i_uid)) ||
 +          (iattr->ia_valid & ATTR_GID && !gid_eq(iattr->ia_gid, inode->i_gid))) {
                error = dquot_transfer(inode, iattr);
                if (error)
                        return error;
diff --combined fs/ext3/inode.c
index a09790a412b1a1e2313410eba141971992c866fe,ca5eb6189ee927d9beafb9044c5a62a7841704ec..9a4a5c48b1c99f6a60ff02d35cda4ef1ced9bd50
@@@ -272,18 -272,18 +272,18 @@@ void ext3_evict_inode (struct inode *in
        if (ext3_mark_inode_dirty(handle, inode)) {
                /* If that failed, just dquot_drop() and be done with that */
                dquot_drop(inode);
-               end_writeback(inode);
+               clear_inode(inode);
        } else {
                ext3_xattr_delete_inode(handle, inode);
                dquot_free_inode(inode);
                dquot_drop(inode);
-               end_writeback(inode);
+               clear_inode(inode);
                ext3_free_inode(handle, inode);
        }
        ext3_journal_stop(handle);
        return;
  no_delete:
-       end_writeback(inode);
+       clear_inode(inode);
        dquot_drop(inode);
  }
  
@@@ -2891,8 -2891,6 +2891,8 @@@ struct inode *ext3_iget(struct super_bl
        transaction_t *transaction;
        long ret;
        int block;
 +      uid_t i_uid;
 +      gid_t i_gid;
  
        inode = iget_locked(sb, ino);
        if (!inode)
        bh = iloc.bh;
        raw_inode = ext3_raw_inode(&iloc);
        inode->i_mode = le16_to_cpu(raw_inode->i_mode);
 -      inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
 -      inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
 +      i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low);
 +      i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low);
        if(!(test_opt (inode->i_sb, NO_UID32))) {
 -              inode->i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
 -              inode->i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
 +              i_uid |= le16_to_cpu(raw_inode->i_uid_high) << 16;
 +              i_gid |= le16_to_cpu(raw_inode->i_gid_high) << 16;
        }
 +      i_uid_write(inode, i_uid);
 +      i_gid_write(inode, i_gid);
        set_nlink(inode, le16_to_cpu(raw_inode->i_links_count));
        inode->i_size = le32_to_cpu(raw_inode->i_size);
        inode->i_atime.tv_sec = (signed)le32_to_cpu(raw_inode->i_atime);
@@@ -3072,8 -3068,6 +3072,8 @@@ static int ext3_do_update_inode(handle_
        struct ext3_inode_info *ei = EXT3_I(inode);
        struct buffer_head *bh = iloc->bh;
        int err = 0, rc, block;
 +      uid_t i_uid;
 +      gid_t i_gid;
  
  again:
        /* we can't allow multiple procs in here at once, its a bit racey */
  
        ext3_get_inode_flags(ei);
        raw_inode->i_mode = cpu_to_le16(inode->i_mode);
 +      i_uid = i_uid_read(inode);
 +      i_gid = i_gid_read(inode);
        if(!(test_opt(inode->i_sb, NO_UID32))) {
 -              raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid));
 -              raw_inode->i_gid_low = cpu_to_le16(low_16_bits(inode->i_gid));
 +              raw_inode->i_uid_low = cpu_to_le16(low_16_bits(i_uid));
 +              raw_inode->i_gid_low = cpu_to_le16(low_16_bits(i_gid));
  /*
   * Fix up interoperability with old kernels. Otherwise, old inodes get
   * re-used with the upper 16 bits of the uid/gid intact
   */
                if(!ei->i_dtime) {
                        raw_inode->i_uid_high =
 -                              cpu_to_le16(high_16_bits(inode->i_uid));
 +                              cpu_to_le16(high_16_bits(i_uid));
                        raw_inode->i_gid_high =
 -                              cpu_to_le16(high_16_bits(inode->i_gid));
 +                              cpu_to_le16(high_16_bits(i_gid));
                } else {
                        raw_inode->i_uid_high = 0;
                        raw_inode->i_gid_high = 0;
                }
        } else {
                raw_inode->i_uid_low =
 -                      cpu_to_le16(fs_high2lowuid(inode->i_uid));
 +                      cpu_to_le16(fs_high2lowuid(i_uid));
                raw_inode->i_gid_low =
 -                      cpu_to_le16(fs_high2lowgid(inode->i_gid));
 +                      cpu_to_le16(fs_high2lowgid(i_gid));
                raw_inode->i_uid_high = 0;
                raw_inode->i_gid_high = 0;
        }
@@@ -3270,8 -3262,8 +3270,8 @@@ int ext3_setattr(struct dentry *dentry
  
        if (is_quota_modification(inode, attr))
                dquot_initialize(inode);
 -      if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
 -              (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid)) {
 +      if ((ia_valid & ATTR_UID && !uid_eq(attr->ia_uid, inode->i_uid)) ||
 +          (ia_valid & ATTR_GID && !gid_eq(attr->ia_gid, inode->i_gid))) {
                handle_t *handle;
  
                /* (user+group)*(old+new) structure, inode write (sb,
diff --combined fs/ext4/super.c
index 1867a98e0c4979ac2be4c44f16ced9226507d0be,2484f560483a9ee5d95bec4918c895a0eb622101..35b5954489eeb88c6c5a29fd76fced5c3472e6f5
@@@ -1007,7 -1007,7 +1007,7 @@@ static void destroy_inodecache(void
  void ext4_clear_inode(struct inode *inode)
  {
        invalidate_inode_buffers(inode);
-       end_writeback(inode);
+       clear_inode(inode);
        dquot_drop(inode);
        ext4_discard_preallocations(inode);
        if (EXT4_I(inode)->jinode) {
@@@ -1305,20 -1305,20 +1305,20 @@@ static int set_qf_name(struct super_blo
                ext4_msg(sb, KERN_ERR,
                        "Cannot change journaled "
                        "quota options when quota turned on");
 -              return 0;
 +              return -1;
        }
        qname = match_strdup(args);
        if (!qname) {
                ext4_msg(sb, KERN_ERR,
                        "Not enough memory for storing quotafile name");
 -              return 0;
 +              return -1;
        }
        if (sbi->s_qf_names[qtype] &&
                strcmp(sbi->s_qf_names[qtype], qname)) {
                ext4_msg(sb, KERN_ERR,
                        "%s quota file already specified", QTYPE2NAME(qtype));
                kfree(qname);
 -              return 0;
 +              return -1;
        }
        sbi->s_qf_names[qtype] = qname;
        if (strchr(sbi->s_qf_names[qtype], '/')) {
                        "quotafile must be on filesystem root");
                kfree(sbi->s_qf_names[qtype]);
                sbi->s_qf_names[qtype] = NULL;
 -              return 0;
 +              return -1;
        }
        set_opt(sb, QUOTA);
        return 1;
@@@ -1341,7 -1341,7 +1341,7 @@@ static int clear_qf_name(struct super_b
                sbi->s_qf_names[qtype]) {
                ext4_msg(sb, KERN_ERR, "Cannot change journaled quota options"
                        " when quota turned on");
 -              return 0;
 +              return -1;
        }
        /*
         * The space will be released later when all options are confirmed
@@@ -1448,20 -1448,8 +1448,20 @@@ static int handle_mount_opt(struct supe
  {
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        const struct mount_opts *m;
 +      kuid_t uid;
 +      kgid_t gid;
        int arg = 0;
  
 +#ifdef CONFIG_QUOTA
 +      if (token == Opt_usrjquota)
 +              return set_qf_name(sb, USRQUOTA, &args[0]);
 +      else if (token == Opt_grpjquota)
 +              return set_qf_name(sb, GRPQUOTA, &args[0]);
 +      else if (token == Opt_offusrjquota)
 +              return clear_qf_name(sb, USRQUOTA);
 +      else if (token == Opt_offgrpjquota)
 +              return clear_qf_name(sb, GRPQUOTA);
 +#endif
        if (args->from && match_int(args, &arg))
                return -1;
        switch (token) {
                         "Ignoring removed %s option", opt);
                return 1;
        case Opt_resuid:
 -              sbi->s_resuid = arg;
 +              uid = make_kuid(current_user_ns(), arg);
 +              if (!uid_valid(uid)) {
 +                      ext4_msg(sb, KERN_ERR, "Invalid uid value %d", arg);
 +                      return -1;
 +              }
 +              sbi->s_resuid = uid;
                return 1;
        case Opt_resgid:
 -              sbi->s_resgid = arg;
 +              gid = make_kgid(current_user_ns(), arg);
 +              if (!gid_valid(gid)) {
 +                      ext4_msg(sb, KERN_ERR, "Invalid gid value %d", arg);
 +                      return -1;
 +              }
 +              sbi->s_resgid = gid;
                return 1;
        case Opt_abort:
                sbi->s_mount_flags |= EXT4_MF_FS_ABORTED;
                                sbi->s_mount_opt |= m->mount_opt;
                        }
  #ifdef CONFIG_QUOTA
 -              } else if (token == Opt_usrjquota) {
 -                      if (!set_qf_name(sb, USRQUOTA, &args[0]))
 -                              return -1;
 -              } else if (token == Opt_grpjquota) {
 -                      if (!set_qf_name(sb, GRPQUOTA, &args[0]))
 -                              return -1;
 -              } else if (token == Opt_offusrjquota) {
 -                      if (!clear_qf_name(sb, USRQUOTA))
 -                              return -1;
 -              } else if (token == Opt_offgrpjquota) {
 -                      if (!clear_qf_name(sb, GRPQUOTA))
 -                              return -1;
                } else if (m->flags & MOPT_QFMT) {
                        if (sb_any_quota_loaded(sb) &&
                            sbi->s_jquota_fmt != m->mount_opt) {
@@@ -1609,9 -1599,7 +1609,9 @@@ static int parse_options(char *options
                         unsigned int *journal_ioprio,
                         int is_remount)
  {
 +#ifdef CONFIG_QUOTA
        struct ext4_sb_info *sbi = EXT4_SB(sb);
 +#endif
        char *p;
        substring_t args[MAX_OPT_ARGS];
        int token;
@@@ -1744,14 -1732,12 +1744,14 @@@ static int _ext4_show_options(struct se
                SEQ_OPTS_PRINT("%s", token2str(m->token));
        }
  
 -      if (nodefs || sbi->s_resuid != EXT4_DEF_RESUID ||
 +      if (nodefs || !uid_eq(sbi->s_resuid, make_kuid(&init_user_ns, EXT4_DEF_RESUID)) ||
            le16_to_cpu(es->s_def_resuid) != EXT4_DEF_RESUID)
 -              SEQ_OPTS_PRINT("resuid=%u", sbi->s_resuid);
 -      if (nodefs || sbi->s_resgid != EXT4_DEF_RESGID ||
 +              SEQ_OPTS_PRINT("resuid=%u",
 +                              from_kuid_munged(&init_user_ns, sbi->s_resuid));
 +      if (nodefs || !gid_eq(sbi->s_resgid, make_kgid(&init_user_ns, EXT4_DEF_RESGID)) ||
            le16_to_cpu(es->s_def_resgid) != EXT4_DEF_RESGID)
 -              SEQ_OPTS_PRINT("resgid=%u", sbi->s_resgid);
 +              SEQ_OPTS_PRINT("resgid=%u",
 +                              from_kgid_munged(&init_user_ns, sbi->s_resgid));
        def_errors = nodefs ? -1 : le16_to_cpu(es->s_errors);
        if (test_opt(sb, ERRORS_RO) && def_errors != EXT4_ERRORS_RO)
                SEQ_OPTS_PUTS("errors=remount-ro");
@@@ -2380,6 -2366,18 +2380,6 @@@ static ssize_t lifetime_write_kbytes_sh
                          EXT4_SB(sb)->s_sectors_written_start) >> 1)));
  }
  
 -static ssize_t extent_cache_hits_show(struct ext4_attr *a,
 -                                    struct ext4_sb_info *sbi, char *buf)
 -{
 -      return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_hits);
 -}
 -
 -static ssize_t extent_cache_misses_show(struct ext4_attr *a,
 -                                      struct ext4_sb_info *sbi, char *buf)
 -{
 -      return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_misses);
 -}
 -
  static ssize_t inode_readahead_blks_store(struct ext4_attr *a,
                                          struct ext4_sb_info *sbi,
                                          const char *buf, size_t count)
@@@ -2437,6 -2435,8 +2437,6 @@@ static struct ext4_attr ext4_attr_##nam
  EXT4_RO_ATTR(delayed_allocation_blocks);
  EXT4_RO_ATTR(session_write_kbytes);
  EXT4_RO_ATTR(lifetime_write_kbytes);
 -EXT4_RO_ATTR(extent_cache_hits);
 -EXT4_RO_ATTR(extent_cache_misses);
  EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show,
                 inode_readahead_blks_store, s_inode_readahead_blks);
  EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal);
@@@ -2452,6 -2452,8 +2452,6 @@@ static struct attribute *ext4_attrs[] 
        ATTR_LIST(delayed_allocation_blocks),
        ATTR_LIST(session_write_kbytes),
        ATTR_LIST(lifetime_write_kbytes),
 -      ATTR_LIST(extent_cache_hits),
 -      ATTR_LIST(extent_cache_misses),
        ATTR_LIST(inode_readahead_blks),
        ATTR_LIST(inode_goal),
        ATTR_LIST(mb_stats),
@@@ -2994,8 -2996,8 +2994,8 @@@ static int ext4_fill_super(struct super
        }
        sb->s_fs_info = sbi;
        sbi->s_mount_opt = 0;
 -      sbi->s_resuid = EXT4_DEF_RESUID;
 -      sbi->s_resgid = EXT4_DEF_RESGID;
 +      sbi->s_resuid = make_kuid(&init_user_ns, EXT4_DEF_RESUID);
 +      sbi->s_resgid = make_kgid(&init_user_ns, EXT4_DEF_RESGID);
        sbi->s_inode_readahead_blks = EXT4_DEF_INODE_READAHEAD_BLKS;
        sbi->s_sb_block = sb_block;
        if (sb->s_bdev->bd_part)
        if (def_mount_opts & EXT4_DEFM_DISCARD)
                set_opt(sb, DISCARD);
  
 -      sbi->s_resuid = le16_to_cpu(es->s_def_resuid);
 -      sbi->s_resgid = le16_to_cpu(es->s_def_resgid);
 +      sbi->s_resuid = make_kuid(&init_user_ns, le16_to_cpu(es->s_def_resuid));
 +      sbi->s_resgid = make_kgid(&init_user_ns, le16_to_cpu(es->s_def_resgid));
        sbi->s_commit_interval = JBD2_DEFAULT_MAX_COMMIT_AGE * HZ;
        sbi->s_min_batch_time = EXT4_DEF_MIN_BATCH_TIME;
        sbi->s_max_batch_time = EXT4_DEF_MAX_BATCH_TIME;
@@@ -4227,8 -4229,8 +4227,8 @@@ static int ext4_unfreeze(struct super_b
  struct ext4_mount_options {
        unsigned long s_mount_opt;
        unsigned long s_mount_opt2;
 -      uid_t s_resuid;
 -      gid_t s_resgid;
 +      kuid_t s_resuid;
 +      kgid_t s_resgid;
        unsigned long s_commit_interval;
        u32 s_min_batch_time, s_max_batch_time;
  #ifdef CONFIG_QUOTA
@@@ -4758,6 -4760,7 +4758,6 @@@ static ssize_t ext4_quota_write(struct 
                return -EIO;
        }
  
 -      mutex_lock_nested(&inode->i_mutex, I_MUTEX_QUOTA);
        bh = ext4_bread(handle, inode, blk, 1, &err);
        if (!bh)
                goto out;
        err = ext4_handle_dirty_metadata(handle, NULL, bh);
        brelse(bh);
  out:
 -      if (err) {
 -              mutex_unlock(&inode->i_mutex);
 +      if (err)
                return err;
 -      }
        if (inode->i_size < off + len) {
                i_size_write(inode, off + len);
                EXT4_I(inode)->i_disksize = inode->i_size;
                ext4_mark_inode_dirty(handle, inode);
        }
 -      mutex_unlock(&inode->i_mutex);
        return len;
  }
  
diff --combined fs/fuse/inode.c
index 26783eb2b1fc9465602cc0f452c49aa3e72d32b5,87e61152b34e51018b689dedd4d857cb2e4c2493..56f6dcf307684287bad491b8711fa3a4ef4f0633
@@@ -122,7 -122,7 +122,7 @@@ static void fuse_destroy_inode(struct i
  static void fuse_evict_inode(struct inode *inode)
  {
        truncate_inode_pages(&inode->i_data, 0);
-       end_writeback(inode);
+       clear_inode(inode);
        if (inode->i_sb->s_flags & MS_ACTIVE) {
                struct fuse_conn *fc = get_fuse_conn(inode);
                struct fuse_inode *fi = get_fuse_inode(inode);
@@@ -947,7 -947,6 +947,7 @@@ static int fuse_fill_super(struct super
        sb->s_magic = FUSE_SUPER_MAGIC;
        sb->s_op = &fuse_super_operations;
        sb->s_maxbytes = MAX_LFS_FILESIZE;
 +      sb->s_time_gran = 1;
        sb->s_export_op = &fuse_export_operations;
  
        file = fget(d.fd);
diff --combined fs/hugetlbfs/inode.c
index 001ef01d2fe2705a6767075032ea9f9f9ed0ec04,568193d5153c92567c4e22885eb9333f467961b4..cc9281b6c62893a94cedcb36128dcae427861fcd
@@@ -393,7 -393,7 +393,7 @@@ static void truncate_hugepages(struct i
  static void hugetlbfs_evict_inode(struct inode *inode)
  {
        truncate_hugepages(inode, 0);
-       end_writeback(inode);
+       clear_inode(inode);
  }
  
  static inline void
@@@ -485,7 -485,6 +485,7 @@@ static struct inode *hugetlbfs_get_root
                inode->i_fop = &simple_dir_operations;
                /* directory inodes start off with i_nlink == 2 (for "." entry) */
                inc_nlink(inode);
 +              lockdep_annotate_inode_mutex_key(inode);
        }
        return inode;
  }
diff --combined fs/inode.c
index da93f7d160d4f432a144966809c75f6011f97498,f4e1450166115a788bec6529ad8d541f7f87ef44..6bc8761cc3333524bf6c0408a4227f14a325bf7e
@@@ -135,8 -135,8 +135,8 @@@ int inode_init_always(struct super_bloc
        inode->i_fop = &empty_fops;
        inode->__i_nlink = 1;
        inode->i_opflags = 0;
 -      inode->i_uid = 0;
 -      inode->i_gid = 0;
 +      i_uid_write(inode, 0);
 +      i_gid_write(inode, 0);
        atomic_set(&inode->i_writecount, 0);
        inode->i_size = 0;
        inode->i_blocks = 0;
@@@ -486,7 -486,7 +486,7 @@@ void __remove_inode_hash(struct inode *
  }
  EXPORT_SYMBOL(__remove_inode_hash);
  
- void end_writeback(struct inode *inode)
+ void clear_inode(struct inode *inode)
  {
        might_sleep();
        /*
        BUG_ON(!list_empty(&inode->i_data.private_list));
        BUG_ON(!(inode->i_state & I_FREEING));
        BUG_ON(inode->i_state & I_CLEAR);
-       inode_sync_wait(inode);
        /* don't need i_lock here, no concurrent mods to i_state */
        inode->i_state = I_FREEING | I_CLEAR;
  }
- EXPORT_SYMBOL(end_writeback);
+ EXPORT_SYMBOL(clear_inode);
  
  /*
   * Free the inode passed in, removing it from the lists it is still connected
@@@ -531,12 -530,20 +530,20 @@@ static void evict(struct inode *inode
  
        inode_sb_list_del(inode);
  
+       /*
+        * Wait for flusher thread to be done with the inode so that filesystem
+        * does not start destroying it while writeback is still running. Since
+        * the inode has I_FREEING set, flusher thread won't start new work on
+        * the inode.  We just have to wait for running writeback to finish.
+        */
+       inode_wait_for_writeback(inode);
        if (op->evict_inode) {
                op->evict_inode(inode);
        } else {
                if (inode->i_data.nrpages)
                        truncate_inode_pages(&inode->i_data, 0);
-               end_writeback(inode);
+               clear_inode(inode);
        }
        if (S_ISBLK(inode->i_mode) && inode->i_bdev)
                bd_forget(inode);
@@@ -1647,7 -1654,6 +1654,7 @@@ void __init inode_init_early(void
                                        HASH_EARLY,
                                        &i_hash_shift,
                                        &i_hash_mask,
 +                                      0,
                                        0);
  
        for (loop = 0; loop < (1U << i_hash_shift); loop++)
@@@ -1678,7 -1684,6 +1685,7 @@@ void __init inode_init(void
                                        0,
                                        &i_hash_shift,
                                        &i_hash_mask,
 +                                      0,
                                        0);
  
        for (loop = 0; loop < (1U << i_hash_shift); loop++)
@@@ -1734,9 -1739,11 +1741,9 @@@ EXPORT_SYMBOL(inode_init_owner)
   */
  bool inode_owner_or_capable(const struct inode *inode)
  {
 -      struct user_namespace *ns = inode_userns(inode);
 -
 -      if (current_user_ns() == ns && current_fsuid() == inode->i_uid)
 +      if (uid_eq(current_fsuid(), inode->i_uid))
                return true;
 -      if (ns_capable(ns, CAP_FOWNER))
 +      if (inode_capable(inode, CAP_FOWNER))
                return true;
        return false;
  }
diff --combined fs/proc/inode.c
index 554ecc54799fff058067c19d2261d56bbc6391d7,29ab406b370417131ff3bf3e6c3004d8aa4e03d5..7ac817b64a7193b71cf867f72fc0d94d68294c90
@@@ -33,7 -33,7 +33,7 @@@ static void proc_evict_inode(struct ino
        const struct proc_ns_operations *ns_ops;
  
        truncate_inode_pages(&inode->i_data, 0);
-       end_writeback(inode);
+       clear_inode(inode);
  
        /* Stop tracking associated processes */
        put_pid(PROC_I(inode)->pid);
@@@ -108,8 -108,8 +108,8 @@@ static int proc_show_options(struct seq
        struct super_block *sb = root->d_sb;
        struct pid_namespace *pid = sb->s_fs_info;
  
 -      if (pid->pid_gid)
 -              seq_printf(seq, ",gid=%lu", (unsigned long)pid->pid_gid);
 +      if (!gid_eq(pid->pid_gid, GLOBAL_ROOT_GID))
 +              seq_printf(seq, ",gid=%u", from_kgid_munged(&init_user_ns, pid->pid_gid));
        if (pid->hide_pid != 0)
                seq_printf(seq, ",hidepid=%u", pid->hide_pid);
  
diff --combined fs/sysfs/inode.c
index 907c2b3af7589614114a7aa2d91d5969e81d1f6f,b8ce6a98933f2d0dabcb49abd96ac29809fb9bc1..0ce3ccf7f401ba6748cb84735e54130fca403506
@@@ -62,8 -62,8 +62,8 @@@ static struct sysfs_inode_attrs *sysfs_
  
        /* assign default attributes */
        iattrs->ia_mode = sd->s_mode;
 -      iattrs->ia_uid = 0;
 -      iattrs->ia_gid = 0;
 +      iattrs->ia_uid = GLOBAL_ROOT_UID;
 +      iattrs->ia_gid = GLOBAL_ROOT_GID;
        iattrs->ia_atime = iattrs->ia_mtime = iattrs->ia_ctime = CURRENT_TIME;
  
        return attrs;
@@@ -310,7 -310,7 +310,7 @@@ void sysfs_evict_inode(struct inode *in
        struct sysfs_dirent *sd  = inode->i_private;
  
        truncate_inode_pages(&inode->i_data, 0);
-       end_writeback(inode);
+       clear_inode(inode);
        sysfs_put(sd);
  }
  
diff --combined fs/ubifs/super.c
index 001acccac0d6dfea4335e04cef5460ee7d397818,7bf60ae58ed46e55dc8ea499221a9dd72147918a..5862dd9d278402fe140ad9096fd8eacb7c1f1909
@@@ -246,8 -246,8 +246,8 @@@ struct inode *ubifs_iget(struct super_b
  
  out_invalid:
        ubifs_err("inode %lu validation failed, error %d", inode->i_ino, err);
 -      dbg_dump_node(c, ino);
 -      dbg_dump_inode(c, inode);
 +      ubifs_dump_node(c, ino);
 +      ubifs_dump_inode(c, inode);
        err = -EINVAL;
  out_ino:
        kfree(ino);
@@@ -378,7 -378,7 +378,7 @@@ out
                smp_wmb();
        }
  done:
-       end_writeback(inode);
+       clear_inode(inode);
  }
  
  static void ubifs_dirty_inode(struct inode *inode, int flags)
@@@ -668,8 -668,8 +668,8 @@@ static int init_constants_sb(struct ubi
        tmp = UBIFS_CS_NODE_SZ + UBIFS_REF_NODE_SZ * c->jhead_cnt;
        tmp = ALIGN(tmp, c->min_io_size);
        if (tmp > c->leb_size) {
 -              dbg_err("too small LEB size %d, at least %d needed",
 -                      c->leb_size, tmp);
 +              ubifs_err("too small LEB size %d, at least %d needed",
 +                        c->leb_size, tmp);
                return -EINVAL;
        }
  
        tmp /= c->leb_size;
        tmp += 1;
        if (c->log_lebs < tmp) {
 -              dbg_err("too small log %d LEBs, required min. %d LEBs",
 -                      c->log_lebs, tmp);
 +              ubifs_err("too small log %d LEBs, required min. %d LEBs",
 +                        c->log_lebs, tmp);
                return -EINVAL;
        }
  
@@@ -813,10 -813,13 +813,10 @@@ static int alloc_wbufs(struct ubifs_inf
                c->jheads[i].grouped = 1;
        }
  
 -      c->jheads[BASEHD].wbuf.dtype = UBI_SHORTTERM;
        /*
 -       * Garbage Collector head likely contains long-term data and
 -       * does not need to be synchronized by timer. Also GC head nodes are
 -       * not grouped.
 +       * Garbage Collector head does not need to be synchronized by timer.
 +       * Also GC head nodes are not grouped.
         */
 -      c->jheads[GCHD].wbuf.dtype = UBI_LONGTERM;
        c->jheads[GCHD].wbuf.no_timer = 1;
        c->jheads[GCHD].grouped = 0;
  
@@@ -860,7 -863,7 +860,7 @@@ static void free_orphans(struct ubifs_i
                orph = list_entry(c->orph_list.next, struct ubifs_orphan, list);
                list_del(&orph->list);
                kfree(orph);
 -              dbg_err("orphan list not empty at unmount");
 +              ubifs_err("orphan list not empty at unmount");
        }
  
        vfree(c->orph_buf);
@@@ -1144,8 -1147,8 +1144,8 @@@ static int check_free_space(struct ubif
        ubifs_assert(c->dark_wm > 0);
        if (c->lst.total_free + c->lst.total_dirty < c->dark_wm) {
                ubifs_err("insufficient free space to mount in R/W mode");
 -              dbg_dump_budg(c, &c->bi);
 -              dbg_dump_lprops(c);
 +              ubifs_dump_budg(c, &c->bi);
 +              ubifs_dump_lprops(c);
                return -ENOSPC;
        }
        return 0;
@@@ -1298,7 -1301,7 +1298,7 @@@ static int mount_ubifs(struct ubifs_inf
        if (!c->ro_mount && c->space_fixup) {
                err = ubifs_fixup_free_space(c);
                if (err)
 -                      goto out_master;
 +                      goto out_lpt;
        }
  
        if (!c->ro_mount) {
@@@ -2123,8 -2126,8 +2123,8 @@@ static struct dentry *ubifs_mount(struc
         */
        ubi = open_ubi(name, UBI_READONLY);
        if (IS_ERR(ubi)) {
 -              dbg_err("cannot open \"%s\", error %d",
 -                      name, (int)PTR_ERR(ubi));
 +              ubifs_err("cannot open \"%s\", error %d",
 +                        name, (int)PTR_ERR(ubi));
                return ERR_CAST(ubi);
        }
  
diff --combined fs/xfs/xfs_super.c
index 2fcfd5b0b046830f4453298e5fb771de366b974f,5b806f23ad0a48990d0a8a2408ca87c4d1634ea8..0d9de41a7151568621cfad89a1a95a97b2ba8b4a
@@@ -17,6 -17,7 +17,6 @@@
   */
  
  #include "xfs.h"
 -#include "xfs_bit.h"
  #include "xfs_log.h"
  #include "xfs_inum.h"
  #include "xfs_trans.h"
@@@ -621,7 -622,7 +621,7 @@@ voi
  xfs_blkdev_issue_flush(
        xfs_buftarg_t           *buftarg)
  {
 -      blkdev_issue_flush(buftarg->bt_bdev, GFP_KERNEL, NULL);
 +      blkdev_issue_flush(buftarg->bt_bdev, GFP_NOFS, NULL);
  }
  
  STATIC void
@@@ -772,14 -773,8 +772,14 @@@ xfs_init_mount_workqueues
        if (!mp->m_unwritten_workqueue)
                goto out_destroy_data_iodone_queue;
  
 +      mp->m_cil_workqueue = alloc_workqueue("xfs-cil/%s",
 +                      WQ_MEM_RECLAIM, 0, mp->m_fsname);
 +      if (!mp->m_cil_workqueue)
 +              goto out_destroy_unwritten;
        return 0;
  
 +out_destroy_unwritten:
 +      destroy_workqueue(mp->m_unwritten_workqueue);
  out_destroy_data_iodone_queue:
        destroy_workqueue(mp->m_data_workqueue);
  out:
@@@ -790,7 -785,6 +790,7 @@@ STATIC voi
  xfs_destroy_mount_workqueues(
        struct xfs_mount        *mp)
  {
 +      destroy_workqueue(mp->m_cil_workqueue);
        destroy_workqueue(mp->m_data_workqueue);
        destroy_workqueue(mp->m_unwritten_workqueue);
  }
@@@ -932,7 -926,7 +932,7 @@@ xfs_fs_evict_inode
        trace_xfs_evict_inode(ip);
  
        truncate_inode_pages(&inode->i_data, 0);
-       end_writeback(inode);
+       clear_inode(inode);
        XFS_STATS_INC(vn_rele);
        XFS_STATS_INC(vn_remove);
        XFS_STATS_DEC(vn_active);
@@@ -987,9 -981,18 +987,9 @@@ xfs_fs_put_super
  {
        struct xfs_mount        *mp = XFS_M(sb);
  
 -      xfs_syncd_stop(mp);
 -
 -      /*
 -       * Blow away any referenced inode in the filestreams cache.
 -       * This can and will cause log traffic as inodes go inactive
 -       * here.
 -       */
        xfs_filestream_unmount(mp);
 -
 -      xfs_flush_buftarg(mp->m_ddev_targp, 1);
 -
        xfs_unmountfs(mp);
 +      xfs_syncd_stop(mp);
        xfs_freesb(mp);
        xfs_icsb_destroy_counters(mp);
        xfs_destroy_mount_workqueues(mp);
@@@ -1069,7 -1072,7 +1069,7 @@@ xfs_fs_statfs
  
        spin_unlock(&mp->m_sb_lock);
  
 -      if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) ||
 +      if ((ip->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
            ((mp->m_qflags & (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))) ==
                              (XFS_PQUOTA_ACCT|XFS_OQUOTA_ENFD))
                xfs_qm_statvfs(ip, statp);
@@@ -1359,32 -1362,31 +1359,32 @@@ xfs_fs_fill_super
        sb->s_time_gran = 1;
        set_posix_acl_flag(sb);
  
 -      error = xfs_mountfs(mp);
 +      error = xfs_syncd_init(mp);
        if (error)
                goto out_filestream_unmount;
  
 -      error = xfs_syncd_init(mp);
 +      error = xfs_mountfs(mp);
        if (error)
 -              goto out_unmount;
 +              goto out_syncd_stop;
  
        root = igrab(VFS_I(mp->m_rootip));
        if (!root) {
                error = ENOENT;
 -              goto out_syncd_stop;
 +              goto out_unmount;
        }
        if (is_bad_inode(root)) {
                error = EINVAL;
 -              goto out_syncd_stop;
 +              goto out_unmount;
        }
        sb->s_root = d_make_root(root);
        if (!sb->s_root) {
                error = ENOMEM;
 -              goto out_syncd_stop;
 +              goto out_unmount;
        }
  
        return 0;
 -
 + out_syncd_stop:
 +      xfs_syncd_stop(mp);
   out_filestream_unmount:
        xfs_filestream_unmount(mp);
   out_free_sb:
@@@ -1401,10 -1403,19 +1401,10 @@@ out_destroy_workqueues
   out:
        return -error;
  
 - out_syncd_stop:
 -      xfs_syncd_stop(mp);
   out_unmount:
 -      /*
 -       * Blow away any referenced inode in the filestreams cache.
 -       * This can and will cause log traffic as inodes go inactive
 -       * here.
 -       */
        xfs_filestream_unmount(mp);
 -
 -      xfs_flush_buftarg(mp->m_ddev_targp, 1);
 -
        xfs_unmountfs(mp);
 +      xfs_syncd_stop(mp);
        goto out_free_sb;
  }
  
diff --combined include/linux/fs.h
index c0e53372b082f445a6d713839452015de367e8fb,1c71e7f4d23476d9ad09e9e3f6312c32b32dc0bf..cdc1a9630948e157c3b6e9f1916d0ebfb1bd88d2
@@@ -402,7 -402,6 +402,7 @@@ struct inodes_stat_t 
  #include <linux/atomic.h>
  #include <linux/shrinker.h>
  #include <linux/migrate_mode.h>
 +#include <linux/uidgid.h>
  
  #include <asm/byteorder.h>
  
@@@ -470,8 -469,8 +470,8 @@@ typedef void (dio_iodone_t)(struct kioc
  struct iattr {
        unsigned int    ia_valid;
        umode_t         ia_mode;
 -      uid_t           ia_uid;
 -      gid_t           ia_gid;
 +      kuid_t          ia_uid;
 +      kgid_t          ia_gid;
        loff_t          ia_size;
        struct timespec ia_atime;
        struct timespec ia_mtime;
@@@ -762,8 -761,8 +762,8 @@@ struct posix_acl
  struct inode {
        umode_t                 i_mode;
        unsigned short          i_opflags;
 -      uid_t                   i_uid;
 -      gid_t                   i_gid;
 +      kuid_t                  i_uid;
 +      kgid_t                  i_gid;
        unsigned int            i_flags;
  
  #ifdef CONFIG_FS_POSIX_ACL
@@@ -928,31 -927,6 +928,31 @@@ static inline void i_size_write(struct 
  #endif
  }
  
 +/* Helper functions so that in most cases filesystems will
 + * not need to deal directly with kuid_t and kgid_t and can
 + * instead deal with the raw numeric values that are stored
 + * in the filesystem.
 + */
 +static inline uid_t i_uid_read(const struct inode *inode)
 +{
 +      return from_kuid(&init_user_ns, inode->i_uid);
 +}
 +
 +static inline gid_t i_gid_read(const struct inode *inode)
 +{
 +      return from_kgid(&init_user_ns, inode->i_gid);
 +}
 +
 +static inline void i_uid_write(struct inode *inode, uid_t uid)
 +{
 +      inode->i_uid = make_kuid(&init_user_ns, uid);
 +}
 +
 +static inline void i_gid_write(struct inode *inode, gid_t gid)
 +{
 +      inode->i_gid = make_kgid(&init_user_ns, gid);
 +}
 +
  static inline unsigned iminor(const struct inode *inode)
  {
        return MINOR(inode->i_rdev);
@@@ -969,7 -943,7 +969,7 @@@ struct fown_struct 
        rwlock_t lock;          /* protects pid, uid, euid fields */
        struct pid *pid;        /* pid or -pgrp where SIGIO should be sent */
        enum pid_type pid_type; /* Kind of process group SIGIO should be sent to */
 -      uid_t uid, euid;        /* uid/euid of process setting the owner */
 +      kuid_t uid, euid;       /* uid/euid of process setting the owner */
        int signum;             /* posix.1b rt signal to be delivered on IO */
  };
  
@@@ -1553,6 -1527,12 +1553,6 @@@ enum 
  #define vfs_check_frozen(sb, level) \
        wait_event((sb)->s_wait_unfrozen, ((sb)->s_frozen < (level)))
  
 -/*
 - * until VFS tracks user namespaces for inodes, just make all files
 - * belong to init_user_ns
 - */
 -extern struct user_namespace init_user_ns;
 -#define inode_userns(inode) (&init_user_ns)
  extern bool inode_owner_or_capable(const struct inode *inode);
  
  /* not quite ready to be deprecated, but... */
@@@ -1764,8 -1744,8 +1764,8 @@@ struct super_operations 
   * I_FREEING          Set when inode is about to be freed but still has dirty
   *                    pages or buffers attached or the inode itself is still
   *                    dirty.
-  * I_CLEAR            Added by end_writeback().  In this state the inode is clean
-  *                    and can be destroyed.  Inode keeps I_FREEING.
+  * I_CLEAR            Added by clear_inode().  In this state the inode is
+  *                    clean and can be destroyed.  Inode keeps I_FREEING.
   *
   *                    Inodes that are I_WILL_FREE, I_FREEING or I_CLEAR are
   *                    prohibited for many purposes.  iget() must wait for
   *                    anew.  Other functions will just ignore such inodes,
   *                    if appropriate.  I_NEW is used for waiting.
   *
-  * I_SYNC             Synchonized write of dirty inode data.  The bits is
-  *                    set during data writeback, and cleared with a wakeup
-  *                    on the bit address once it is done.
+  * I_SYNC             Writeback of inode is running. The bit is set during
+  *                    data writeback, and cleared with a wakeup on the bit
+  *                    address once it is done. The bit is also used to pin
+  *                    the inode in memory for flusher thread.
   *
   * I_REFERENCED               Marks the inode as recently references on the LRU list.
   *
@@@ -2071,7 -2052,6 +2072,7 @@@ extern void unregister_blkdev(unsigned 
  extern struct block_device *bdget(dev_t);
  extern struct block_device *bdgrab(struct block_device *bdev);
  extern void bd_set_size(struct block_device *, loff_t size);
 +extern sector_t blkdev_max_block(struct block_device *bdev);
  extern void bd_forget(struct inode *inode);
  extern void bdput(struct block_device *);
  extern void invalidate_bdev(struct block_device *);
@@@ -2349,7 -2329,7 +2350,7 @@@ extern unsigned int get_next_ino(void)
  
  extern void __iget(struct inode * inode);
  extern void iget_failed(struct inode *);
- extern void end_writeback(struct inode *);
+ extern void clear_inode(struct inode *);
  extern void __destroy_inode(struct inode *);
  extern struct inode *new_inode_pseudo(struct super_block *sb);
  extern struct inode *new_inode(struct super_block *sb);
diff --combined ipc/mqueue.c
index b6a0d46fbad71ea84705a5d8644308398ea9cb9b,0032d9cccb7c4039d22e6c444ea490283e2e96d5..a2757d4ab7734dd7f177e695f66f454964e8222d
@@@ -66,7 -66,6 +66,7 @@@ struct mqueue_inode_info 
  
        struct sigevent notify;
        struct pid* notify_owner;
 +      struct user_namespace *notify_user_ns;
        struct user_struct *user;       /* user who created, for accounting */
        struct sock *notify_sock;
        struct sk_buff *notify_cookie;
@@@ -140,7 -139,6 +140,7 @@@ static struct inode *mqueue_get_inode(s
                INIT_LIST_HEAD(&info->e_wait_q[0].list);
                INIT_LIST_HEAD(&info->e_wait_q[1].list);
                info->notify_owner = NULL;
 +              info->notify_user_ns = NULL;
                info->qsize = 0;
                info->user = NULL;      /* set when all is ok */
                memset(&info->attr, 0, sizeof(info->attr));
@@@ -251,7 -249,7 +251,7 @@@ static void mqueue_evict_inode(struct i
        int i;
        struct ipc_namespace *ipc_ns;
  
-       end_writeback(inode);
+       clear_inode(inode);
  
        if (S_ISDIR(inode->i_mode))
                return;
@@@ -538,7 -536,8 +538,7 @@@ static void __do_notify(struct mqueue_i
                        rcu_read_lock();
                        sig_i.si_pid = task_tgid_nr_ns(current,
                                                ns_of_pid(info->notify_owner));
 -                      sig_i.si_uid = user_ns_map_uid(info->user->user_ns,
 -                                              current_cred(), current_uid());
 +                      sig_i.si_uid = from_kuid_munged(info->notify_user_ns, current_uid());
                        rcu_read_unlock();
  
                        kill_pid_info(info->notify.sigev_signo,
                }
                /* after notification unregisters process */
                put_pid(info->notify_owner);
 +              put_user_ns(info->notify_user_ns);
                info->notify_owner = NULL;
 +              info->notify_user_ns = NULL;
        }
        wake_up(&info->wait_q);
  }
@@@ -578,9 -575,7 +578,9 @@@ static void remove_notification(struct 
                netlink_sendskb(info->notify_sock, info->notify_cookie);
        }
        put_pid(info->notify_owner);
 +      put_user_ns(info->notify_user_ns);
        info->notify_owner = NULL;
 +      info->notify_user_ns = NULL;
  }
  
  static int mq_attr_ok(struct ipc_namespace *ipc_ns, struct mq_attr *attr)
@@@ -1145,7 -1140,6 +1145,7 @@@ retry
                }
  
                info->notify_owner = get_pid(task_tgid(current));
 +              info->notify_user_ns = get_user_ns(current_user_ns());
                inode->i_atime = inode->i_ctime = CURRENT_TIME;
        }
        spin_unlock(&info->lock);
diff --combined mm/shmem.c
index d7b433a1ef5e2537dd6c36699d9635d45999e38d,68412fa90fd0bdca34ceab4d7623c92089445b5a..be5af34a070dcdb73e9cad2accea606aeae53336
@@@ -597,7 -597,7 +597,7 @@@ static void shmem_evict_inode(struct in
        }
        BUG_ON(inode->i_blocks);
        shmem_free_inode(inode->i_sb);
-       end_writeback(inode);
+       clear_inode(inode);
  }
  
  /*
@@@ -2075,8 -2075,6 +2075,8 @@@ static int shmem_parse_options(char *op
                               bool remount)
  {
        char *this_char, *value, *rest;
 +      uid_t uid;
 +      gid_t gid;
  
        while (options != NULL) {
                this_char = options;
                } else if (!strcmp(this_char,"uid")) {
                        if (remount)
                                continue;
 -                      sbinfo->uid = simple_strtoul(value, &rest, 0);
 +                      uid = simple_strtoul(value, &rest, 0);
                        if (*rest)
                                goto bad_val;
 +                      sbinfo->uid = make_kuid(current_user_ns(), uid);
 +                      if (!uid_valid(sbinfo->uid))
 +                              goto bad_val;
                } else if (!strcmp(this_char,"gid")) {
                        if (remount)
                                continue;
 -                      sbinfo->gid = simple_strtoul(value, &rest, 0);
 +                      gid = simple_strtoul(value, &rest, 0);
                        if (*rest)
                                goto bad_val;
 +                      sbinfo->gid = make_kgid(current_user_ns(), gid);
 +                      if (!gid_valid(sbinfo->gid))
 +                              goto bad_val;
                } else if (!strcmp(this_char,"mpol")) {
                        if (mpol_parse_str(value, &sbinfo->mpol, 1))
                                goto bad_val;
@@@ -2218,12 -2210,10 +2218,12 @@@ static int shmem_show_options(struct se
                seq_printf(seq, ",nr_inodes=%lu", sbinfo->max_inodes);
        if (sbinfo->mode != (S_IRWXUGO | S_ISVTX))
                seq_printf(seq, ",mode=%03ho", sbinfo->mode);
 -      if (sbinfo->uid != 0)
 -              seq_printf(seq, ",uid=%u", sbinfo->uid);
 -      if (sbinfo->gid != 0)
 -              seq_printf(seq, ",gid=%u", sbinfo->gid);
 +      if (!uid_eq(sbinfo->uid, GLOBAL_ROOT_UID))
 +              seq_printf(seq, ",uid=%u",
 +                              from_kuid_munged(&init_user_ns, sbinfo->uid));
 +      if (!gid_eq(sbinfo->gid, GLOBAL_ROOT_GID))
 +              seq_printf(seq, ",gid=%u",
 +                              from_kgid_munged(&init_user_ns, sbinfo->gid));
        shmem_show_mpol(seq, sbinfo->mpol);
        return 0;
  }