+++ /dev/null
-From: Jan Kara <jack@suse.cz>
-References: fate#302681
-Subject: [PATCH 17/28] quota: Implement function for scanning active dquots
-Patch-mainline: 2.6.29?
-
-OCFS2 needs to scan all active dquots once in a while and sync quota
-information among cluster nodes. Provide a helper function for it so
-that it does not have to reimplement internally a list which VFS
-already has. Moreover this function is probably going to be useful
-for other clustered filesystems if they decide to use VFS quotas.
-
-Signed-off-by: Jan Kara <jack@suse.cz>
----
- fs/dquot.c | 36 ++++++++++++++++++++++++++++++++++++
- include/linux/quotaops.h | 3 +++
- 2 files changed, 39 insertions(+), 0 deletions(-)
-
-diff --git a/fs/dquot.c b/fs/dquot.c
-index 9fb1d71..6a17416 100644
---- a/fs/dquot.c
-+++ b/fs/dquot.c
-@@ -476,6 +476,41 @@ restart:
- spin_unlock(&dq_list_lock);
- }
-
-+/* Call callback for every active dquot on given filesystem */
-+int dquot_scan_active(struct super_block *sb,
-+ int (*fn)(struct dquot *dquot, unsigned long priv),
-+ unsigned long priv)
-+{
-+ struct dquot *dquot, *old_dquot = NULL;
-+ int ret = 0;
-+
-+ mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
-+ spin_lock(&dq_list_lock);
-+ list_for_each_entry(dquot, &inuse_list, dq_inuse) {
-+ if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
-+ continue;
-+ if (dquot->dq_sb != sb)
-+ continue;
-+ /* Now we have active dquot so we can just increase use count */
-+ atomic_inc(&dquot->dq_count);
-+ dqstats.lookups++;
-+ spin_unlock(&dq_list_lock);
-+ dqput(old_dquot);
-+ old_dquot = dquot;
-+ ret = fn(dquot, priv);
-+ if (ret < 0)
-+ goto out;
-+ spin_lock(&dq_list_lock);
-+ /* We are safe to continue now because our dquot could not
-+ * be moved out of the inuse list while we hold the reference */
-+ }
-+ spin_unlock(&dq_list_lock);
-+out:
-+ dqput(old_dquot);
-+ mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
-+ return ret;
-+}
-+
- int vfs_quota_sync(struct super_block *sb, int type)
- {
- struct list_head *dirty;
-@@ -2316,6 +2351,7 @@ EXPORT_SYMBOL(vfs_quota_on_path);
- EXPORT_SYMBOL(vfs_quota_on_mount);
- EXPORT_SYMBOL(vfs_quota_disable);
- EXPORT_SYMBOL(vfs_quota_off);
-+EXPORT_SYMBOL(dquot_scan_active);
- EXPORT_SYMBOL(vfs_quota_sync);
- EXPORT_SYMBOL(vfs_get_dqinfo);
- EXPORT_SYMBOL(vfs_set_dqinfo);
-diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h
-index 1f990f2..f2147eb 100644
---- a/include/linux/quotaops.h
-+++ b/include/linux/quotaops.h
-@@ -31,6 +31,9 @@ int dquot_drop_locked(struct inode *inode);
- struct dquot *dqget(struct super_block *sb, unsigned int id, int type);
- void dqput(struct dquot *dquot);
- int dquot_is_cached(struct super_block *sb, unsigned int id, int type);
-+int dquot_scan_active(struct super_block *sb,
-+ int (*fn)(struct dquot *dquot, unsigned long priv),
-+ unsigned long priv);
-
- int dquot_alloc_space(struct inode *inode, qsize_t number, int prealloc);
- int dquot_alloc_inode(const struct inode *inode, qsize_t number);
---
-1.5.2.4
-