Skip to content

Commit

Permalink
GFS2: Protect quota sync generation
Browse files Browse the repository at this point in the history
Now that gfs2_quota_sync can be potentially called from multiple
threads, we should protect this bit of code, and the sync generation
number in particular in order to ensure that there are no races
when syncing quotas.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Cc: Abhijith Das <adas@redhat.com>
  • Loading branch information
Steven Whitehouse committed Oct 4, 2013
1 parent aabd7c7 commit e46c772
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 2 deletions.
1 change: 1 addition & 0 deletions fs/gfs2/incore.h
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,7 @@ struct gfs2_sbd {
struct list_head sd_quota_list;
atomic_t sd_quota_count;
struct mutex sd_quota_mutex;
struct mutex sd_quota_sync_mutex;
wait_queue_head_t sd_quota_wait;
struct list_head sd_trunc_list;
spinlock_t sd_trunc_lock;
Expand Down
1 change: 1 addition & 0 deletions fs/gfs2/ops_fstype.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)

INIT_LIST_HEAD(&sdp->sd_quota_list);
mutex_init(&sdp->sd_quota_mutex);
mutex_init(&sdp->sd_quota_sync_mutex);
init_waitqueue_head(&sdp->sd_quota_wait);
INIT_LIST_HEAD(&sdp->sd_trunc_list);
spin_lock_init(&sdp->sd_trunc_lock);
Expand Down
6 changes: 4 additions & 2 deletions fs/gfs2/quota.c
Original file line number Diff line number Diff line change
Expand Up @@ -1132,12 +1132,13 @@ int gfs2_quota_sync(struct super_block *sb, int type)
unsigned int x;
int error = 0;

sdp->sd_quota_sync_gen++;

qda = kcalloc(max_qd, sizeof(struct gfs2_quota_data *), GFP_KERNEL);
if (!qda)
return -ENOMEM;

mutex_lock(&sdp->sd_quota_sync_mutex);
sdp->sd_quota_sync_gen++;

do {
num_qd = 0;

Expand All @@ -1162,6 +1163,7 @@ int gfs2_quota_sync(struct super_block *sb, int type)
}
} while (!error && num_qd == max_qd);

mutex_unlock(&sdp->sd_quota_sync_mutex);
kfree(qda);

return error;
Expand Down

0 comments on commit e46c772

Please sign in to comment.