diff mbox

[3/6] quota: Provide function to grab quota structure reference

Message ID 1392909511-2933-4-git-send-email-jack@suse.cz (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Kara Feb. 20, 2014, 3:18 p.m. UTC
Provide dqgrab() function to get quota structure reference when we are
sure it already has at least one active reference. Make use of this
function inside quota code.

Signed-off-by: Jan Kara <jack@suse.cz>
---
 fs/quota/dquot.c         | 4 ++--
 include/linux/quotaops.h | 8 ++++++++
 2 files changed, 10 insertions(+), 2 deletions(-)

Comments

Srinivas Eeda Feb. 21, 2014, 5:14 a.m. UTC | #1
looks good to me
Reviewed-by: Srinivas Eeda <srinivas.eeda@oracle.com>

On 02/20/2014 07:18 AM, Jan Kara wrote:
> Provide dqgrab() function to get quota structure reference when we are
> sure it already has at least one active reference. Make use of this
> function inside quota code.
>
> Signed-off-by: Jan Kara <jack@suse.cz>
> ---
>   fs/quota/dquot.c         | 4 ++--
>   include/linux/quotaops.h | 8 ++++++++
>   2 files changed, 10 insertions(+), 2 deletions(-)
>
> diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
> index 831d49a4111f..e3f09e34d0b2 100644
> --- a/fs/quota/dquot.c
> +++ b/fs/quota/dquot.c
> @@ -528,7 +528,7 @@ restart:
>   		if (atomic_read(&dquot->dq_count)) {
>   			DEFINE_WAIT(wait);
>   
> -			atomic_inc(&dquot->dq_count);
> +			dqgrab(dquot);
>   			prepare_to_wait(&dquot->dq_wait_unused, &wait,
>   					TASK_UNINTERRUPTIBLE);
>   			spin_unlock(&dq_list_lock);
> @@ -624,7 +624,7 @@ int dquot_writeback_dquots(struct super_block *sb, int type)
>   			/* Now we have active dquot from which someone is
>    			 * holding reference so we can safely just increase
>   			 * use count */
> -			atomic_inc(&dquot->dq_count);
> +			dqgrab(dquot);
>   			spin_unlock(&dq_list_lock);
>   			dqstats_inc(DQST_LOOKUPS);
>   			err = sb->dq_op->write_dquot(dquot);
> diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h
> index 6965fe394c3b..1d3eee594cd6 100644
> --- a/include/linux/quotaops.h
> +++ b/include/linux/quotaops.h
> @@ -46,6 +46,14 @@ void inode_reclaim_rsv_space(struct inode *inode, qsize_t number);
>   void dquot_initialize(struct inode *inode);
>   void dquot_drop(struct inode *inode);
>   struct dquot *dqget(struct super_block *sb, struct kqid qid);
> +static inline struct dquot *dqgrab(struct dquot *dquot)
> +{
> +	/* Make sure someone else has active reference to dquot */
> +	WARN_ON_ONCE(!atomic_read(&dquot->dq_count));
> +	WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
> +	atomic_inc(&dquot->dq_count);
> +	return dquot;
> +}
>   void dqput(struct dquot *dquot);
>   int dquot_scan_active(struct super_block *sb,
>   		      int (*fn)(struct dquot *dquot, unsigned long priv),
diff mbox

Patch

diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c
index 831d49a4111f..e3f09e34d0b2 100644
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -528,7 +528,7 @@  restart:
 		if (atomic_read(&dquot->dq_count)) {
 			DEFINE_WAIT(wait);
 
-			atomic_inc(&dquot->dq_count);
+			dqgrab(dquot);
 			prepare_to_wait(&dquot->dq_wait_unused, &wait,
 					TASK_UNINTERRUPTIBLE);
 			spin_unlock(&dq_list_lock);
@@ -624,7 +624,7 @@  int dquot_writeback_dquots(struct super_block *sb, int type)
 			/* Now we have active dquot from which someone is
  			 * holding reference so we can safely just increase
 			 * use count */
-			atomic_inc(&dquot->dq_count);
+			dqgrab(dquot);
 			spin_unlock(&dq_list_lock);
 			dqstats_inc(DQST_LOOKUPS);
 			err = sb->dq_op->write_dquot(dquot);
diff --git a/include/linux/quotaops.h b/include/linux/quotaops.h
index 6965fe394c3b..1d3eee594cd6 100644
--- a/include/linux/quotaops.h
+++ b/include/linux/quotaops.h
@@ -46,6 +46,14 @@  void inode_reclaim_rsv_space(struct inode *inode, qsize_t number);
 void dquot_initialize(struct inode *inode);
 void dquot_drop(struct inode *inode);
 struct dquot *dqget(struct super_block *sb, struct kqid qid);
+static inline struct dquot *dqgrab(struct dquot *dquot)
+{
+	/* Make sure someone else has active reference to dquot */
+	WARN_ON_ONCE(!atomic_read(&dquot->dq_count));
+	WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
+	atomic_inc(&dquot->dq_count);
+	return dquot;
+}
 void dqput(struct dquot *dquot);
 int dquot_scan_active(struct super_block *sb,
 		      int (*fn)(struct dquot *dquot, unsigned long priv),