diff options
| -rw-r--r-- | fs/gfs2/ops_inode.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index e2c62f73a778..35f6f032a026 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
| @@ -159,9 +159,13 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir, | |||
| 159 | gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs); | 159 | gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs); |
| 160 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1); | 160 | gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1); |
| 161 | 161 | ||
| 162 | error = gfs2_glock_nq_m(2, ghs); | 162 | error = gfs2_glock_nq(ghs); /* parent */ |
| 163 | if (error) | 163 | if (error) |
| 164 | goto out; | 164 | goto out_parent; |
| 165 | |||
| 166 | error = gfs2_glock_nq(ghs + 1); /* child */ | ||
| 167 | if (error) | ||
| 168 | goto out_child; | ||
| 165 | 169 | ||
| 166 | error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC); | 170 | error = gfs2_permission(dir, MAY_WRITE | MAY_EXEC); |
| 167 | if (error) | 171 | if (error) |
| @@ -245,8 +249,10 @@ out_alloc: | |||
| 245 | if (alloc_required) | 249 | if (alloc_required) |
| 246 | gfs2_alloc_put(dip); | 250 | gfs2_alloc_put(dip); |
| 247 | out_gunlock: | 251 | out_gunlock: |
| 248 | gfs2_glock_dq_m(2, ghs); | 252 | gfs2_glock_dq(ghs + 1); |
| 249 | out: | 253 | out_child: |
| 254 | gfs2_glock_dq(ghs); | ||
| 255 | out_parent: | ||
| 250 | gfs2_holder_uninit(ghs); | 256 | gfs2_holder_uninit(ghs); |
| 251 | gfs2_holder_uninit(ghs + 1); | 257 | gfs2_holder_uninit(ghs + 1); |
| 252 | if (!error) { | 258 | if (!error) { |
| @@ -302,7 +308,7 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry) | |||
| 302 | 308 | ||
| 303 | error = gfs2_unlink_ok(dip, &dentry->d_name, ip); | 309 | error = gfs2_unlink_ok(dip, &dentry->d_name, ip); |
| 304 | if (error) | 310 | if (error) |
| 305 | goto out_rgrp; | 311 | goto out_gunlock; |
| 306 | 312 | ||
| 307 | error = gfs2_trans_begin(sdp, 2*RES_DINODE + RES_LEAF + RES_RG_BIT, 0); | 313 | error = gfs2_trans_begin(sdp, 2*RES_DINODE + RES_LEAF + RES_RG_BIT, 0); |
| 308 | if (error) | 314 | if (error) |
| @@ -316,6 +322,7 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry) | |||
| 316 | 322 | ||
| 317 | out_end_trans: | 323 | out_end_trans: |
| 318 | gfs2_trans_end(sdp); | 324 | gfs2_trans_end(sdp); |
| 325 | out_gunlock: | ||
| 319 | gfs2_glock_dq(ghs + 2); | 326 | gfs2_glock_dq(ghs + 2); |
| 320 | out_rgrp: | 327 | out_rgrp: |
| 321 | gfs2_holder_uninit(ghs + 2); | 328 | gfs2_holder_uninit(ghs + 2); |
| @@ -485,7 +492,6 @@ static int gfs2_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 485 | struct gfs2_holder ri_gh; | 492 | struct gfs2_holder ri_gh; |
| 486 | int error; | 493 | int error; |
| 487 | 494 | ||
| 488 | |||
| 489 | error = gfs2_rindex_hold(sdp, &ri_gh); | 495 | error = gfs2_rindex_hold(sdp, &ri_gh); |
| 490 | if (error) | 496 | if (error) |
| 491 | return error; | 497 | return error; |
| @@ -495,9 +501,17 @@ static int gfs2_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 495 | rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr); | 501 | rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr); |
| 496 | gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2); | 502 | gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2); |
| 497 | 503 | ||
| 498 | error = gfs2_glock_nq_m(3, ghs); | 504 | error = gfs2_glock_nq(ghs); /* parent */ |
| 499 | if (error) | 505 | if (error) |
| 500 | goto out; | 506 | goto out_parent; |
| 507 | |||
| 508 | error = gfs2_glock_nq(ghs + 1); /* child */ | ||
| 509 | if (error) | ||
| 510 | goto out_child; | ||
| 511 | |||
| 512 | error = gfs2_glock_nq(ghs + 2); /* rgrp */ | ||
| 513 | if (error) | ||
| 514 | goto out_rgrp; | ||
| 501 | 515 | ||
| 502 | error = gfs2_unlink_ok(dip, &dentry->d_name, ip); | 516 | error = gfs2_unlink_ok(dip, &dentry->d_name, ip); |
| 503 | if (error) | 517 | if (error) |
| @@ -523,11 +537,15 @@ static int gfs2_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 523 | gfs2_trans_end(sdp); | 537 | gfs2_trans_end(sdp); |
| 524 | 538 | ||
| 525 | out_gunlock: | 539 | out_gunlock: |
| 526 | gfs2_glock_dq_m(3, ghs); | 540 | gfs2_glock_dq(ghs + 2); |
| 527 | out: | 541 | out_rgrp: |
| 528 | gfs2_holder_uninit(ghs); | ||
| 529 | gfs2_holder_uninit(ghs + 1); | ||
| 530 | gfs2_holder_uninit(ghs + 2); | 542 | gfs2_holder_uninit(ghs + 2); |
| 543 | gfs2_glock_dq(ghs + 1); | ||
| 544 | out_child: | ||
| 545 | gfs2_holder_uninit(ghs + 1); | ||
| 546 | gfs2_glock_dq(ghs); | ||
| 547 | out_parent: | ||
| 548 | gfs2_holder_uninit(ghs); | ||
| 531 | gfs2_glock_dq_uninit(&ri_gh); | 549 | gfs2_glock_dq_uninit(&ri_gh); |
| 532 | return error; | 550 | return error; |
| 533 | } | 551 | } |
| @@ -639,9 +657,11 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, | |||
| 639 | gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++); | 657 | gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++); |
| 640 | } | 658 | } |
| 641 | 659 | ||
| 642 | error = gfs2_glock_nq_m(num_gh, ghs); | 660 | for (x = 0; x < num_gh; x++) { |
| 643 | if (error) | 661 | error = gfs2_glock_nq(ghs + x); |
| 644 | goto out_uninit; | 662 | if (error) |
| 663 | goto out_gunlock; | ||
| 664 | } | ||
| 645 | 665 | ||
| 646 | /* Check out the old directory */ | 666 | /* Check out the old directory */ |
| 647 | 667 | ||
| @@ -804,10 +824,10 @@ out_alloc: | |||
| 804 | if (alloc_required) | 824 | if (alloc_required) |
| 805 | gfs2_alloc_put(ndip); | 825 | gfs2_alloc_put(ndip); |
| 806 | out_gunlock: | 826 | out_gunlock: |
| 807 | gfs2_glock_dq_m(num_gh, ghs); | 827 | while (x--) { |
| 808 | out_uninit: | 828 | gfs2_glock_dq(ghs + x); |
| 809 | for (x = 0; x < num_gh; x++) | ||
| 810 | gfs2_holder_uninit(ghs + x); | 829 | gfs2_holder_uninit(ghs + x); |
| 830 | } | ||
| 811 | out_gunlock_r: | 831 | out_gunlock_r: |
| 812 | if (dir_rename) | 832 | if (dir_rename) |
| 813 | gfs2_glock_dq_uninit(&r_gh); | 833 | gfs2_glock_dq_uninit(&r_gh); |
