Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Aug 2011 23:48:31 +0000 (13:48 -1000)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 1 Aug 2011 23:48:31 +0000 (13:48 -1000)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
  xfs: Fix build breakage in xfs_iops.c when CONFIG_FS_POSIX_ACL is not set
  VFS: Reorganise shrink_dcache_for_umount_subtree() after demise of dcache_lock
  VFS: Remove dentry->d_lock locking from shrink_dcache_for_umount_subtree()
  VFS: Remove detached-dentry counter from shrink_dcache_for_umount_subtree()
  switch posix_acl_chmod() to umode_t
  switch posix_acl_from_mode() to umode_t
  switch posix_acl_equiv_mode() to umode_t *
  switch posix_acl_create() to umode_t *
  block: initialise bd_super in bdget()
  vfs: avoid call to inode_lru_list_del() if possible
  vfs: avoid taking inode_hash_lock on pipes and sockets
  vfs: conditionally call inode_wb_list_del()
  VFS: Fix automount for negative autofs dentries
  Btrfs: load the key from the dir item in readdir into a fake dentry
  devtmpfs: missing initialialization in never-hit case
  hppfs: missing include

1  2 
fs/btrfs/inode.c
include/linux/nfs_fs.h

diff --combined fs/btrfs/inode.c
@@@ -750,6 -750,15 +750,6 @@@ static u64 get_extent_allocation_hint(s
        return alloc_hint;
  }
  
 -static inline bool is_free_space_inode(struct btrfs_root *root,
 -                                     struct inode *inode)
 -{
 -      if (root == root->fs_info->tree_root ||
 -          BTRFS_I(inode)->location.objectid == BTRFS_FREE_INO_OBJECTID)
 -              return true;
 -      return false;
 -}
 -
  /*
   * when extent_io.c finds a delayed allocation range in the file,
   * the call backs end up in this code.  The basic idea is to
@@@ -782,7 -791,7 +782,7 @@@ static noinline int cow_file_range(stru
        struct extent_map_tree *em_tree = &BTRFS_I(inode)->extent_tree;
        int ret = 0;
  
 -      BUG_ON(is_free_space_inode(root, inode));
 +      BUG_ON(btrfs_is_free_space_inode(root, inode));
        trans = btrfs_join_transaction(root);
        BUG_ON(IS_ERR(trans));
        trans->block_rsv = &root->fs_info->delalloc_block_rsv;
@@@ -1063,7 -1072,7 +1063,7 @@@ static noinline int run_delalloc_nocow(
        path = btrfs_alloc_path();
        BUG_ON(!path);
  
 -      nolock = is_free_space_inode(root, inode);
 +      nolock = btrfs_is_free_space_inode(root, inode);
  
        if (nolock)
                trans = btrfs_join_transaction_nolock(root);
@@@ -1289,9 -1298,7 +1289,9 @@@ static int btrfs_split_extent_hook(stru
        if (!(orig->state & EXTENT_DELALLOC))
                return 0;
  
 -      atomic_inc(&BTRFS_I(inode)->outstanding_extents);
 +      spin_lock(&BTRFS_I(inode)->lock);
 +      BTRFS_I(inode)->outstanding_extents++;
 +      spin_unlock(&BTRFS_I(inode)->lock);
        return 0;
  }
  
@@@ -1309,9 -1316,7 +1309,9 @@@ static int btrfs_merge_extent_hook(stru
        if (!(other->state & EXTENT_DELALLOC))
                return 0;
  
 -      atomic_dec(&BTRFS_I(inode)->outstanding_extents);
 +      spin_lock(&BTRFS_I(inode)->lock);
 +      BTRFS_I(inode)->outstanding_extents--;
 +      spin_unlock(&BTRFS_I(inode)->lock);
        return 0;
  }
  
@@@ -1332,15 -1337,12 +1332,15 @@@ static int btrfs_set_bit_hook(struct in
        if (!(state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
                struct btrfs_root *root = BTRFS_I(inode)->root;
                u64 len = state->end + 1 - state->start;
 -              bool do_list = !is_free_space_inode(root, inode);
 +              bool do_list = !btrfs_is_free_space_inode(root, inode);
  
 -              if (*bits & EXTENT_FIRST_DELALLOC)
 +              if (*bits & EXTENT_FIRST_DELALLOC) {
                        *bits &= ~EXTENT_FIRST_DELALLOC;
 -              else
 -                      atomic_inc(&BTRFS_I(inode)->outstanding_extents);
 +              } else {
 +                      spin_lock(&BTRFS_I(inode)->lock);
 +                      BTRFS_I(inode)->outstanding_extents++;
 +                      spin_unlock(&BTRFS_I(inode)->lock);
 +              }
  
                spin_lock(&root->fs_info->delalloc_lock);
                BTRFS_I(inode)->delalloc_bytes += len;
@@@ -1368,15 -1370,12 +1368,15 @@@ static int btrfs_clear_bit_hook(struct 
        if ((state->state & EXTENT_DELALLOC) && (*bits & EXTENT_DELALLOC)) {
                struct btrfs_root *root = BTRFS_I(inode)->root;
                u64 len = state->end + 1 - state->start;
 -              bool do_list = !is_free_space_inode(root, inode);
 +              bool do_list = !btrfs_is_free_space_inode(root, inode);
  
 -              if (*bits & EXTENT_FIRST_DELALLOC)
 +              if (*bits & EXTENT_FIRST_DELALLOC) {
                        *bits &= ~EXTENT_FIRST_DELALLOC;
 -              else if (!(*bits & EXTENT_DO_ACCOUNTING))
 -                      atomic_dec(&BTRFS_I(inode)->outstanding_extents);
 +              } else if (!(*bits & EXTENT_DO_ACCOUNTING)) {
 +                      spin_lock(&BTRFS_I(inode)->lock);
 +                      BTRFS_I(inode)->outstanding_extents--;
 +                      spin_unlock(&BTRFS_I(inode)->lock);
 +              }
  
                if (*bits & EXTENT_DO_ACCOUNTING)
                        btrfs_delalloc_release_metadata(inode, len);
@@@ -1478,7 -1477,7 +1478,7 @@@ static int btrfs_submit_bio_hook(struc
  
        skip_sum = BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM;
  
 -      if (is_free_space_inode(root, inode))
 +      if (btrfs_is_free_space_inode(root, inode))
                ret = btrfs_bio_wq_end_io(root->fs_info, bio, 2);
        else
                ret = btrfs_bio_wq_end_io(root->fs_info, bio, 0);
@@@ -1727,7 -1726,7 +1727,7 @@@ static int btrfs_finish_ordered_io(stru
                return 0;
        BUG_ON(!ordered_extent);
  
 -      nolock = is_free_space_inode(root, inode);
 +      nolock = btrfs_is_free_space_inode(root, inode);
  
        if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) {
                BUG_ON(!list_empty(&ordered_extent->list));
@@@ -2532,6 -2531,13 +2532,6 @@@ static void btrfs_read_locked_inode(str
  
        inode_item = btrfs_item_ptr(leaf, path->slots[0],
                                    struct btrfs_inode_item);
 -      if (!leaf->map_token)
 -              map_private_extent_buffer(leaf, (unsigned long)inode_item,
 -                                        sizeof(struct btrfs_inode_item),
 -                                        &leaf->map_token, &leaf->kaddr,
 -                                        &leaf->map_start, &leaf->map_len,
 -                                        KM_USER1);
 -
        inode->i_mode = btrfs_inode_mode(leaf, inode_item);
        inode->i_nlink = btrfs_inode_nlink(leaf, inode_item);
        inode->i_uid = btrfs_inode_uid(leaf, inode_item);
@@@ -2569,6 -2575,11 +2569,6 @@@ cache_acl
        if (!maybe_acls)
                cache_no_acl(inode);
  
 -      if (leaf->map_token) {
 -              unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
 -              leaf->map_token = NULL;
 -      }
 -
        btrfs_free_path(path);
  
        switch (inode->i_mode & S_IFMT) {
@@@ -2613,6 -2624,13 +2613,6 @@@ static void fill_inode_item(struct btrf
                            struct btrfs_inode_item *item,
                            struct inode *inode)
  {
 -      if (!leaf->map_token)
 -              map_private_extent_buffer(leaf, (unsigned long)item,
 -                                        sizeof(struct btrfs_inode_item),
 -                                        &leaf->map_token, &leaf->kaddr,
 -                                        &leaf->map_start, &leaf->map_len,
 -                                        KM_USER1);
 -
        btrfs_set_inode_uid(leaf, item, inode->i_uid);
        btrfs_set_inode_gid(leaf, item, inode->i_gid);
        btrfs_set_inode_size(leaf, item, BTRFS_I(inode)->disk_i_size);
        btrfs_set_inode_rdev(leaf, item, inode->i_rdev);
        btrfs_set_inode_flags(leaf, item, BTRFS_I(inode)->flags);
        btrfs_set_inode_block_group(leaf, item, 0);
 -
 -      if (leaf->map_token) {
 -              unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
 -              leaf->map_token = NULL;
 -      }
  }
  
  /*
@@@ -2661,7 -2684,7 +2661,7 @@@ noinline int btrfs_update_inode(struct 
         * The data relocation inode should also be directly updated
         * without delay
         */
 -      if (!is_free_space_inode(root, inode)
 +      if (!btrfs_is_free_space_inode(root, inode)
            && root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) {
                ret = btrfs_delayed_update_inode(trans, root, inode);
                if (!ret)
@@@ -3375,7 -3398,7 +3375,7 @@@ static int btrfs_truncate_page(struct a
  
        ret = -ENOMEM;
  again:
 -      page = grab_cache_page(mapping, index);
 +      page = find_or_create_page(mapping, index, GFP_NOFS);
        if (!page) {
                btrfs_delalloc_release_space(inode, PAGE_CACHE_SIZE);
                goto out;
@@@ -3611,7 -3634,7 +3611,7 @@@ void btrfs_evict_inode(struct inode *in
  
        truncate_inode_pages(&inode->i_data, 0);
        if (inode->i_nlink && (btrfs_root_refs(&root->root_item) != 0 ||
 -                             is_free_space_inode(root, inode)))
 +                             btrfs_is_free_space_inode(root, inode)))
                goto no_delete;
  
        if (is_bad_inode(inode)) {
@@@ -3993,12 -4016,19 +3993,19 @@@ struct inode *btrfs_lookup_dentry(struc
        struct btrfs_root *sub_root = root;
        struct btrfs_key location;
        int index;
-       int ret;
+       int ret = 0;
  
        if (dentry->d_name.len > BTRFS_NAME_LEN)
                return ERR_PTR(-ENAMETOOLONG);
  
-       ret = btrfs_inode_by_name(dir, dentry, &location);
+       if (unlikely(d_need_lookup(dentry))) {
+               memcpy(&location, dentry->d_fsdata, sizeof(struct btrfs_key));
+               kfree(dentry->d_fsdata);
+               dentry->d_fsdata = NULL;
+               d_clear_need_lookup(dentry);
+       } else {
+               ret = btrfs_inode_by_name(dir, dentry, &location);
+       }
  
        if (ret < 0)
                return ERR_PTR(ret);
@@@ -4053,6 -4083,12 +4060,12 @@@ static int btrfs_dentry_delete(const st
        return 0;
  }
  
+ static void btrfs_dentry_release(struct dentry *dentry)
+ {
+       if (dentry->d_fsdata)
+               kfree(dentry->d_fsdata);
+ }
  static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
                                   struct nameidata *nd)
  {
@@@ -4075,6 -4111,7 +4088,7 @@@ 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
                         */
@@@ -4248,7 -4313,7 +4290,7 @@@ int btrfs_write_inode(struct inode *ino
        if (BTRFS_I(inode)->dummy_inode)
                return 0;
  
 -      if (btrfs_fs_closing(root->fs_info) && is_free_space_inode(root, inode))
 +      if (btrfs_fs_closing(root->fs_info) && btrfs_is_free_space_inode(root, inode))
                nolock = true;
  
        if (wbc->sync_mode == WB_SYNC_ALL) {
@@@ -6705,9 -6770,8 +6747,9 @@@ struct inode *btrfs_alloc_inode(struct 
        ei->index_cnt = (u64)-1;
        ei->last_unlink_trans = 0;
  
 -      atomic_set(&ei->outstanding_extents, 0);
 -      atomic_set(&ei->reserved_extents, 0);
 +      spin_lock_init(&ei->lock);
 +      ei->outstanding_extents = 0;
 +      ei->reserved_extents = 0;
  
        ei->ordered_data_close = 0;
        ei->orphan_meta_reserved = 0;
@@@ -6745,8 -6809,8 +6787,8 @@@ void btrfs_destroy_inode(struct inode *
  
        WARN_ON(!list_empty(&inode->i_dentry));
        WARN_ON(inode->i_data.nrpages);
 -      WARN_ON(atomic_read(&BTRFS_I(inode)->outstanding_extents));
 -      WARN_ON(atomic_read(&BTRFS_I(inode)->reserved_extents));
 +      WARN_ON(BTRFS_I(inode)->outstanding_extents);
 +      WARN_ON(BTRFS_I(inode)->reserved_extents);
  
        /*
         * This can happen where we create an inode, but somebody else also
@@@ -6801,7 -6865,7 +6843,7 @@@ int btrfs_drop_inode(struct inode *inod
        struct btrfs_root *root = BTRFS_I(inode)->root;
  
        if (btrfs_root_refs(&root->root_item) == 0 &&
 -          !is_free_space_inode(root, inode))
 +          !btrfs_is_free_space_inode(root, inode))
                return 1;
        else
                return generic_drop_inode(inode);
@@@ -7430,4 -7494,5 +7472,5 @@@ static const struct inode_operations bt
  
  const struct dentry_operations btrfs_dentry_operations = {
        .d_delete       = btrfs_dentry_delete,
+       .d_release      = btrfs_dentry_release,
  };
diff --combined include/linux/nfs_fs.h
@@@ -99,10 -99,9 +99,10 @@@ struct nfs_open_context 
  
  struct nfs_open_dir_context {
        struct rpc_cred *cred;
 +      unsigned long attr_gencount;
        __u64 dir_cookie;
        __u64 dup_cookie;
 -      int duped;
 +      signed char duped;
  };
  
  /*
@@@ -569,12 -568,12 +569,12 @@@ extern struct posix_acl *nfs3_proc_geta
  extern int nfs3_proc_setacl(struct inode *inode, int type,
                            struct posix_acl *acl);
  extern int nfs3_proc_set_default_acl(struct inode *dir, struct inode *inode,
-               mode_t mode);
+               umode_t mode);
  extern void nfs3_forget_cached_acls(struct inode *inode);
  #else
  static inline int nfs3_proc_set_default_acl(struct inode *dir,
                                            struct inode *inode,
-                                           mode_t mode)
+                                           umode_t mode)
  {
        return 0;
  }