aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/gfs2/super.c')
-rw-r--r--fs/gfs2/super.c32
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:
952static int gfs2_sync_fs(struct super_block *sb, int wait) 962static 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)
1399static int gfs2_dinode_dealloc(struct gfs2_inode *ip) 1413static 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);
1444out_qs: 1457out_qs:
1445 gfs2_quota_unhold(ip); 1458 gfs2_quota_unhold(ip);
1446out:
1447 gfs2_qadata_put(ip);
1448 return error; 1459 return error;
1449} 1460}
1450 1461
@@ -1545,6 +1556,9 @@ out_truncate:
1545 1556
1546out_unlock: 1557out_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:
1554out: 1568out:
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}