diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-02-04 07:40:19 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-02-04 07:40:19 +0000 |
commit | 33263fc5f9ac8e8cb2b22d06af3ce5ac1dd815e4 (patch) | |
tree | 2d1b86a40bef0958a68cf1a2eafbeb0667a70543 /fs/inode.c | |
parent | 216f5f51aa02f8b113aa620ebc14a9631a217a00 (diff) |
Merge with Linux 2.3.32.
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/fs/inode.c b/fs/inode.c index 811bf575d..0dcdf2a87 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -4,6 +4,7 @@ * (C) 1997 Linus Torvalds */ +#include <linux/config.h> #include <linux/fs.h> #include <linux/string.h> #include <linux/mm.h> @@ -756,3 +757,51 @@ void update_atime (struct inode *inode) inode->i_atime = CURRENT_TIME; mark_inode_dirty (inode); } /* End Function update_atime */ + + +/* + * Quota functions that want to walk the inode lists.. + */ +#ifdef CONFIG_QUOTA + +/* Functions back in dquot.c */ +void put_dquot_list(struct list_head *); +int remove_inode_dquot_ref(struct inode *, short, struct list_head *); + +void remove_dquot_ref(kdev_t dev, short type) +{ + struct super_block *sb = get_super(dev); + struct inode *inode; + struct list_head *act_head; + LIST_HEAD(tofree_head); + + if (!sb || !sb->dq_op) + return; /* nothing to do */ + + /* We have to be protected against other CPUs */ + spin_lock(&inode_lock); + + for (act_head = inode_in_use.next; act_head != &inode_in_use; act_head = act_head->next) { + inode = list_entry(act_head, struct inode, i_list); + if (inode->i_sb != sb || !IS_QUOTAINIT(inode)) + continue; + remove_inode_dquot_ref(inode, type, &tofree_head); + } + for (act_head = inode_unused.next; act_head != &inode_unused; act_head = act_head->next) { + inode = list_entry(act_head, struct inode, i_list); + if (inode->i_sb != sb || !IS_QUOTAINIT(inode)) + continue; + remove_inode_dquot_ref(inode, type, &tofree_head); + } + for (act_head = sb->s_dirty.next; act_head != &sb->s_dirty; act_head = act_head->next) { + inode = list_entry(act_head, struct inode, i_list); + if (!IS_QUOTAINIT(inode)) + continue; + remove_inode_dquot_ref(inode, type, &tofree_head); + } + spin_unlock(&inode_lock); + + put_dquot_list(&tofree_head); +} + +#endif |