diff options
Diffstat (limited to 'fs/gfs2/inode.c')
-rw-r--r-- | fs/gfs2/inode.c | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index ced3257f06e8..109ce9325b76 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
@@ -379,6 +379,7 @@ static void munge_mode_uid_gid(const struct gfs2_inode *dip, | |||
379 | static int alloc_dinode(struct gfs2_inode *ip, u32 flags) | 379 | static int alloc_dinode(struct gfs2_inode *ip, u32 flags) |
380 | { | 380 | { |
381 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | 381 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); |
382 | struct gfs2_alloc_parms ap = { .target = RES_DINODE, .aflags = flags, }; | ||
382 | int error; | 383 | int error; |
383 | int dblocks = 1; | 384 | int dblocks = 1; |
384 | 385 | ||
@@ -386,7 +387,7 @@ static int alloc_dinode(struct gfs2_inode *ip, u32 flags) | |||
386 | if (error) | 387 | if (error) |
387 | goto out; | 388 | goto out; |
388 | 389 | ||
389 | error = gfs2_inplace_reserve(ip, RES_DINODE, flags); | 390 | error = gfs2_inplace_reserve(ip, &ap); |
390 | if (error) | 391 | if (error) |
391 | goto out_quota; | 392 | goto out_quota; |
392 | 393 | ||
@@ -472,6 +473,7 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name, | |||
472 | struct gfs2_inode *ip, int arq) | 473 | struct gfs2_inode *ip, int arq) |
473 | { | 474 | { |
474 | struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); | 475 | struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); |
476 | struct gfs2_alloc_parms ap = { .target = sdp->sd_max_dirres, }; | ||
475 | int error; | 477 | int error; |
476 | 478 | ||
477 | if (arq) { | 479 | if (arq) { |
@@ -479,7 +481,7 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name, | |||
479 | if (error) | 481 | if (error) |
480 | goto fail_quota_locks; | 482 | goto fail_quota_locks; |
481 | 483 | ||
482 | error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres, 0); | 484 | error = gfs2_inplace_reserve(dip, &ap); |
483 | if (error) | 485 | if (error) |
484 | goto fail_quota_locks; | 486 | goto fail_quota_locks; |
485 | 487 | ||
@@ -584,17 +586,17 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry, | |||
584 | if (!IS_ERR(inode)) { | 586 | if (!IS_ERR(inode)) { |
585 | d = d_splice_alias(inode, dentry); | 587 | d = d_splice_alias(inode, dentry); |
586 | error = 0; | 588 | error = 0; |
587 | if (file && !IS_ERR(d)) { | 589 | if (file) { |
588 | if (d == NULL) | 590 | if (S_ISREG(inode->i_mode)) { |
589 | d = dentry; | 591 | WARN_ON(d != NULL); |
590 | if (S_ISREG(inode->i_mode)) | 592 | error = finish_open(file, dentry, gfs2_open_common, opened); |
591 | error = finish_open(file, d, gfs2_open_common, opened); | 593 | } else { |
592 | else | ||
593 | error = finish_no_open(file, d); | 594 | error = finish_no_open(file, d); |
595 | } | ||
596 | } else { | ||
597 | dput(d); | ||
594 | } | 598 | } |
595 | gfs2_glock_dq_uninit(ghs); | 599 | gfs2_glock_dq_uninit(ghs); |
596 | if (IS_ERR(d)) | ||
597 | return PTR_ERR(d); | ||
598 | return error; | 600 | return error; |
599 | } else if (error != -ENOENT) { | 601 | } else if (error != -ENOENT) { |
600 | goto fail_gunlock; | 602 | goto fail_gunlock; |
@@ -713,7 +715,7 @@ fail_gunlock2: | |||
713 | fail_free_inode: | 715 | fail_free_inode: |
714 | if (ip->i_gl) | 716 | if (ip->i_gl) |
715 | gfs2_glock_put(ip->i_gl); | 717 | gfs2_glock_put(ip->i_gl); |
716 | gfs2_rs_delete(ip); | 718 | gfs2_rs_delete(ip, NULL); |
717 | free_inode_nonrcu(inode); | 719 | free_inode_nonrcu(inode); |
718 | inode = NULL; | 720 | inode = NULL; |
719 | fail_gunlock: | 721 | fail_gunlock: |
@@ -781,8 +783,10 @@ static struct dentry *__gfs2_lookup(struct inode *dir, struct dentry *dentry, | |||
781 | error = finish_open(file, dentry, gfs2_open_common, opened); | 783 | error = finish_open(file, dentry, gfs2_open_common, opened); |
782 | 784 | ||
783 | gfs2_glock_dq_uninit(&gh); | 785 | gfs2_glock_dq_uninit(&gh); |
784 | if (error) | 786 | if (error) { |
787 | dput(d); | ||
785 | return ERR_PTR(error); | 788 | return ERR_PTR(error); |
789 | } | ||
786 | return d; | 790 | return d; |
787 | } | 791 | } |
788 | 792 | ||
@@ -874,11 +878,12 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir, | |||
874 | error = 0; | 878 | error = 0; |
875 | 879 | ||
876 | if (alloc_required) { | 880 | if (alloc_required) { |
881 | struct gfs2_alloc_parms ap = { .target = sdp->sd_max_dirres, }; | ||
877 | error = gfs2_quota_lock_check(dip); | 882 | error = gfs2_quota_lock_check(dip); |
878 | if (error) | 883 | if (error) |
879 | goto out_gunlock; | 884 | goto out_gunlock; |
880 | 885 | ||
881 | error = gfs2_inplace_reserve(dip, sdp->sd_max_dirres, 0); | 886 | error = gfs2_inplace_reserve(dip, &ap); |
882 | if (error) | 887 | if (error) |
883 | goto out_gunlock_q; | 888 | goto out_gunlock_q; |
884 | 889 | ||
@@ -1163,14 +1168,16 @@ static int gfs2_atomic_open(struct inode *dir, struct dentry *dentry, | |||
1163 | d = __gfs2_lookup(dir, dentry, file, opened); | 1168 | d = __gfs2_lookup(dir, dentry, file, opened); |
1164 | if (IS_ERR(d)) | 1169 | if (IS_ERR(d)) |
1165 | return PTR_ERR(d); | 1170 | return PTR_ERR(d); |
1166 | if (d == NULL) | 1171 | if (d != NULL) |
1167 | d = dentry; | 1172 | dentry = d; |
1168 | if (d->d_inode) { | 1173 | if (dentry->d_inode) { |
1169 | if (!(*opened & FILE_OPENED)) | 1174 | if (!(*opened & FILE_OPENED)) |
1170 | return finish_no_open(file, d); | 1175 | return finish_no_open(file, dentry); |
1176 | dput(d); | ||
1171 | return 0; | 1177 | return 0; |
1172 | } | 1178 | } |
1173 | 1179 | ||
1180 | BUG_ON(d != NULL); | ||
1174 | if (!(flags & O_CREAT)) | 1181 | if (!(flags & O_CREAT)) |
1175 | return -ENOENT; | 1182 | return -ENOENT; |
1176 | 1183 | ||
@@ -1385,11 +1392,12 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, | |||
1385 | goto out_gunlock; | 1392 | goto out_gunlock; |
1386 | 1393 | ||
1387 | if (alloc_required) { | 1394 | if (alloc_required) { |
1395 | struct gfs2_alloc_parms ap = { .target = sdp->sd_max_dirres, }; | ||
1388 | error = gfs2_quota_lock_check(ndip); | 1396 | error = gfs2_quota_lock_check(ndip); |
1389 | if (error) | 1397 | if (error) |
1390 | goto out_gunlock; | 1398 | goto out_gunlock; |
1391 | 1399 | ||
1392 | error = gfs2_inplace_reserve(ndip, sdp->sd_max_dirres, 0); | 1400 | error = gfs2_inplace_reserve(ndip, &ap); |
1393 | if (error) | 1401 | if (error) |
1394 | goto out_gunlock_q; | 1402 | goto out_gunlock_q; |
1395 | 1403 | ||