Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 74f783af authored by Jan Kara's avatar Jan Kara Committed by Mark Fasheh
Browse files

quota: Add callbacks for allocating and destroying dquot structures



Some filesystems would like to keep private information together with each
dquot. Add callbacks alloc_dquot and destroy_dquot allowing filesystem to
allocate larger dquots from their private slab in a similar fashion we
currently allocate inodes.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 9f868f16
Loading
Loading
Loading
Loading
+22 −5
Original line number Diff line number Diff line
@@ -415,6 +415,16 @@ out_dqlock:
	return ret;
}

static void dquot_destroy(struct dquot *dquot)
{
	kmem_cache_free(dquot_cachep, dquot);
}

static inline void do_destroy_dquot(struct dquot *dquot)
{
	dquot->dq_sb->dq_op->destroy_dquot(dquot);
}

/* Invalidate all dquots on the list. Note that this function is called after
 * quota is disabled and pointers from inodes removed so there cannot be new
 * quota users. There can still be some users of quotas due to inodes being
@@ -463,7 +473,7 @@ restart:
		remove_dquot_hash(dquot);
		remove_free_dquot(dquot);
		remove_inuse(dquot);
		kmem_cache_free(dquot_cachep, dquot);
		do_destroy_dquot(dquot);
	}
	spin_unlock(&dq_list_lock);
}
@@ -527,7 +537,7 @@ static void prune_dqcache(int count)
		remove_dquot_hash(dquot);
		remove_free_dquot(dquot);
		remove_inuse(dquot);
		kmem_cache_free(dquot_cachep, dquot);
		do_destroy_dquot(dquot);
		count--;
		head = free_dquots.prev;
	}
@@ -625,11 +635,16 @@ we_slept:
	spin_unlock(&dq_list_lock);
}

static struct dquot *dquot_alloc(struct super_block *sb, int type)
{
	return kmem_cache_zalloc(dquot_cachep, GFP_NOFS);
}

static struct dquot *get_empty_dquot(struct super_block *sb, int type)
{
	struct dquot *dquot;

	dquot = kmem_cache_zalloc(dquot_cachep, GFP_NOFS);
	dquot = sb->dq_op->alloc_dquot(sb, type);
	if(!dquot)
		return NODQUOT;

@@ -682,7 +697,7 @@ we_slept:
		dqstats.lookups++;
		spin_unlock(&dq_list_lock);
		if (empty)
			kmem_cache_free(dquot_cachep, empty);
			do_destroy_dquot(empty);
	}
	/* Wait for dq_lock - after this we know that either dquot_release() is already
	 * finished or it will be canceled due to dq_count > 1 test */
@@ -1533,7 +1548,9 @@ struct dquot_operations dquot_operations = {
	.acquire_dquot	= dquot_acquire,
	.release_dquot	= dquot_release,
	.mark_dirty	= dquot_mark_dquot_dirty,
	.write_info	= dquot_commit_info
	.write_info	= dquot_commit_info,
	.alloc_dquot	= dquot_alloc,
	.destroy_dquot	= dquot_destroy,
};

static inline void set_enable_flags(struct quota_info *dqopt, int type)
+2 −0
Original line number Diff line number Diff line
@@ -292,6 +292,8 @@ struct dquot_operations {
	int (*free_inode) (const struct inode *, unsigned long);
	int (*transfer) (struct inode *, struct iattr *);
	int (*write_dquot) (struct dquot *);		/* Ordinary dquot write */
	struct dquot *(*alloc_dquot)(struct super_block *, int);	/* Allocate memory for new dquot */
	void (*destroy_dquot)(struct dquot *);		/* Free memory for dquot */
	int (*acquire_dquot) (struct dquot *);		/* Quota is going to be created on disk */
	int (*release_dquot) (struct dquot *);		/* Quota is going to be deleted from disk */
	int (*mark_dirty) (struct dquot *);		/* Dquot is marked dirty */