aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/quota.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/gfs2/quota.c')
-rw-r--r--fs/gfs2/quota.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index 0cfe44f0b6ab..b08d09696b3e 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -1296,6 +1296,25 @@ static void quotad_check_timeo(struct gfs2_sbd *sdp, const char *msg,
1296 } 1296 }
1297} 1297}
1298 1298
1299static void quotad_check_trunc_list(struct gfs2_sbd *sdp)
1300{
1301 struct gfs2_inode *ip;
1302
1303 while(1) {
1304 ip = NULL;
1305 spin_lock(&sdp->sd_trunc_lock);
1306 if (!list_empty(&sdp->sd_trunc_list)) {
1307 ip = list_entry(sdp->sd_trunc_list.next,
1308 struct gfs2_inode, i_trunc_list);
1309 list_del_init(&ip->i_trunc_list);
1310 }
1311 spin_unlock(&sdp->sd_trunc_lock);
1312 if (ip == NULL)
1313 return;
1314 gfs2_glock_finish_truncate(ip);
1315 }
1316}
1317
1299/** 1318/**
1300 * gfs2_quotad - Write cached quota changes into the quota file 1319 * gfs2_quotad - Write cached quota changes into the quota file
1301 * @sdp: Pointer to GFS2 superblock 1320 * @sdp: Pointer to GFS2 superblock
@@ -1310,6 +1329,7 @@ int gfs2_quotad(void *data)
1310 unsigned long quotad_timeo = 0; 1329 unsigned long quotad_timeo = 0;
1311 unsigned long t = 0; 1330 unsigned long t = 0;
1312 DEFINE_WAIT(wait); 1331 DEFINE_WAIT(wait);
1332 int empty;
1313 1333
1314 while (!kthread_should_stop()) { 1334 while (!kthread_should_stop()) {
1315 1335
@@ -1324,12 +1344,21 @@ int gfs2_quotad(void *data)
1324 /* FIXME: This should be turned into a shrinker */ 1344 /* FIXME: This should be turned into a shrinker */
1325 gfs2_quota_scan(sdp); 1345 gfs2_quota_scan(sdp);
1326 1346
1347 /* Check for & recover partially truncated inodes */
1348 quotad_check_trunc_list(sdp);
1349
1327 if (freezing(current)) 1350 if (freezing(current))
1328 refrigerator(); 1351 refrigerator();
1329 t = min(quotad_timeo, statfs_timeo); 1352 t = min(quotad_timeo, statfs_timeo);
1330 1353
1331 prepare_to_wait(&sdp->sd_quota_wait, &wait, TASK_UNINTERRUPTIBLE); 1354 prepare_to_wait(&sdp->sd_quota_wait, &wait, TASK_UNINTERRUPTIBLE);
1332 t -= schedule_timeout(t); 1355 spin_lock(&sdp->sd_trunc_lock);
1356 empty = list_empty(&sdp->sd_trunc_list);
1357 spin_unlock(&sdp->sd_trunc_lock);
1358 if (empty)
1359 t -= schedule_timeout(t);
1360 else
1361 t = 0;
1333 finish_wait(&sdp->sd_quota_wait, &wait); 1362 finish_wait(&sdp->sd_quota_wait, &wait);
1334 } 1363 }
1335 1364