]> Pileus Git - ~andy/linux/commitdiff
[GFS2] Fix for root inode ref count bug
authorSteven Whitehouse <swhiteho@redhat.com>
Mon, 13 Feb 2006 12:27:43 +0000 (12:27 +0000)
committerSteven Whitehouse <swhiteho@redhat.com>
Mon, 13 Feb 2006 12:27:43 +0000 (12:27 +0000)
Umount is now working correctly again. The bug was due to
not getting an extra ref count when mounting the fs. We
should have bumped it by two (once for the internal pointer
to the root inode from the super block and once for the
inode hanging off the dcache entry for root).

Also this patch tidys up the code dealing with looking up
and creating inodes. We now pass Linux inodes (with gfs2_inodes
attached) rather than the other way around and this reduces code
duplication in various places.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
12 files changed:
fs/gfs2/glops.c
fs/gfs2/incore.h
fs/gfs2/inode.c
fs/gfs2/inode.h
fs/gfs2/log.c
fs/gfs2/lops.c
fs/gfs2/ops_export.c
fs/gfs2/ops_fstype.c
fs/gfs2/ops_inode.c
fs/gfs2/quota.c
fs/gfs2/recovery.c
fs/gfs2/super.c

index 127008146a5798880649d3b90a63c6fdabe4da6c..27374306ecdedec04699e3a90e44104e36eb506b 100644 (file)
@@ -358,13 +358,13 @@ static void trans_go_xmote_th(struct gfs2_glock *gl, unsigned int state,
 static void trans_go_xmote_bh(struct gfs2_glock *gl)
 {
        struct gfs2_sbd *sdp = gl->gl_sbd;
-       struct gfs2_glock *j_gl = sdp->sd_jdesc->jd_inode->i_gl;
+       struct gfs2_glock *j_gl = get_v2ip(sdp->sd_jdesc->jd_inode)->i_gl;
        struct gfs2_log_header head;
        int error;
 
        if (gl->gl_state != LM_ST_UNLOCKED &&
            test_bit(SDF_JOURNAL_LIVE, &sdp->sd_flags)) {
-               gfs2_meta_cache_flush(sdp->sd_jdesc->jd_inode);
+               gfs2_meta_cache_flush(get_v2ip(sdp->sd_jdesc->jd_inode));
                j_gl->gl_ops->go_inval(j_gl, DIO_METADATA | DIO_DATA);
 
                error = gfs2_find_jhead(sdp->sd_jdesc, &head);
index d1954e2bb9084c69e262a69a31756f141625c61b..e43a0475d0d842972fb18af6cc2ad521cd4d9f33 100644 (file)
@@ -378,7 +378,7 @@ struct gfs2_ail {
 struct gfs2_jdesc {
        struct list_head jd_list;
 
-       struct gfs2_inode *jd_inode;
+       struct inode *jd_inode;
        unsigned int jd_jid;
        int jd_dirty;
 
index 4c193e38f8e4f02e8fff2e8bf6c78d24d149191c..2a00b96eac01bba19b95f9219254f51354be065e 100644 (file)
@@ -711,24 +711,28 @@ int gfs2_change_nlink(struct gfs2_inode *ip, int diff)
  * Returns: errno
  */
 
-int gfs2_lookupi(struct gfs2_inode *dip, struct qstr *name, int is_root,
-                struct gfs2_inode **ipp)
+int gfs2_lookupi(struct inode *dir, struct qstr *name, int is_root,
+                struct inode **inodep)
 {
+       struct gfs2_inode *ipp;
+       struct gfs2_inode *dip = get_v2ip(dir);
        struct gfs2_sbd *sdp = dip->i_sbd;
        struct gfs2_holder d_gh;
        struct gfs2_inum inum;
        unsigned int type;
        struct gfs2_glock *gl;
-       int error;
+       int error = 0;
+
+       *inodep = NULL;
 
        if (!name->len || name->len > GFS2_FNAMESIZE)
                return -ENAMETOOLONG;
 
        if (gfs2_filecmp(name, ".", 1) ||
-           (gfs2_filecmp(name, "..", 2) && dip == get_v2ip(sdp->sd_root_dir))) {
+           (gfs2_filecmp(name, "..", 2) && dir == sdp->sd_root_dir)) {
                gfs2_inode_hold(dip);
-               *ipp = dip;
-               return 0;
+               ipp = dip;
+               goto done;
        }
 
        error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
@@ -750,15 +754,21 @@ int gfs2_lookupi(struct gfs2_inode *dip, struct qstr *name, int is_root,
        if (error)
                goto out;
 
-       error = gfs2_inode_get(gl, &inum, CREATE, ipp);
+       error = gfs2_inode_get(gl, &inum, CREATE, &ipp);
        if (!error)
-               gfs2_inode_min_init(*ipp, type);
+               gfs2_inode_min_init(ipp, type);
 
        gfs2_glock_put(gl);
 
- out:
+out:
        gfs2_glock_dq_uninit(&d_gh);
-
+done:
+       if (error == 0) {
+               *inodep = gfs2_ip2v(ipp);
+               if (!*inodep)
+                       error = -ENOMEM;
+               gfs2_inode_put(ipp);
+       }
        return error;
 }
 
@@ -1171,15 +1181,16 @@ static int link_dinode(struct gfs2_inode *dip, struct qstr *name,
  * @ghs[0] is an initialized holder for the directory
  * @ghs[1] is the holder for the inode lock
  *
- * If the return value is 0, the glocks on both the directory and the new
+ * If the return value is not NULL, the glocks on both the directory and the new
  * file are held.  A transaction has been started and an inplace reservation
  * is held, as well.
  *
- * Returns: errno
+ * Returns: An inode
  */
 
-int gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode)
+struct inode *gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode)
 {
+       struct inode *inode;
        struct gfs2_inode *dip = get_gl2ip(ghs->gh_gl);
        struct gfs2_sbd *sdp = dip->i_sbd;
        struct gfs2_unlinked *ul;
@@ -1187,11 +1198,11 @@ int gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode)
        int error;
 
        if (!name->len || name->len > GFS2_FNAMESIZE)
-               return -ENAMETOOLONG;
+               return ERR_PTR(-ENAMETOOLONG);
 
        error = gfs2_unlinked_get(sdp, &ul);
        if (error)
-               return error;
+               return ERR_PTR(error);
 
        gfs2_holder_reinit(LM_ST_EXCLUSIVE, 0, ghs);
        error = gfs2_glock_nq(ghs);
@@ -1220,7 +1231,7 @@ int gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode)
                                          ghs + 1);
                if (error) {
                        gfs2_unlinked_put(sdp, ul);
-                       return error;
+                       return ERR_PTR(error);
                }
 
                gfs2_holder_reinit(LM_ST_EXCLUSIVE, 0, ghs);
@@ -1228,7 +1239,7 @@ int gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode)
                if (error) {
                        gfs2_glock_dq_uninit(ghs + 1);
                        gfs2_unlinked_put(sdp, ul);
-                       return error;
+                       return ERR_PTR(error);
                }
 
                error = create_ok(dip, name, mode);
@@ -1266,7 +1277,11 @@ int gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode)
 
        gfs2_unlinked_put(sdp, ul);
 
-       return 0;
+       inode = gfs2_ip2v(ip);
+       gfs2_inode_put(ip);
+       if (!inode)
+               return ERR_PTR(-ENOMEM);
+       return inode;
 
  fail_iput:
        gfs2_inode_put(ip);
@@ -1280,7 +1295,7 @@ int gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode)
  fail:
        gfs2_unlinked_put(sdp, ul);
 
-       return error;
+       return ERR_PTR(error);
 }
 
 /**
@@ -1445,7 +1460,8 @@ int gfs2_unlink_ok(struct gfs2_inode *dip, struct qstr *name,
 int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to)
 {
        struct gfs2_sbd *sdp = this->i_sbd;
-       struct gfs2_inode *tmp;
+       struct inode *dir = to->i_vnode;
+       struct inode *tmp;
        struct qstr dotdot;
        int error = 0;
 
@@ -1453,27 +1469,27 @@ int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to)
        dotdot.name = "..";
        dotdot.len = 2;
 
-       gfs2_inode_hold(to);
+       igrab(dir);
 
        for (;;) {
-               if (to == this) {
+               if (dir == this->i_vnode) {
                        error = -EINVAL;
                        break;
                }
-               if (to == get_v2ip(sdp->sd_root_dir)) {
+               if (dir == sdp->sd_root_dir) {
                        error = 0;
                        break;
                }
 
-               error = gfs2_lookupi(to, &dotdot, 1, &tmp);
+               error = gfs2_lookupi(dir, &dotdot, 1, &tmp);
                if (error)
                        break;
 
-               gfs2_inode_put(to);
-               to = tmp;
+               iput(dir);
+               dir = tmp;
        }
 
-       gfs2_inode_put(to);
+       iput(dir);
 
        return error;
 }
index 214975c6bb22ae1828c553e5a9e652a644ca857d..8ef85f5feb1bf6f9afe616a1f11a3f39ba2a4a02 100644 (file)
@@ -44,9 +44,9 @@ void gfs2_inode_destroy(struct gfs2_inode *ip);
 int gfs2_inode_dealloc(struct gfs2_sbd *sdp, struct gfs2_unlinked *ul);
 
 int gfs2_change_nlink(struct gfs2_inode *ip, int diff);
-int gfs2_lookupi(struct gfs2_inode *dip, struct qstr *name, int is_root,
-                struct gfs2_inode **ipp);
-int gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode);
+int gfs2_lookupi(struct inode *dir, struct qstr *name, int is_root,
+                struct inode **ipp);
+struct inode *gfs2_createi(struct gfs2_holder *ghs, struct qstr *name, unsigned int mode);
 int gfs2_unlinki(struct gfs2_inode *dip, struct qstr *name,
                 struct gfs2_inode *ip, struct gfs2_unlinked *ul);
 int gfs2_rmdiri(struct gfs2_inode *dip, struct qstr *name,
@@ -68,19 +68,12 @@ int gfs2_repermission(struct inode *inode, int mask, struct nameidata *nd);
 static inline int gfs2_lookup_simple(struct inode *dip, char *name,
                                     struct inode **ipp)
 {
-       struct gfs2_inode *ip;
        struct qstr qstr;
        int err;
        memset(&qstr, 0, sizeof(struct qstr));
        qstr.name = name;
        qstr.len = strlen(name);
-       err = gfs2_lookupi(get_v2ip(dip), &qstr, 1, &ip);
-       if (err == 0) {
-               *ipp = gfs2_ip2v(ip);
-               gfs2_inode_put(ip);
-               if (*ipp == NULL)
-                       err = -ENOMEM;
-       }
+       err = gfs2_lookupi(dip, &qstr, 1, ipp);
        return err;
 }
 
index 9b4484d366caad28ba02fec3e12aa0d129f02e59..49190a29dd4f0a7af12ea08fa0a5ad9831cd6fdb 100644 (file)
@@ -274,7 +274,7 @@ static uint64_t log_bmap(struct gfs2_sbd *sdp, unsigned int lbn)
        uint64_t dbn;
        int error;
 
-       error = gfs2_block_map(sdp->sd_jdesc->jd_inode, lbn, &new, &dbn, NULL);
+       error = gfs2_block_map(get_v2ip(sdp->sd_jdesc->jd_inode), lbn, &new, &dbn, NULL);
        gfs2_assert_withdraw(sdp, !error && dbn);
 
        return dbn;
index dd41863810d7cb8c8f9e6b93cec1e91c0ca763f3..23be00141901b79143da22e999eae0132a8fce46 100644 (file)
@@ -177,7 +177,7 @@ static void buf_lo_after_commit(struct gfs2_sbd *sdp, struct gfs2_ail *ai)
 static void buf_lo_before_scan(struct gfs2_jdesc *jd,
                               struct gfs2_log_header *head, int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
 
        if (pass != 0)
                return;
@@ -190,8 +190,8 @@ static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
                                struct gfs2_log_descriptor *ld, __be64 *ptr,
                                int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
-       struct gfs2_glock *gl = jd->jd_inode->i_gl;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
+       struct gfs2_glock *gl = get_v2ip(jd->jd_inode)->i_gl;
        unsigned int blks = be32_to_cpu(ld->ld_data1);
        struct buffer_head *bh_log, *bh_ip;
        uint64_t blkno;
@@ -236,16 +236,16 @@ static int buf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
 
 static void buf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
 
        if (error) {
-               gfs2_meta_sync(jd->jd_inode->i_gl, DIO_START | DIO_WAIT);
+               gfs2_meta_sync(get_v2ip(jd->jd_inode)->i_gl, DIO_START | DIO_WAIT);
                return;
        }
        if (pass != 1)
                return;
 
-       gfs2_meta_sync(jd->jd_inode->i_gl, DIO_START | DIO_WAIT);
+       gfs2_meta_sync(get_v2ip(jd->jd_inode)->i_gl, DIO_START | DIO_WAIT);
 
        fs_info(sdp, "jid=%u: Replayed %u of %u blocks\n",
                jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
@@ -320,7 +320,7 @@ static void revoke_lo_before_commit(struct gfs2_sbd *sdp)
 static void revoke_lo_before_scan(struct gfs2_jdesc *jd,
                                  struct gfs2_log_header *head, int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
 
        if (pass != 0)
                return;
@@ -333,7 +333,7 @@ static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
                                   struct gfs2_log_descriptor *ld, __be64 *ptr,
                                   int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
        unsigned int blks = be32_to_cpu(ld->ld_length);
        unsigned int revokes = be32_to_cpu(ld->ld_data1);
        struct buffer_head *bh;
@@ -379,7 +379,7 @@ static int revoke_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
 
 static void revoke_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
 
        if (error) {
                gfs2_revoke_clean(sdp);
@@ -458,8 +458,6 @@ static void databuf_lo_add(struct gfs2_sbd *sdp, struct gfs2_log_element *le)
                gfs2_trans_add_gl(bd->bd_gl);
                list_add(&bd->bd_list_tr, &tr->tr_list_buf);
                gfs2_pin(sdp, bd->bd_bh);
-       } else {
-               clear_buffer_pinned(bd->bd_bh);
        }
        gfs2_log_lock(sdp);
        if (ip->i_di.di_flags & GFS2_DIF_JDATA)
@@ -630,8 +628,8 @@ static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
                                    struct gfs2_log_descriptor *ld,
                                    __be64 *ptr, int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
-       struct gfs2_glock *gl = jd->jd_inode->i_gl;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
+       struct gfs2_glock *gl = get_v2ip(jd->jd_inode)->i_gl;
        unsigned int blks = be32_to_cpu(ld->ld_data1);
        struct buffer_head *bh_log, *bh_ip;
        uint64_t blkno;
@@ -680,17 +678,17 @@ static int databuf_lo_scan_elements(struct gfs2_jdesc *jd, unsigned int start,
 
 static void databuf_lo_after_scan(struct gfs2_jdesc *jd, int error, int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
 
        if (error) {
-               gfs2_meta_sync(jd->jd_inode->i_gl, DIO_START | DIO_WAIT);
+               gfs2_meta_sync(get_v2ip(jd->jd_inode)->i_gl, DIO_START | DIO_WAIT);
                return;
        }
        if (pass != 1)
                return;
 
        /* data sync? */
-       gfs2_meta_sync(jd->jd_inode->i_gl, DIO_START | DIO_WAIT);
+       gfs2_meta_sync(get_v2ip(jd->jd_inode)->i_gl, DIO_START | DIO_WAIT);
 
        fs_info(sdp, "jid=%u: Replayed %u of %u data blocks\n",
                jd->jd_jid, sdp->sd_replayed_blocks, sdp->sd_found_blocks);
index 335448d3be2193330efbc35a65c0b5fd99181c3c..8389f771d28bb0954a9469ecb90d00d25bc10604 100644 (file)
@@ -169,23 +169,16 @@ static struct dentry *gfs2_get_parent(struct dentry *child)
 {
        struct gfs2_inode *dip = get_v2ip(child->d_inode);
        struct qstr dotdot = { .name = "..", .len = 2 };
-       struct gfs2_inode *ip;
        struct inode *inode;
        struct dentry *dentry;
        int error;
 
        atomic_inc(&dip->i_sbd->sd_ops_export);
 
-       error = gfs2_lookupi(dip, &dotdot, 1, &ip);
+       error = gfs2_lookupi(child->d_inode, &dotdot, 1, &inode);
        if (error)
                return ERR_PTR(error);
 
-       inode = gfs2_ip2v(ip);
-       gfs2_inode_put(ip);
-
-       if (!inode)
-               return ERR_PTR(-ENOMEM);
-
        dentry = d_alloc_anon(inode);
        if (!dentry) {
                iput(inode);
index 139cef8fff3a2b886e0e636e39189e9b1420a30e..80d5582d9d9b884a086d3182e98a3d6c33ec3e72 100644 (file)
@@ -360,6 +360,7 @@ static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
                goto out_rooti;
        }
 
+       igrab(inode);
        sb->s_root = d_alloc_root(inode);
        if (!sb->s_root) {
                fs_err(sdp, "can't get root dentry\n");
@@ -434,7 +435,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo)
                        goto fail_jindex;
                }
 
-               error = gfs2_glock_nq_init(sdp->sd_jdesc->jd_inode->i_gl,
+               error = gfs2_glock_nq_init(get_v2ip(sdp->sd_jdesc->jd_inode)->i_gl,
                                           LM_ST_SHARED,
                                           LM_FLAG_NOEXP | GL_EXACT,
                                           &sdp->sd_jinode_gh);
index 6fff30ef8b70238b2c450435a232f61d61445e87..9fb9490eb67afe8e256a661f595aed8eebd027af 100644 (file)
@@ -49,7 +49,7 @@
 static int gfs2_create(struct inode *dir, struct dentry *dentry,
                       int mode, struct nameidata *nd)
 {
-       struct gfs2_inode *dip = get_v2ip(dir), *ip;
+       struct gfs2_inode *dip = get_v2ip(dir);
        struct gfs2_sbd *sdp = dip->i_sbd;
        struct gfs2_holder ghs[2];
        struct inode *inode;
@@ -61,9 +61,8 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
        for (;;) {
-               error = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode);
-               if (!error) {
-                       ip = get_gl2ip(ghs[1].gh_gl);
+               inode = gfs2_createi(ghs, &dentry->d_name, S_IFREG | mode);
+               if (!IS_ERR(inode)) {
                        gfs2_trans_end(sdp);
                        if (dip->i_alloc.al_rgd)
                                gfs2_inplace_release(dip);
@@ -71,13 +70,13 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
                        gfs2_alloc_put(dip);
                        gfs2_glock_dq_uninit_m(2, ghs);
                        break;
-               } else if (error != -EEXIST ||
+               } else if (PTR_ERR(inode) != -EEXIST ||
                           (nd->intent.open.flags & O_EXCL)) {
                        gfs2_holder_uninit(ghs);
-                       return error;
+                       return PTR_ERR(inode);
                }
 
-               error = gfs2_lookupi(dip, &dentry->d_name, 0, &ip);
+               error = gfs2_lookupi(dir, &dentry->d_name, 0, &inode);
                if (!error) {
                        new = 0;
                        gfs2_holder_uninit(ghs);
@@ -88,12 +87,6 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
                }
        }
 
-       inode = gfs2_ip2v(ip);
-       gfs2_inode_put(ip);
-
-       if (!inode)
-               return -ENOMEM;
-
        d_instantiate(dentry, inode);
        if (new)
                mark_inode_dirty(inode);
@@ -115,7 +108,7 @@ static int gfs2_create(struct inode *dir, struct dentry *dentry,
 static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry,
                                  struct nameidata *nd)
 {
-       struct gfs2_inode *dip = get_v2ip(dir), *ip;
+       struct gfs2_inode *dip = get_v2ip(dir);
        struct gfs2_sbd *sdp = dip->i_sbd;
        struct inode *inode = NULL;
        int error;
@@ -125,14 +118,8 @@ static struct dentry *gfs2_lookup(struct inode *dir, struct dentry *dentry,
        if (!sdp->sd_args.ar_localcaching)
                dentry->d_op = &gfs2_dops;
 
-       error = gfs2_lookupi(dip, &dentry->d_name, 0, &ip);
-       if (!error) {
-               inode = gfs2_ip2v(ip);
-               gfs2_inode_put(ip);
-               if (!inode)
-                       return ERR_PTR(-ENOMEM);
-
-       } else if (error != -ENOENT)
+       error = gfs2_lookupi(dir, &dentry->d_name, 0, &inode);
+       if (error && error != -ENOENT)
                return ERR_PTR(error);
 
        if (inode)
@@ -367,10 +354,10 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
 
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
-       error = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO);
-       if (error) {
+       inode = gfs2_createi(ghs, &dentry->d_name, S_IFLNK | S_IRWXUGO);
+       if (IS_ERR(inode)) {
                gfs2_holder_uninit(ghs);
-               return error;
+               return PTR_ERR(inode);
        }
 
        ip = get_gl2ip(ghs[1].gh_gl);
@@ -394,12 +381,6 @@ static int gfs2_symlink(struct inode *dir, struct dentry *dentry,
 
        gfs2_glock_dq_uninit_m(2, ghs);
 
-       inode = gfs2_ip2v(ip);
-       gfs2_inode_put(ip);
-
-       if (!inode)
-               return -ENOMEM;
-
        d_instantiate(dentry, inode);
        mark_inode_dirty(inode);
 
@@ -428,10 +409,10 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
-       error = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode);
-       if (error) {
+       inode = gfs2_createi(ghs, &dentry->d_name, S_IFDIR | mode);
+       if (IS_ERR(inode)) {
                gfs2_holder_uninit(ghs);
-               return error;
+               return PTR_ERR(inode);
        }
 
        ip = get_gl2ip(ghs[1].gh_gl);
@@ -481,12 +462,6 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 
        gfs2_glock_dq_uninit_m(2, ghs);
 
-       inode = gfs2_ip2v(ip);
-       gfs2_inode_put(ip);
-
-       if (!inode)
-               return -ENOMEM;
-
        d_instantiate(dentry, inode);
        mark_inode_dirty(inode);
 
@@ -598,10 +573,10 @@ static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode,
 
        gfs2_holder_init(dip->i_gl, 0, 0, ghs);
 
-       error = gfs2_createi(ghs, &dentry->d_name, mode);
-       if (error) {
+       inode = gfs2_createi(ghs, &dentry->d_name, mode);
+       if (IS_ERR(inode)) {
                gfs2_holder_uninit(ghs);
-               return error;
+               return PTR_ERR(inode);
        }
 
        ip = get_gl2ip(ghs[1].gh_gl);
@@ -624,12 +599,6 @@ static int gfs2_mknod(struct inode *dir, struct dentry *dentry, int mode,
 
        gfs2_glock_dq_uninit_m(2, ghs);
 
-       inode = gfs2_ip2v(ip);
-       gfs2_inode_put(ip);
-
-       if (!inode)
-               return -ENOMEM;
-
        d_instantiate(dentry, inode);
        mark_inode_dirty(inode);
 
index 138fdf559a9aac7436981da6f111eca5e6cbb973..7b5573946f19090cae18d6e31988ce96a0e6eda2 100644 (file)
@@ -572,7 +572,7 @@ static void do_qc(struct gfs2_quota_data *qd, int64_t change)
 static int gfs2_adjust_quota(struct gfs2_inode *ip, loff_t loc,
                             int64_t change, struct gfs2_quota_data *qd)
 {
-       struct inode *inode = gfs2_ip2v(ip);
+       struct inode *inode = ip->i_vnode;
        struct address_space *mapping = inode->i_mapping;
        unsigned long index = loc >> PAGE_CACHE_SHIFT;
        unsigned offset = loc & (PAGE_CACHE_SHIFT - 1);
index 15cd26fbcff9dbcdb2288bccb3dbe2ae0286c87f..bcb81c768c8b86fd8d46dbb4ddca45555a03b0f4 100644 (file)
 int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk,
                           struct buffer_head **bh)
 {
-       struct gfs2_glock *gl = jd->jd_inode->i_gl;
+       struct gfs2_glock *gl = get_v2ip(jd->jd_inode)->i_gl;
        int new = 0;
        uint64_t dblock;
        uint32_t extlen;
        int error;
 
-       error = gfs2_block_map(jd->jd_inode, blk, &new, &dblock, &extlen);
+       error = gfs2_block_map(get_v2ip(jd->jd_inode), blk, &new, &dblock, &extlen);
        if (error)
                return error;
        if (!dblock) {
-               gfs2_consist_inode(jd->jd_inode);
+               gfs2_consist_inode(get_v2ip(jd->jd_inode));
                return -EIO;
        }
 
@@ -184,7 +184,7 @@ static int find_good_lh(struct gfs2_jdesc *jd, unsigned int *blk,
                        *blk = 0;
 
                if (*blk == orig_blk) {
-                       gfs2_consist_inode(jd->jd_inode);
+                       gfs2_consist_inode(get_v2ip(jd->jd_inode));
                        return -EIO;
                }
        }
@@ -218,7 +218,7 @@ static int jhead_scan(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
                        continue;
 
                if (lh.lh_sequence == head->lh_sequence) {
-                       gfs2_consist_inode(jd->jd_inode);
+                       gfs2_consist_inode(get_v2ip(jd->jd_inode));
                        return -EIO;
                }
                if (lh.lh_sequence < head->lh_sequence)
@@ -294,7 +294,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
 static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start,
                              unsigned int end, int pass)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
        struct buffer_head *bh;
        struct gfs2_log_descriptor *ld;
        int error = 0;
@@ -323,7 +323,7 @@ static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start,
                                continue;
                        }
                        if (error == 1) {
-                               gfs2_consist_inode(jd->jd_inode);
+                               gfs2_consist_inode(get_v2ip(jd->jd_inode));
                                error = -EIO;
                        }
                        brelse(bh);
@@ -360,7 +360,7 @@ static int foreach_descriptor(struct gfs2_jdesc *jd, unsigned int start,
 
 static int clean_journal(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
 {
-       struct gfs2_inode *ip = jd->jd_inode;
+       struct gfs2_inode *ip = get_v2ip(jd->jd_inode);
        struct gfs2_sbd *sdp = ip->i_sbd;
        unsigned int lblock;
        int new = 0;
@@ -419,7 +419,7 @@ static int clean_journal(struct gfs2_jdesc *jd, struct gfs2_log_header *head)
 
 int gfs2_recover_journal(struct gfs2_jdesc *jd, int wait)
 {
-       struct gfs2_sbd *sdp = jd->jd_inode->i_sbd;
+       struct gfs2_sbd *sdp = get_v2ip(jd->jd_inode)->i_sbd;
        struct gfs2_log_header head;
        struct gfs2_holder j_gh, ji_gh, t_gh;
        unsigned long t;
@@ -449,7 +449,7 @@ int gfs2_recover_journal(struct gfs2_jdesc *jd, int wait)
                goto fail;
        };
 
-       error = gfs2_glock_nq_init(jd->jd_inode->i_gl, LM_ST_SHARED,
+       error = gfs2_glock_nq_init(get_v2ip(jd->jd_inode)->i_gl, LM_ST_SHARED,
                                   LM_FLAG_NOEXP, &ji_gh);
        if (error)
                goto fail_gunlock_j;
index bae32ba0c481a35323ab8d34b2e65d0ba0740209..9b5c31952c5da049d27eaaa2361f92669cef35e5 100644 (file)
@@ -305,7 +305,7 @@ int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
                if (!jd)
                        break;
 
-               error = gfs2_lookupi(dip, &name, 1, &jd->jd_inode);
+               error = gfs2_lookupi(sdp->sd_jindex, &name, 1, &jd->jd_inode);
                if (error) {
                        kfree(jd);
                        break;
@@ -342,7 +342,7 @@ void gfs2_jindex_free(struct gfs2_sbd *sdp)
        while (!list_empty(&list)) {
                jd = list_entry(list.next, struct gfs2_jdesc, jd_list);
                list_del(&jd->jd_list);
-               gfs2_inode_put(jd->jd_inode);
+               iput(jd->jd_inode);
                kfree(jd);
        }
 }
@@ -411,7 +411,7 @@ struct gfs2_jdesc *gfs2_jdesc_find_dirty(struct gfs2_sbd *sdp)
 
 int gfs2_jdesc_check(struct gfs2_jdesc *jd)
 {
-       struct gfs2_inode *ip = jd->jd_inode;
+       struct gfs2_inode *ip = get_v2ip(jd->jd_inode);
        struct gfs2_sbd *sdp = ip->i_sbd;
        int ar;
        int error;
@@ -462,7 +462,7 @@ int gfs2_lookup_master_dir(struct gfs2_sbd *sdp)
 
 int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
 {
-       struct gfs2_glock *j_gl = sdp->sd_jdesc->jd_inode->i_gl;
+       struct gfs2_glock *j_gl = get_v2ip(sdp->sd_jdesc->jd_inode)->i_gl;
        struct gfs2_holder t_gh;
        struct gfs2_log_header head;
        int error;
@@ -472,7 +472,7 @@ int gfs2_make_fs_rw(struct gfs2_sbd *sdp)
        if (error)
                return error;
 
-       gfs2_meta_cache_flush(sdp->sd_jdesc->jd_inode);
+       gfs2_meta_cache_flush(get_v2ip(sdp->sd_jdesc->jd_inode));
        j_gl->gl_ops->go_inval(j_gl, DIO_METADATA | DIO_DATA);
 
        error = gfs2_find_jhead(sdp->sd_jdesc, &head);
@@ -854,7 +854,7 @@ int gfs2_lock_fs_check_clean(struct gfs2_sbd *sdp, struct gfs2_holder *t_gh)
                        error = -ENOMEM;
                        goto out;
                }
-               error = gfs2_glock_nq_init(jd->jd_inode->i_gl, LM_ST_SHARED, 0,
+               error = gfs2_glock_nq_init(get_v2ip(jd->jd_inode)->i_gl, LM_ST_SHARED, 0,
                                           &lfcc->gh);
                if (error) {
                        kfree(lfcc);