diff options
Diffstat (limited to 'fs/gfs2/ops_inode.c')
-rw-r--r-- | fs/gfs2/ops_inode.c | 67 |
1 files changed, 18 insertions, 49 deletions
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 6fff30ef8b70..9fb9490eb67a 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
@@ -49,7 +49,7 @@ | |||
49 | static int gfs2_create(struct inode *dir, struct dentry *dentry, | 49 | static int gfs2_create(struct inode *dir, struct dentry *dentry, |
50 | int mode, struct nameidata *nd) | 50 | int mode, struct nameidata *nd) |
51 | { | 51 | { |
52 | struct gfs2_inode *dip = get_v2ip(dir), *ip; | 52 | struct gfs2_inode *dip = get_v2ip(dir); |
53 | struct gfs2_sbd *sdp = dip->i_sbd; | 53 | struct gfs2_sbd *sdp = dip->i_sbd; |
54 | struct gfs2_holder ghs[2]; | 54 | struct gfs2_holder ghs[2]; |
55 | struct inode *inode; | 55 | struct inode *inode; |
@@ -61,9 +61,8 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry, | |||
61 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); | 61 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); |
62 | 62 | ||
63 | for (;;) { | 63 | for (;;) { |
64 | error = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode); | 64 | inode = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode); |
65 | if (!error) { | 65 | if (!IS_ERR(inode)) { |
66 | ip = get_gl2ip(ghs[1].gh_gl); | ||
67 | gfs2_trans_end(sdp); | 66 | gfs2_trans_end(sdp); |
68 | if (dip->i_alloc.al_rgd) | 67 | if (dip->i_alloc.al_rgd) |
69 | gfs2_inplace_release(dip); | 68 | gfs2_inplace_release(dip); |
@@ -71,13 +70,13 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry, | |||
71 | gfs2_alloc_put(dip); | 70 | gfs2_alloc_put(dip); |
72 | gfs2_glock_dq_uninit_m(2, ghs); | 71 | gfs2_glock_dq_uninit_m(2, ghs); |
73 | break; | 72 | break; |
74 | } else if (error != -EEXIST || | 73 | } else if (PTR_ERR(inode) != -EEXIST || |
75 | (nd->intent.open.flags & O_EXCL)) { | 74 | (nd->intent.open.flags & O_EXCL)) { |
76 | gfs2_holder_uninit(ghs); | 75 | gfs2_holder_uninit(ghs); |
77 | return error; | 76 | return PTR_ERR(inode); |
78 | } | 77 | } |
79 | 78 | ||
80 | error = gfs2_lookupi(dip, &dentry->d_name, 0, &ip); | 79 | error = gfs2_lookupi(dir, &dentry->d_name, 0, &inode); |
81 | if (!error) { | 80 | if (!error) { |
82 | new = 0; | 81 | new = 0; |
83 | gfs2_holder_uninit(ghs); | 82 | gfs2_holder_uninit(ghs); |
@@ -88,12 +87,6 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry, | |||
88 | } | 87 | } |
89 | } | 88 | } |
90 | 89 | ||
91 | inode = gfs2_ip2v(ip); | ||
92 | gfs2_inode_put(ip); | ||
93 | |||
94 | if (!inode) | ||
95 | return -ENOMEM; | ||
96 | |||
97 | d_instantiate(dentry, inode); | 90 | d_instantiate(dentry, inode); |
98 | if (new) | 91 | if (new) |
99 | mark_inode_dirty(inode); | 92 | mark_inode_dirty(inode); |
@@ -115,7 +108,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry, | |||
115 | static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry, | 108 | static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry, |
116 | struct nameidata *nd) | 109 | struct nameidata *nd) |
117 | { | 110 | { |
118 | struct gfs2_inode *dip = get_v2ip(dir), *ip; | 111 | struct gfs2_inode *dip = get_v2ip(dir); |
119 | struct gfs2_sbd *sdp = dip->i_sbd; | 112 | struct gfs2_sbd *sdp = dip->i_sbd; |
120 | struct inode *inode = NULL; | 113 | struct inode *inode = NULL; |
121 | int error; | 114 | int error; |
@@ -125,14 +118,8 @@ static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry, | |||
125 | if (!sdp->sd_args.ar_localcaching) | 118 | if (!sdp->sd_args.ar_localcaching) |
126 | dentry->d_op = &gfs2_dops; | 119 | dentry->d_op = &gfs2_dops; |
127 | 120 | ||
128 | error = gfs2_lookupi(dip, &dentry->d_name, 0, &ip); | 121 | error = gfs2_lookupi(dir, &dentry->d_name, 0, &inode); |
129 | if (!error) { | 122 | if (error && error != -ENOENT) |
130 | inode = gfs2_ip2v(ip); | ||
131 | gfs2_inode_put(ip); | ||
132 | if (!inode) | ||
133 | return ERR_PTR(-ENOMEM); | ||
134 | |||
135 | } else if (error != -ENOENT) | ||
136 | return ERR_PTR(error); | 123 | return ERR_PTR(error); |
137 | 124 | ||
138 | if (inode) | 125 | if (inode) |
@@ -367,10 +354,10 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry, | |||
367 | 354 | ||
368 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); | 355 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); |
369 | 356 | ||
370 | error = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO); | 357 | inode = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO); |
371 | if (error) { | 358 | if (IS_ERR(inode)) { |
372 | gfs2_holder_uninit(ghs); | 359 | gfs2_holder_uninit(ghs); |
373 | return error; | 360 | return PTR_ERR(inode); |
374 | } | 361 | } |
375 | 362 | ||
376 | ip = get_gl2ip(ghs[1].gh_gl); | 363 | ip = get_gl2ip(ghs[1].gh_gl); |
@@ -394,12 +381,6 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry, | |||
394 | 381 | ||
395 | gfs2_glock_dq_uninit_m(2, ghs); | 382 | gfs2_glock_dq_uninit_m(2, ghs); |
396 | 383 | ||
397 | inode = gfs2_ip2v(ip); | ||
398 | gfs2_inode_put(ip); | ||
399 | |||
400 | if (!inode) | ||
401 | return -ENOMEM; | ||
402 | |||
403 | d_instantiate(dentry, inode); | 384 | d_instantiate(dentry, inode); |
404 | mark_inode_dirty(inode); | 385 | mark_inode_dirty(inode); |
405 | 386 | ||
@@ -428,10 +409,10 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
428 | 409 | ||
429 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); | 410 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); |
430 | 411 | ||
431 | error = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode); | 412 | inode = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode); |
432 | if (error) { | 413 | if (IS_ERR(inode)) { |
433 | gfs2_holder_uninit(ghs); | 414 | gfs2_holder_uninit(ghs); |
434 | return error; | 415 | return PTR_ERR(inode); |
435 | } | 416 | } |
436 | 417 | ||
437 | ip = get_gl2ip(ghs[1].gh_gl); | 418 | ip = get_gl2ip(ghs[1].gh_gl); |
@@ -481,12 +462,6 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
481 | 462 | ||
482 | gfs2_glock_dq_uninit_m(2, ghs); | 463 | gfs2_glock_dq_uninit_m(2, ghs); |
483 | 464 | ||
484 | inode = gfs2_ip2v(ip); | ||
485 | gfs2_inode_put(ip); | ||
486 | |||
487 | if (!inode) | ||
488 | return -ENOMEM; | ||
489 | |||
490 | d_instantiate(dentry, inode); | 465 | d_instantiate(dentry, inode); |
491 | mark_inode_dirty(inode); | 466 | mark_inode_dirty(inode); |
492 | 467 | ||
@@ -598,10 +573,10 @@ static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
598 | 573 | ||
599 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); | 574 | gfs2_holder_init(dip->i_gl, 0, 0, ghs); |
600 | 575 | ||
601 | error = gfs2_createi(ghs, &dentry->d_name, mode); | 576 | inode = gfs2_createi(ghs, &dentry->d_name, mode); |
602 | if (error) { | 577 | if (IS_ERR(inode)) { |
603 | gfs2_holder_uninit(ghs); | 578 | gfs2_holder_uninit(ghs); |
604 | return error; | 579 | return PTR_ERR(inode); |
605 | } | 580 | } |
606 | 581 | ||
607 | ip = get_gl2ip(ghs[1].gh_gl); | 582 | ip = get_gl2ip(ghs[1].gh_gl); |
@@ -624,12 +599,6 @@ static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode, | |||
624 | 599 | ||
625 | gfs2_glock_dq_uninit_m(2, ghs); | 600 | gfs2_glock_dq_uninit_m(2, ghs); |
626 | 601 | ||
627 | inode = gfs2_ip2v(ip); | ||
628 | gfs2_inode_put(ip); | ||
629 | |||
630 | if (!inode) | ||
631 | return -ENOMEM; | ||
632 | |||
633 | d_instantiate(dentry, inode); | 602 | d_instantiate(dentry, inode); |
634 | mark_inode_dirty(inode); | 603 | mark_inode_dirty(inode); |
635 | 604 | ||