|
@@ -1241,7 +1241,16 @@ void generic_delete_inode(struct inode *inode)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(generic_delete_inode);
|
|
EXPORT_SYMBOL(generic_delete_inode);
|
|
|
|
|
|
-static void generic_forget_inode(struct inode *inode)
|
|
|
|
|
|
+/**
|
|
|
|
+ * generic_detach_inode - remove inode from inode lists
|
|
|
|
+ * @inode: inode to remove
|
|
|
|
+ *
|
|
|
|
+ * Remove inode from inode lists, write it if it's dirty. This is just an
|
|
|
|
+ * internal VFS helper exported for hugetlbfs. Do not use!
|
|
|
|
+ *
|
|
|
|
+ * Returns 1 if inode should be completely destroyed.
|
|
|
|
+ */
|
|
|
|
+int generic_detach_inode(struct inode *inode)
|
|
{
|
|
{
|
|
struct super_block *sb = inode->i_sb;
|
|
struct super_block *sb = inode->i_sb;
|
|
|
|
|
|
@@ -1251,7 +1260,7 @@ static void generic_forget_inode(struct inode *inode)
|
|
inodes_stat.nr_unused++;
|
|
inodes_stat.nr_unused++;
|
|
if (sb->s_flags & MS_ACTIVE) {
|
|
if (sb->s_flags & MS_ACTIVE) {
|
|
spin_unlock(&inode_lock);
|
|
spin_unlock(&inode_lock);
|
|
- return;
|
|
|
|
|
|
+ return 0;
|
|
}
|
|
}
|
|
WARN_ON(inode->i_state & I_NEW);
|
|
WARN_ON(inode->i_state & I_NEW);
|
|
inode->i_state |= I_WILL_FREE;
|
|
inode->i_state |= I_WILL_FREE;
|
|
@@ -1269,6 +1278,14 @@ static void generic_forget_inode(struct inode *inode)
|
|
inode->i_state |= I_FREEING;
|
|
inode->i_state |= I_FREEING;
|
|
inodes_stat.nr_inodes--;
|
|
inodes_stat.nr_inodes--;
|
|
spin_unlock(&inode_lock);
|
|
spin_unlock(&inode_lock);
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(generic_detach_inode);
|
|
|
|
+
|
|
|
|
+static void generic_forget_inode(struct inode *inode)
|
|
|
|
+{
|
|
|
|
+ if (!generic_detach_inode(inode))
|
|
|
|
+ return;
|
|
if (inode->i_data.nrpages)
|
|
if (inode->i_data.nrpages)
|
|
truncate_inode_pages(&inode->i_data, 0);
|
|
truncate_inode_pages(&inode->i_data, 0);
|
|
clear_inode(inode);
|
|
clear_inode(inode);
|