diff options
Diffstat (limited to 'fs/gfs2/super.c')
-rw-r--r-- | fs/gfs2/super.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c index 713e621c240b..fc3168f47a14 100644 --- a/fs/gfs2/super.c +++ b/fs/gfs2/super.c | |||
@@ -78,6 +78,8 @@ enum { | |||
78 | Opt_quota_quantum, | 78 | Opt_quota_quantum, |
79 | Opt_barrier, | 79 | Opt_barrier, |
80 | Opt_nobarrier, | 80 | Opt_nobarrier, |
81 | Opt_rgrplvb, | ||
82 | Opt_norgrplvb, | ||
81 | Opt_error, | 83 | Opt_error, |
82 | }; | 84 | }; |
83 | 85 | ||
@@ -115,6 +117,8 @@ static const match_table_t tokens = { | |||
115 | {Opt_quota_quantum, "quota_quantum=%d"}, | 117 | {Opt_quota_quantum, "quota_quantum=%d"}, |
116 | {Opt_barrier, "barrier"}, | 118 | {Opt_barrier, "barrier"}, |
117 | {Opt_nobarrier, "nobarrier"}, | 119 | {Opt_nobarrier, "nobarrier"}, |
120 | {Opt_rgrplvb, "rgrplvb"}, | ||
121 | {Opt_norgrplvb, "norgrplvb"}, | ||
118 | {Opt_error, NULL} | 122 | {Opt_error, NULL} |
119 | }; | 123 | }; |
120 | 124 | ||
@@ -267,6 +271,12 @@ int gfs2_mount_args(struct gfs2_args *args, char *options) | |||
267 | case Opt_nobarrier: | 271 | case Opt_nobarrier: |
268 | args->ar_nobarrier = 1; | 272 | args->ar_nobarrier = 1; |
269 | break; | 273 | break; |
274 | case Opt_rgrplvb: | ||
275 | args->ar_rgrplvb = 1; | ||
276 | break; | ||
277 | case Opt_norgrplvb: | ||
278 | args->ar_rgrplvb = 0; | ||
279 | break; | ||
270 | case Opt_error: | 280 | case Opt_error: |
271 | default: | 281 | default: |
272 | printk(KERN_WARNING "GFS2: invalid mount option: %s\n", o); | 282 | printk(KERN_WARNING "GFS2: invalid mount option: %s\n", o); |
@@ -838,7 +848,7 @@ static int gfs2_make_fs_ro(struct gfs2_sbd *sdp) | |||
838 | int error; | 848 | int error; |
839 | 849 | ||
840 | flush_workqueue(gfs2_delete_workqueue); | 850 | flush_workqueue(gfs2_delete_workqueue); |
841 | gfs2_quota_sync(sdp->sd_vfs, 0, 1); | 851 | gfs2_quota_sync(sdp->sd_vfs, 0); |
842 | gfs2_statfs_sync(sdp->sd_vfs, 0); | 852 | gfs2_statfs_sync(sdp->sd_vfs, 0); |
843 | 853 | ||
844 | error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, GL_NOCACHE, | 854 | error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, GL_NOCACHE, |
@@ -952,6 +962,8 @@ restart: | |||
952 | static int gfs2_sync_fs(struct super_block *sb, int wait) | 962 | static int gfs2_sync_fs(struct super_block *sb, int wait) |
953 | { | 963 | { |
954 | struct gfs2_sbd *sdp = sb->s_fs_info; | 964 | struct gfs2_sbd *sdp = sb->s_fs_info; |
965 | |||
966 | gfs2_quota_sync(sb, -1); | ||
955 | if (wait && sdp) | 967 | if (wait && sdp) |
956 | gfs2_log_flush(sdp, NULL); | 968 | gfs2_log_flush(sdp, NULL); |
957 | return 0; | 969 | return 0; |
@@ -1379,6 +1391,8 @@ static int gfs2_show_options(struct seq_file *s, struct dentry *root) | |||
1379 | seq_printf(s, ",nobarrier"); | 1391 | seq_printf(s, ",nobarrier"); |
1380 | if (test_bit(SDF_DEMOTE, &sdp->sd_flags)) | 1392 | if (test_bit(SDF_DEMOTE, &sdp->sd_flags)) |
1381 | seq_printf(s, ",demote_interface_used"); | 1393 | seq_printf(s, ",demote_interface_used"); |
1394 | if (args->ar_rgrplvb) | ||
1395 | seq_printf(s, ",rgrplvb"); | ||
1382 | return 0; | 1396 | return 0; |
1383 | } | 1397 | } |
1384 | 1398 | ||
@@ -1399,7 +1413,6 @@ static void gfs2_final_release_pages(struct gfs2_inode *ip) | |||
1399 | static int gfs2_dinode_dealloc(struct gfs2_inode *ip) | 1413 | static int gfs2_dinode_dealloc(struct gfs2_inode *ip) |
1400 | { | 1414 | { |
1401 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 1415 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
1402 | struct gfs2_qadata *qa; | ||
1403 | struct gfs2_rgrpd *rgd; | 1416 | struct gfs2_rgrpd *rgd; |
1404 | struct gfs2_holder gh; | 1417 | struct gfs2_holder gh; |
1405 | int error; | 1418 | int error; |
@@ -1409,13 +1422,13 @@ static int gfs2_dinode_dealloc(struct gfs2_inode *ip) | |||
1409 | return -EIO; | 1422 | return -EIO; |
1410 | } | 1423 | } |
1411 | 1424 | ||
1412 | qa = gfs2_qadata_get(ip); | 1425 | error = gfs2_rindex_update(sdp); |
1413 | if (!qa) | 1426 | if (error) |
1414 | return -ENOMEM; | 1427 | return error; |
1415 | 1428 | ||
1416 | error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE); | 1429 | error = gfs2_quota_hold(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE); |
1417 | if (error) | 1430 | if (error) |
1418 | goto out; | 1431 | return error; |
1419 | 1432 | ||
1420 | rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr, 1); | 1433 | rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr, 1); |
1421 | if (!rgd) { | 1434 | if (!rgd) { |
@@ -1443,8 +1456,6 @@ out_rg_gunlock: | |||
1443 | gfs2_glock_dq_uninit(&gh); | 1456 | gfs2_glock_dq_uninit(&gh); |
1444 | out_qs: | 1457 | out_qs: |
1445 | gfs2_quota_unhold(ip); | 1458 | gfs2_quota_unhold(ip); |
1446 | out: | ||
1447 | gfs2_qadata_put(ip); | ||
1448 | return error; | 1459 | return error; |
1449 | } | 1460 | } |
1450 | 1461 | ||
@@ -1545,6 +1556,9 @@ out_truncate: | |||
1545 | 1556 | ||
1546 | out_unlock: | 1557 | out_unlock: |
1547 | /* Error path for case 1 */ | 1558 | /* Error path for case 1 */ |
1559 | if (gfs2_rs_active(ip->i_res)) | ||
1560 | gfs2_rs_deltree(ip->i_res); | ||
1561 | |||
1548 | if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) | 1562 | if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) |
1549 | gfs2_glock_dq(&ip->i_iopen_gh); | 1563 | gfs2_glock_dq(&ip->i_iopen_gh); |
1550 | gfs2_holder_uninit(&ip->i_iopen_gh); | 1564 | gfs2_holder_uninit(&ip->i_iopen_gh); |
@@ -1554,6 +1568,7 @@ out_unlock: | |||
1554 | out: | 1568 | out: |
1555 | /* Case 3 starts here */ | 1569 | /* Case 3 starts here */ |
1556 | truncate_inode_pages(&inode->i_data, 0); | 1570 | truncate_inode_pages(&inode->i_data, 0); |
1571 | gfs2_rs_delete(ip); | ||
1557 | clear_inode(inode); | 1572 | clear_inode(inode); |
1558 | gfs2_dir_hash_inval(ip); | 1573 | gfs2_dir_hash_inval(ip); |
1559 | ip->i_gl->gl_object = NULL; | 1574 | ip->i_gl->gl_object = NULL; |
@@ -1576,6 +1591,7 @@ static struct inode *gfs2_alloc_inode(struct super_block *sb) | |||
1576 | ip->i_flags = 0; | 1591 | ip->i_flags = 0; |
1577 | ip->i_gl = NULL; | 1592 | ip->i_gl = NULL; |
1578 | ip->i_rgd = NULL; | 1593 | ip->i_rgd = NULL; |
1594 | ip->i_res = NULL; | ||
1579 | } | 1595 | } |
1580 | return &ip->i_inode; | 1596 | return &ip->i_inode; |
1581 | } | 1597 | } |