diff options
Diffstat (limited to 'fs/dquot.c')
-rw-r--r-- | fs/dquot.c | 19 |
1 files changed, 3 insertions, 16 deletions
diff --git a/fs/dquot.c b/fs/dquot.c index ea7644227a65..05b60283c9c2 100644 --- a/fs/dquot.c +++ b/fs/dquot.c | |||
@@ -77,6 +77,7 @@ | |||
77 | #include <linux/kmod.h> | 77 | #include <linux/kmod.h> |
78 | #include <linux/namei.h> | 78 | #include <linux/namei.h> |
79 | #include <linux/buffer_head.h> | 79 | #include <linux/buffer_head.h> |
80 | #include <linux/quotaops.h> | ||
80 | 81 | ||
81 | #include <asm/uaccess.h> | 82 | #include <asm/uaccess.h> |
82 | 83 | ||
@@ -1320,13 +1321,11 @@ int vfs_quota_off(struct super_block *sb, int type) | |||
1320 | int cnt; | 1321 | int cnt; |
1321 | struct quota_info *dqopt = sb_dqopt(sb); | 1322 | struct quota_info *dqopt = sb_dqopt(sb); |
1322 | struct inode *toputinode[MAXQUOTAS]; | 1323 | struct inode *toputinode[MAXQUOTAS]; |
1323 | struct vfsmount *toputmnt[MAXQUOTAS]; | ||
1324 | 1324 | ||
1325 | /* We need to serialize quota_off() for device */ | 1325 | /* We need to serialize quota_off() for device */ |
1326 | down(&dqopt->dqonoff_sem); | 1326 | down(&dqopt->dqonoff_sem); |
1327 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { | 1327 | for (cnt = 0; cnt < MAXQUOTAS; cnt++) { |
1328 | toputinode[cnt] = NULL; | 1328 | toputinode[cnt] = NULL; |
1329 | toputmnt[cnt] = NULL; | ||
1330 | if (type != -1 && cnt != type) | 1329 | if (type != -1 && cnt != type) |
1331 | continue; | 1330 | continue; |
1332 | if (!sb_has_quota_enabled(sb, cnt)) | 1331 | if (!sb_has_quota_enabled(sb, cnt)) |
@@ -1347,9 +1346,7 @@ int vfs_quota_off(struct super_block *sb, int type) | |||
1347 | put_quota_format(dqopt->info[cnt].dqi_format); | 1346 | put_quota_format(dqopt->info[cnt].dqi_format); |
1348 | 1347 | ||
1349 | toputinode[cnt] = dqopt->files[cnt]; | 1348 | toputinode[cnt] = dqopt->files[cnt]; |
1350 | toputmnt[cnt] = dqopt->mnt[cnt]; | ||
1351 | dqopt->files[cnt] = NULL; | 1349 | dqopt->files[cnt] = NULL; |
1352 | dqopt->mnt[cnt] = NULL; | ||
1353 | dqopt->info[cnt].dqi_flags = 0; | 1350 | dqopt->info[cnt].dqi_flags = 0; |
1354 | dqopt->info[cnt].dqi_igrace = 0; | 1351 | dqopt->info[cnt].dqi_igrace = 0; |
1355 | dqopt->info[cnt].dqi_bgrace = 0; | 1352 | dqopt->info[cnt].dqi_bgrace = 0; |
@@ -1357,10 +1354,7 @@ int vfs_quota_off(struct super_block *sb, int type) | |||
1357 | } | 1354 | } |
1358 | up(&dqopt->dqonoff_sem); | 1355 | up(&dqopt->dqonoff_sem); |
1359 | /* Sync the superblock so that buffers with quota data are written to | 1356 | /* Sync the superblock so that buffers with quota data are written to |
1360 | * disk (and so userspace sees correct data afterwards). | 1357 | * disk (and so userspace sees correct data afterwards). */ |
1361 | * The reference to vfsmnt we are still holding protects us from | ||
1362 | * umount (we don't have it only when quotas are turned on/off for | ||
1363 | * journal replay but in that case we are guarded by the fs anyway). */ | ||
1364 | if (sb->s_op->sync_fs) | 1358 | if (sb->s_op->sync_fs) |
1365 | sb->s_op->sync_fs(sb, 1); | 1359 | sb->s_op->sync_fs(sb, 1); |
1366 | sync_blockdev(sb->s_bdev); | 1360 | sync_blockdev(sb->s_bdev); |
@@ -1384,10 +1378,6 @@ int vfs_quota_off(struct super_block *sb, int type) | |||
1384 | iput(toputinode[cnt]); | 1378 | iput(toputinode[cnt]); |
1385 | } | 1379 | } |
1386 | up(&dqopt->dqonoff_sem); | 1380 | up(&dqopt->dqonoff_sem); |
1387 | /* We don't hold the reference when we turned on quotas | ||
1388 | * just for the journal replay... */ | ||
1389 | if (toputmnt[cnt]) | ||
1390 | mntput(toputmnt[cnt]); | ||
1391 | } | 1381 | } |
1392 | if (sb->s_bdev) | 1382 | if (sb->s_bdev) |
1393 | invalidate_bdev(sb->s_bdev, 0); | 1383 | invalidate_bdev(sb->s_bdev, 0); |
@@ -1502,11 +1492,8 @@ int vfs_quota_on(struct super_block *sb, int type, int format_id, char *path) | |||
1502 | /* Quota file not on the same filesystem? */ | 1492 | /* Quota file not on the same filesystem? */ |
1503 | if (nd.mnt->mnt_sb != sb) | 1493 | if (nd.mnt->mnt_sb != sb) |
1504 | error = -EXDEV; | 1494 | error = -EXDEV; |
1505 | else { | 1495 | else |
1506 | error = vfs_quota_on_inode(nd.dentry->d_inode, type, format_id); | 1496 | error = vfs_quota_on_inode(nd.dentry->d_inode, type, format_id); |
1507 | if (!error) | ||
1508 | sb_dqopt(sb)->mnt[type] = mntget(nd.mnt); | ||
1509 | } | ||
1510 | out_path: | 1497 | out_path: |
1511 | path_release(&nd); | 1498 | path_release(&nd); |
1512 | return error; | 1499 | return error; |