Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 27 Jul 2011 01:30:20 +0000 (18:30 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 27 Jul 2011 01:30:20 +0000 (18:30 -0700)
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
  merge fchmod() and fchmodat() guts, kill ancient broken kludge
  xfs: fix misspelled S_IS...()
  xfs: get rid of open-coded S_ISREG(), etc.
  vfs: document locking requirements for d_move, __d_move and d_materialise_unique
  omfs: fix (mode & S_IFDIR) abuse
  btrfs: S_ISREG(mode) is not mode & S_IFREG...
  ima: fmode_t misspelled as mode_t...
  pci-label.c: size_t misspelled as mode_t
  jffs2: S_ISLNK(mode & S_IFMT) is pointless
  snd_msnd ->mode is fmode_t, not mode_t
  v9fs_iop_get_acl: get rid of unused variable
  vfs: dont chain pipe/anon/socket on superblock s_inodes list
  Documentation: Exporting: update description of d_splice_alias
  fs: add missing unlock in default_llseek()

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

diff --combined fs/inode.c
index a48fa5355fb44ef5a8e5a3a1acbcdaea095d829e,319b93b555709b14e69e2f750274522ee1e0d27b..d0c72ff6b30e6d259c80d4cd28197441f141fe43
@@@ -37,7 -37,7 +37,7 @@@
   *   inode->i_sb->s_inode_lru, inode->i_lru
   * inode_sb_list_lock protects:
   *   sb->s_inodes, inode->i_sb_list
 - * inode_wb_list_lock protects:
 + * bdi->wb.list_lock protects:
   *   bdi->wb.b_{dirty,io,more_io}, inode->i_wb_list
   * inode_hash_lock protects:
   *   inode_hashtable, inode->i_hash
@@@ -48,7 -48,7 +48,7 @@@
   *   inode->i_lock
   *     inode->i_sb->s_inode_lru_lock
   *
 - * inode_wb_list_lock
 + * bdi->wb.list_lock
   *   inode->i_lock
   *
   * inode_hash_lock
@@@ -65,6 -65,7 +65,6 @@@ static struct hlist_head *inode_hashtab
  static __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_hash_lock);
  
  __cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_sb_list_lock);
 -__cacheline_aligned_in_smp DEFINE_SPINLOCK(inode_wb_list_lock);
  
  /*
   * Empty aops. Can be used for the cases where the user does not
@@@ -361,9 -362,11 +361,11 @@@ EXPORT_SYMBOL_GPL(inode_sb_list_add)
  
  static inline void inode_sb_list_del(struct inode *inode)
  {
-       spin_lock(&inode_sb_list_lock);
-       list_del_init(&inode->i_sb_list);
-       spin_unlock(&inode_sb_list_lock);
+       if (!list_empty(&inode->i_sb_list)) {
+               spin_lock(&inode_sb_list_lock);
+               list_del_init(&inode->i_sb_list);
+               spin_unlock(&inode_sb_list_lock);
+       }
  }
  
  static unsigned long hash(struct super_block *sb, unsigned long hashval)
@@@ -795,6 -798,29 +797,29 @@@ unsigned int get_next_ino(void
  }
  EXPORT_SYMBOL(get_next_ino);
  
+ /**
+  *    new_inode_pseudo        - obtain an inode
+  *    @sb: superblock
+  *
+  *    Allocates a new inode for given superblock.
+  *    Inode wont be chained in superblock s_inodes list
+  *    This means :
+  *    - fs can't be unmount
+  *    - quotas, fsnotify, writeback can't work
+  */
+ struct inode *new_inode_pseudo(struct super_block *sb)
+ {
+       struct inode *inode = alloc_inode(sb);
+       if (inode) {
+               spin_lock(&inode->i_lock);
+               inode->i_state = 0;
+               spin_unlock(&inode->i_lock);
+               INIT_LIST_HEAD(&inode->i_sb_list);
+       }
+       return inode;
+ }
  /**
   *    new_inode       - obtain an inode
   *    @sb: superblock
@@@ -813,13 -839,9 +838,9 @@@ struct inode *new_inode(struct super_bl
  
        spin_lock_prefetch(&inode_sb_list_lock);
  
-       inode = alloc_inode(sb);
-       if (inode) {
-               spin_lock(&inode->i_lock);
-               inode->i_state = 0;
-               spin_unlock(&inode->i_lock);
+       inode = new_inode_pseudo(sb);
+       if (inode)
                inode_sb_list_add(inode);
-       }
        return inode;
  }
  EXPORT_SYMBOL(new_inode);
diff --combined include/linux/fs.h
index 5f523eb9bb8d57a3afae47e5e0bb0bb91c23571b,cc363fa7bb8274275efc4af74ccf2a3558cb39d6..f23bcb77260c236f74441d02f3e00cd1d5c62c3a
@@@ -1072,12 -1072,12 +1072,12 @@@ struct file_lock_operations 
  };
  
  struct lock_manager_operations {
 -      int (*fl_compare_owner)(struct file_lock *, struct file_lock *);
 -      void (*fl_notify)(struct file_lock *);  /* unblock callback */
 -      int (*fl_grant)(struct file_lock *, struct file_lock *, int);
 -      void (*fl_release_private)(struct file_lock *);
 -      void (*fl_break)(struct file_lock *);
 -      int (*fl_change)(struct file_lock **, int);
 +      int (*lm_compare_owner)(struct file_lock *, struct file_lock *);
 +      void (*lm_notify)(struct file_lock *);  /* unblock callback */
 +      int (*lm_grant)(struct file_lock *, struct file_lock *, int);
 +      void (*lm_release_private)(struct file_lock *);
 +      void (*lm_break)(struct file_lock *);
 +      int (*lm_change)(struct file_lock **, int);
  };
  
  struct lock_manager {
@@@ -2310,7 -2310,8 +2310,8 @@@ extern void __iget(struct inode * inode
  extern void iget_failed(struct inode *);
  extern void end_writeback(struct inode *);
  extern void __destroy_inode(struct inode *);
- extern struct inode *new_inode(struct super_block *);
+ extern struct inode *new_inode_pseudo(struct super_block *sb);
+ extern struct inode *new_inode(struct super_block *sb);
  extern void free_inode_nonrcu(struct inode *inode);
  extern int should_remove_suid(struct dentry *);
  extern int file_remove_suid(struct file *);