diff options
-rw-r--r-- | fs/quota/dquot.c | 4 | ||||
-rw-r--r-- | 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 cfc8dcc16043..9cd5f63715c0 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -528,7 +528,7 @@ restart: | |||
528 | if (atomic_read(&dquot->dq_count)) { | 528 | if (atomic_read(&dquot->dq_count)) { |
529 | DEFINE_WAIT(wait); | 529 | DEFINE_WAIT(wait); |
530 | 530 | ||
531 | atomic_inc(&dquot->dq_count); | 531 | dqgrab(dquot); |
532 | prepare_to_wait(&dquot->dq_wait_unused, &wait, | 532 | prepare_to_wait(&dquot->dq_wait_unused, &wait, |
533 | TASK_UNINTERRUPTIBLE); | 533 | TASK_UNINTERRUPTIBLE); |
534 | spin_unlock(&dq_list_lock); | 534 | spin_unlock(&dq_list_lock); |
@@ -632,7 +632,7 @@ int dquot_writeback_dquots(struct super_block *sb, int type) | |||
632 | /* Now we have active dquot from which someone is | 632 | /* Now we have active dquot from which someone is |
633 | * holding reference so we can safely just increase | 633 | * holding reference so we can safely just increase |
634 | * use count */ | 634 | * use count */ |
635 | atomic_inc(&dquot->dq_count); | 635 | dqgrab(dquot); |
636 | spin_unlock(&dq_list_lock); | 636 | spin_unlock(&dq_list_lock); |
637 | dqstats_inc(DQST_LOOKUPS); | 637 | dqstats_inc(DQST_LOOKUPS); |
638 | err = sb->dq_op->write_dquot(dquot); | 638 | 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); | |||
46 | void dquot_initialize(struct inode *inode); | 46 | void dquot_initialize(struct inode *inode); |
47 | void dquot_drop(struct inode *inode); | 47 | void dquot_drop(struct inode *inode); |
48 | struct dquot *dqget(struct super_block *sb, struct kqid qid); | 48 | struct dquot *dqget(struct super_block *sb, struct kqid qid); |
49 | static inline struct dquot *dqgrab(struct dquot *dquot) | ||
50 | { | ||
51 | /* Make sure someone else has active reference to dquot */ | ||
52 | WARN_ON_ONCE(!atomic_read(&dquot->dq_count)); | ||
53 | WARN_ON_ONCE(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)); | ||
54 | atomic_inc(&dquot->dq_count); | ||
55 | return dquot; | ||
56 | } | ||
49 | void dqput(struct dquot *dquot); | 57 | void dqput(struct dquot *dquot); |
50 | int dquot_scan_active(struct super_block *sb, | 58 | int dquot_scan_active(struct super_block *sb, |
51 | int (*fn)(struct dquot *dquot, unsigned long priv), | 59 | int (*fn)(struct dquot *dquot, unsigned long priv), |