|
@@ -362,9 +362,11 @@ EXPORT_SYMBOL_GPL(inode_sb_list_add);
|
|
|
|
|
|
static inline void inode_sb_list_del(struct inode *inode)
|
|
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)
|
|
static unsigned long hash(struct super_block *sb, unsigned long hashval)
|
|
@@ -796,6 +798,29 @@ unsigned int get_next_ino(void)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(get_next_ino);
|
|
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
|
|
* new_inode - obtain an inode
|
|
* @sb: superblock
|
|
* @sb: superblock
|
|
@@ -814,13 +839,9 @@ struct inode *new_inode(struct super_block *sb)
|
|
|
|
|
|
spin_lock_prefetch(&inode_sb_list_lock);
|
|
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);
|
|
inode_sb_list_add(inode);
|
|
- }
|
|
|
|
return inode;
|
|
return inode;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(new_inode);
|
|
EXPORT_SYMBOL(new_inode);
|