Before this patch, multi-block reservation structures were allocated
from a special slab. This patch folds the structure into the gfs2_inode
structure. The disadvantage is that the gfs2_inode needs more memory,
even when a file is opened read-only. The advantages are: (a) we don't
need the special slab and the extra time it takes to allocate and
deallocate from it. (b) we no longer need to worry that the structure
exists for things like quota management. (c) This also allows us to
remove the calls to get_write_access and put_write_access since we
know the structure will exist.

Signed-off-by: Bob Peterson <rpete...@redhat.com>
---
 fs/gfs2/bmap.c   | 13 ++++-------
 fs/gfs2/file.c   | 23 ++++++++-----------
 fs/gfs2/incore.h |  2 +-
 fs/gfs2/inode.c  | 23 ++++++++-----------
 fs/gfs2/main.c   | 13 ++---------
 fs/gfs2/quota.c  | 14 ++++++++----
 fs/gfs2/quota.h  |  2 +-
 fs/gfs2/rgrp.c   | 69 ++++++++------------------------------------------------
 fs/gfs2/rgrp.h   |  4 +---
 fs/gfs2/super.c  |  9 ++++----
 fs/gfs2/util.c   |  1 -
 fs/gfs2/util.h   |  1 -
 12 files changed, 50 insertions(+), 124 deletions(-)

diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 8d46ae4..6198027 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -787,8 +787,8 @@ static int do_strip(struct gfs2_inode *ip, struct 
buffer_head *dibh,
        if (error)
                goto out_rlist;
 
-       if (gfs2_rs_active(ip->i_res)) /* needs to be done with the rgrp glock 
held */
-               gfs2_rs_deltree(ip->i_res);
+       if (gfs2_rs_active(&ip->i_res)) /* needs to be done with the rgrp glock 
held */
+               gfs2_rs_deltree(&ip->i_res);
 
        error = gfs2_trans_begin(sdp, rg_blocks + RES_DINODE +
                                 RES_INDIRECT + RES_STATFS + RES_QUOTA,
@@ -1291,13 +1291,9 @@ int gfs2_setattr_size(struct inode *inode, u64 newsize)
        if (ret)
                return ret;
 
-       ret = get_write_access(inode);
-       if (ret)
-               return ret;
-
        inode_dio_wait(inode);
 
-       ret = gfs2_rsqa_alloc(ip);
+       ret = gfs2_qa_alloc(ip);
        if (ret)
                goto out;
 
@@ -1307,10 +1303,9 @@ int gfs2_setattr_size(struct inode *inode, u64 newsize)
                goto out;
        }
 
-       gfs2_rs_deltree(ip->i_res);
+       gfs2_rs_deltree(&ip->i_res);
        ret = do_shrink(inode, oldsize, newsize);
 out:
-       put_write_access(inode);
        return ret;
 }
 
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c
index b4a5bdf..184fe7a 100644
--- a/fs/gfs2/file.c
+++ b/fs/gfs2/file.c
@@ -336,8 +336,8 @@ static void gfs2_size_hint(struct file *filep, loff_t 
offset, size_t size)
        size_t blks = (size + sdp->sd_sb.sb_bsize - 1) >> 
sdp->sd_sb.sb_bsize_shift;
        int hint = min_t(size_t, INT_MAX, blks);
 
-       if (hint > atomic_read(&ip->i_res->rs_sizehint))
-               atomic_set(&ip->i_res->rs_sizehint, hint);
+       if (hint > atomic_read(&ip->i_res.rs_sizehint))
+               atomic_set(&ip->i_res.rs_sizehint, hint);
 }
 
 /**
@@ -397,14 +397,10 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, 
struct vm_fault *vmf)
        /* Update file times before taking page lock */
        file_update_time(vma->vm_file);
 
-       ret = get_write_access(inode);
+       ret = gfs2_qa_alloc(ip);
        if (ret)
                goto out;
 
-       ret = gfs2_rsqa_alloc(ip);
-       if (ret)
-               goto out_write_access;
-
        gfs2_size_hint(vma->vm_file, pos, PAGE_CACHE_SIZE);
 
        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
@@ -486,8 +482,6 @@ out_uninit:
                set_page_dirty(page);
                wait_for_stable_page(page);
        }
-out_write_access:
-       put_write_access(inode);
 out:
        sb_end_pagefault(inode->i_sb);
        return block_page_mkwrite_return(ret);
@@ -623,7 +617,7 @@ static int gfs2_release(struct inode *inode, struct file 
*file)
        if (!(file->f_mode & FMODE_WRITE))
                return 0;
 
-       gfs2_rsqa_delete(ip, &inode->i_writecount);
+       gfs2_qa_delete(ip, &inode->i_writecount);
        return 0;
 }
 
@@ -703,7 +697,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, 
struct iov_iter *from)
        struct gfs2_inode *ip = GFS2_I(file_inode(file));
        int ret;
 
-       ret = gfs2_rsqa_alloc(ip);
+       ret = gfs2_qa_alloc(ip);
        if (ret)
                return ret;
 
@@ -938,13 +932,14 @@ static long gfs2_fallocate(struct file *file, int mode, 
loff_t offset, loff_t le
        if (ret)
                goto out_unlock;
 
-       ret = gfs2_rsqa_alloc(ip);
+       ret = gfs2_qa_alloc(ip);
        if (ret)
                goto out_putw;
 
        ret = __gfs2_fallocate(file, mode, offset, len);
        if (ret)
-               gfs2_rs_deltree(ip->i_res);
+               gfs2_rs_deltree(&ip->i_res);
+
 out_putw:
        put_write_access(inode);
 out_unlock:
@@ -962,7 +957,7 @@ static ssize_t gfs2_file_splice_write(struct 
pipe_inode_info *pipe,
        int error;
        struct gfs2_inode *ip = GFS2_I(out->f_mapping->host);
 
-       error = gfs2_rsqa_alloc(ip);
+       error = gfs2_qa_alloc(ip);
        if (error)
                return (ssize_t)error;
 
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 4e946be..7114148 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -394,7 +394,7 @@ struct gfs2_inode {
        struct gfs2_holder i_iopen_gh;
        struct gfs2_holder i_gh; /* for prepare/commit_write only */
        struct gfs2_qadata *i_qadata; /* quota allocation data */
-       struct gfs2_blkreserv *i_res; /* rgrp multi-block reservation */
+       struct gfs2_blkreserv i_res; /* rgrp multi-block reservation */
        struct gfs2_rgrpd *i_rgd;
        u64 i_goal;     /* goal block for allocations */
        struct rw_semaphore i_rw_mutex;
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 537edd1..e86ae1b 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -601,7 +601,7 @@ static int gfs2_create_inode(struct inode *dir, struct 
dentry *dentry,
        if (!name->len || name->len > GFS2_FNAMESIZE)
                return -ENAMETOOLONG;
 
-       error = gfs2_rsqa_alloc(dip);
+       error = gfs2_qa_alloc(dip);
        if (error)
                return error;
 
@@ -653,7 +653,7 @@ static int gfs2_create_inode(struct inode *dir, struct 
dentry *dentry,
                goto fail_free_vfs_inode;
 
        ip = GFS2_I(inode);
-       error = gfs2_rsqa_alloc(ip);
+       error = gfs2_qa_alloc(ip);
        if (error)
                goto fail_free_acls;
 
@@ -776,7 +776,7 @@ fail_gunlock2:
 fail_free_inode:
        if (ip->i_gl)
                gfs2_glock_put(ip->i_gl);
-       gfs2_rsqa_delete(ip, NULL);
+       gfs2_qa_delete(ip, NULL);
 fail_free_acls:
        if (default_acl)
                posix_acl_release(default_acl);
@@ -898,7 +898,7 @@ static int gfs2_link(struct dentry *old_dentry, struct 
inode *dir,
        if (S_ISDIR(inode->i_mode))
                return -EPERM;
 
-       error = gfs2_rsqa_alloc(dip);
+       error = gfs2_qa_alloc(dip);
        if (error)
                return error;
 
@@ -1371,7 +1371,7 @@ static int gfs2_rename(struct inode *odir, struct dentry 
*odentry,
        if (error)
                return error;
 
-       error = gfs2_rsqa_alloc(ndip);
+       error = gfs2_qa_alloc(ndip);
        if (error)
                return error;
 
@@ -1854,11 +1854,7 @@ static int setattr_chown(struct inode *inode, struct 
iattr *attr)
        if (!(attr->ia_valid & ATTR_GID) || gid_eq(ogid, ngid))
                ogid = ngid = NO_GID_QUOTA_CHANGE;
 
-       error = get_write_access(inode);
-       if (error)
-               return error;
-
-       error = gfs2_rsqa_alloc(ip);
+       error = gfs2_qa_alloc(ip);
        if (error)
                goto out;
 
@@ -1898,7 +1894,6 @@ out_end_trans:
 out_gunlock_q:
        gfs2_quota_unlock(ip);
 out:
-       put_write_access(inode);
        return error;
 }
 
@@ -1920,7 +1915,7 @@ static int gfs2_setattr(struct dentry *dentry, struct 
iattr *attr)
        struct gfs2_holder i_gh;
        int error;
 
-       error = gfs2_rsqa_alloc(ip);
+       error = gfs2_qa_alloc(ip);
        if (error)
                return error;
 
@@ -2002,7 +1997,7 @@ static int gfs2_setxattr(struct dentry *dentry, const 
char *name,
        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
        ret = gfs2_glock_nq(&gh);
        if (ret == 0) {
-               ret = gfs2_rsqa_alloc(ip);
+               ret = gfs2_qa_alloc(ip);
                if (ret == 0)
                        ret = generic_setxattr(dentry, name, data, size, flags);
                gfs2_glock_dq(&gh);
@@ -2043,7 +2038,7 @@ static int gfs2_removexattr(struct dentry *dentry, const 
char *name)
        gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
        ret = gfs2_glock_nq(&gh);
        if (ret == 0) {
-               ret = gfs2_rsqa_alloc(ip);
+               ret = gfs2_qa_alloc(ip);
                if (ret == 0)
                        ret = generic_removexattr(dentry, name);
                gfs2_glock_dq(&gh);
diff --git a/fs/gfs2/main.c b/fs/gfs2/main.c
index cde5c73..1d709d4 100644
--- a/fs/gfs2/main.c
+++ b/fs/gfs2/main.c
@@ -42,7 +42,8 @@ static void gfs2_init_inode_once(void *foo)
        init_rwsem(&ip->i_rw_mutex);
        INIT_LIST_HEAD(&ip->i_trunc_list);
        ip->i_qadata = NULL;
-       ip->i_res = NULL;
+       memset(&ip->i_res, 0, sizeof(ip->i_res));
+       RB_CLEAR_NODE(&ip->i_res.rs_node);
        ip->i_hash_cache = NULL;
 }
 
@@ -142,12 +143,6 @@ static int __init init_gfs2_fs(void)
        if (!gfs2_qadata_cachep)
                goto fail;
 
-       gfs2_rsrv_cachep = kmem_cache_create("gfs2_mblk",
-                                            sizeof(struct gfs2_blkreserv),
-                                              0, 0, NULL);
-       if (!gfs2_rsrv_cachep)
-               goto fail;
-
        register_shrinker(&gfs2_qd_shrinker);
 
        error = register_filesystem(&gfs2_fs_type);
@@ -200,9 +195,6 @@ fail_lru:
        unregister_shrinker(&gfs2_qd_shrinker);
        gfs2_glock_exit();
 
-       if (gfs2_rsrv_cachep)
-               kmem_cache_destroy(gfs2_rsrv_cachep);
-
        if (gfs2_qadata_cachep)
                kmem_cache_destroy(gfs2_qadata_cachep);
 
@@ -248,7 +240,6 @@ static void __exit exit_gfs2_fs(void)
        rcu_barrier();
 
        mempool_destroy(gfs2_page_pool);
-       kmem_cache_destroy(gfs2_rsrv_cachep);
        kmem_cache_destroy(gfs2_qadata_cachep);
        kmem_cache_destroy(gfs2_quotad_cachep);
        kmem_cache_destroy(gfs2_rgrpd_cachep);
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index 6ac9798..dc8c151 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -540,18 +540,22 @@ int gfs2_qa_alloc(struct gfs2_inode *ip)
        if (sdp->sd_args.ar_quota != GFS2_QUOTA_ON)
                return 0;
 
+       down_write(&ip->i_rw_mutex);
        ip->i_qadata = kmem_cache_zalloc(gfs2_qadata_cachep, GFP_NOFS);
        if (!ip->i_qadata)
                error = -ENOMEM;
+       up_write(&ip->i_rw_mutex);
        return error;
 }
 
-void gfs2_qa_delete(struct gfs2_inode *ip)
+void gfs2_qa_delete(struct gfs2_inode *ip, atomic_t *wcount)
 {
-       if (ip->i_qadata) {
+       down_write(&ip->i_rw_mutex);
+       if (ip->i_qadata && ((wcount == NULL) || (atomic_read(wcount) <= 1))) {
                kmem_cache_free(gfs2_qadata_cachep, ip->i_qadata);
                ip->i_qadata = NULL;
        }
+       up_write(&ip->i_rw_mutex);
 }
 
 int gfs2_quota_hold(struct gfs2_inode *ip, kuid_t uid, kgid_t gid)
@@ -561,7 +565,7 @@ int gfs2_quota_hold(struct gfs2_inode *ip, kuid_t uid, 
kgid_t gid)
        int error;
 
        if (ip->i_qadata == NULL) {
-               error = gfs2_rsqa_alloc(ip);
+               error = gfs2_qa_alloc(ip);
                if (error)
                        return error;
        }
@@ -870,7 +874,7 @@ static int do_sync(unsigned int num_qd, struct 
gfs2_quota_data **qda)
        unsigned int nalloc = 0, blocks;
        int error;
 
-       error = gfs2_rsqa_alloc(ip);
+       error = gfs2_qa_alloc(ip);
        if (error)
                return error;
 
@@ -1664,7 +1668,7 @@ static int gfs2_set_dqblk(struct super_block *sb, struct 
kqid qid,
        if (error)
                return error;
 
-       error = gfs2_rsqa_alloc(ip);
+       error = gfs2_qa_alloc(ip);
        if (error)
                goto out_put;
 
diff --git a/fs/gfs2/quota.h b/fs/gfs2/quota.h
index 1940dd9..5e47c93 100644
--- a/fs/gfs2/quota.h
+++ b/fs/gfs2/quota.h
@@ -19,7 +19,7 @@ struct gfs2_sbd;
 #define NO_GID_QUOTA_CHANGE INVALID_GID
 
 extern int gfs2_qa_alloc(struct gfs2_inode *ip);
-extern void gfs2_qa_delete(struct gfs2_inode *ip);
+extern void gfs2_qa_delete(struct gfs2_inode *ip, atomic_t *wcount);
 extern int gfs2_quota_hold(struct gfs2_inode *ip, kuid_t uid, kgid_t gid);
 extern void gfs2_quota_unhold(struct gfs2_inode *ip);
 
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index 989bad0..4d2f62e 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -595,37 +595,6 @@ void gfs2_free_clones(struct gfs2_rgrpd *rgd)
        }
 }
 
-/**
- * gfs2_rsqa_alloc - make sure we have a reservation assigned to the inode
- *                 plus a quota allocations data structure, if necessary
- * @ip: the inode for this reservation
- */
-int gfs2_rsqa_alloc(struct gfs2_inode *ip)
-{
-       int error = 0;
-
-       down_write(&ip->i_rw_mutex);
-       if (ip->i_res)
-               goto out;
-
-       ip->i_res = kmem_cache_zalloc(gfs2_rsrv_cachep, GFP_NOFS);
-       if (!ip->i_res) {
-               error = -ENOMEM;
-               goto out;
-       }
-
-       RB_CLEAR_NODE(&ip->i_res->rs_node);
-       error = gfs2_qa_alloc(ip);
-       if (error) {
-               kmem_cache_free(gfs2_rsrv_cachep, ip->i_res);
-               ip->i_res = NULL;
-       }
-
-out:
-       up_write(&ip->i_rw_mutex);
-       return error;
-}
-
 static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs)
 {
        gfs2_print_dbg(seq, "  B: n:%llu s:%llu b:%u f:%u\n",
@@ -685,26 +654,6 @@ void gfs2_rs_deltree(struct gfs2_blkreserv *rs)
 }
 
 /**
- * gfs2_rsqa_delete - delete a multi-block reservation and quota allocation
- * @ip: The inode for this reservation
- * @wcount: The inode's write count, or NULL
- *
- */
-void gfs2_rsqa_delete(struct gfs2_inode *ip, atomic_t *wcount)
-{
-       down_write(&ip->i_rw_mutex);
-       if (ip->i_res && ((wcount == NULL) || (atomic_read(wcount) <= 1))) {
-               gfs2_rs_deltree(ip->i_res);
-               BUG_ON(ip->i_res->rs_free);
-               kmem_cache_free(gfs2_rsrv_cachep, ip->i_res);
-               ip->i_res = NULL;
-
-               gfs2_qa_delete(ip);
-       }
-       up_write(&ip->i_rw_mutex);
-}
-
-/**
  * return_all_reservations - return all reserved blocks back to the rgrp.
  * @rgd: the rgrp that needs its space back
  *
@@ -1464,7 +1413,7 @@ static void rs_insert(struct gfs2_inode *ip)
 {
        struct rb_node **newn, *parent = NULL;
        int rc;
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        struct gfs2_rgrpd *rgd = rs->rs_rbm.rgd;
        u64 fsblock = gfs2_rbm_to_block(&rs->rs_rbm);
 
@@ -1511,7 +1460,7 @@ static void rg_mblk_search(struct gfs2_rgrpd *rgd, struct 
gfs2_inode *ip,
 {
        struct gfs2_rbm rbm = { .rgd = rgd, };
        u64 goal;
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        u32 extlen;
        u32 free_blocks = rgd->rd_free_clone - rgd->rd_reserved;
        int ret;
@@ -1582,7 +1531,7 @@ static u64 gfs2_next_unreserved_block(struct gfs2_rgrpd 
*rgd, u64 block,
        }
 
        if (n) {
-               while ((rs_cmp(block, length, rs) == 0) && (ip->i_res != rs)) {
+               while ((rs_cmp(block, length, rs) == 0) && (&ip->i_res != rs)) {
                        block = gfs2_rbm_to_block(&rs->rs_rbm) + rs->rs_free;
                        n = n->rb_right;
                        if (n == NULL)
@@ -1992,7 +1941,7 @@ int gfs2_inplace_reserve(struct gfs2_inode *ip, struct 
gfs2_alloc_parms *ap)
 {
        struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
        struct gfs2_rgrpd *begin = NULL;
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        int error = 0, rg_locked, flags = 0;
        u64 last_unlinked = NO_BLOCK;
        int loops = 0;
@@ -2121,7 +2070,7 @@ next_rgrp:
 
 void gfs2_inplace_release(struct gfs2_inode *ip)
 {
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
 
        if (rs->rs_rgd_gh.gh_gl)
                gfs2_glock_dq_uninit(&rs->rs_rgd_gh);
@@ -2275,7 +2224,7 @@ static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd)
 static void gfs2_adjust_reservation(struct gfs2_inode *ip,
                                    const struct gfs2_rbm *rbm, unsigned len)
 {
-       struct gfs2_blkreserv *rs = ip->i_res;
+       struct gfs2_blkreserv *rs = &ip->i_res;
        struct gfs2_rgrpd *rgd = rbm->rgd;
        unsigned rlen;
        u64 block;
@@ -2318,8 +2267,8 @@ static void gfs2_set_alloc_start(struct gfs2_rbm *rbm,
 {
        u64 goal;
 
-       if (gfs2_rs_active(ip->i_res)) {
-               *rbm = ip->i_res->rs_rbm;
+       if (gfs2_rs_active(&ip->i_res)) {
+               *rbm = ip->i_res.rs_rbm;
                return;
        }
 
@@ -2373,7 +2322,7 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, 
unsigned int *nblocks,
        gfs2_alloc_extent(&rbm, dinode, nblocks);
        block = gfs2_rbm_to_block(&rbm);
        rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0;
-       if (gfs2_rs_active(ip->i_res))
+       if (gfs2_rs_active(&ip->i_res))
                gfs2_adjust_reservation(ip, &rbm, *nblocks);
        ndata = *nblocks;
        if (dinode)
diff --git a/fs/gfs2/rgrp.h b/fs/gfs2/rgrp.h
index 06bbefa..739b8f6 100644
--- a/fs/gfs2/rgrp.h
+++ b/fs/gfs2/rgrp.h
@@ -49,9 +49,7 @@ extern void gfs2_inplace_release(struct gfs2_inode *ip);
 extern int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *n,
                             bool dinode, u64 *generation);
 
-extern int gfs2_rsqa_alloc(struct gfs2_inode *ip);
 extern void gfs2_rs_deltree(struct gfs2_blkreserv *rs);
-extern void gfs2_rsqa_delete(struct gfs2_inode *ip, atomic_t *wcount);
 extern void __gfs2_free_blocks(struct gfs2_inode *ip, u64 bstart, u32 blen, 
int meta);
 extern void gfs2_free_meta(struct gfs2_inode *ip, u64 bstart, u32 blen);
 extern void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip);
@@ -78,7 +76,7 @@ extern int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 
offset,
 extern int gfs2_fitrim(struct file *filp, void __user *argp);
 
 /* This is how to tell if a reservation is in the rgrp tree: */
-static inline bool gfs2_rs_active(struct gfs2_blkreserv *rs)
+static inline bool gfs2_rs_active(const struct gfs2_blkreserv *rs)
 {
        return rs && !RB_EMPTY_NODE(&rs->rs_node);
 }
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 5806fa6..b1ecdc4 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -1593,8 +1593,8 @@ out_truncate:
 
 out_unlock:
        /* Error path for case 1 */
-       if (gfs2_rs_active(ip->i_res))
-               gfs2_rs_deltree(ip->i_res);
+       if (gfs2_rs_active(&ip->i_res))
+               gfs2_rs_deltree(&ip->i_res);
 
        if (test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) {
                ip->i_iopen_gh.gh_flags |= GL_NOCACHE;
@@ -1607,7 +1607,7 @@ out_unlock:
 out:
        /* Case 3 starts here */
        truncate_inode_pages_final(&inode->i_data);
-       gfs2_rsqa_delete(ip, NULL);
+       gfs2_qa_delete(ip, NULL);
        gfs2_ordered_del_inode(ip);
        clear_inode(inode);
        gfs2_dir_hash_inval(ip);
@@ -1632,7 +1632,8 @@ static struct inode *gfs2_alloc_inode(struct super_block 
*sb)
                ip->i_flags = 0;
                ip->i_gl = NULL;
                ip->i_rgd = NULL;
-               ip->i_res = NULL;
+               memset(&ip->i_res, 0, sizeof(ip->i_res));
+               RB_CLEAR_NODE(&ip->i_res.rs_node);
        }
        return &ip->i_inode;
 }
diff --git a/fs/gfs2/util.c b/fs/gfs2/util.c
index 3b4819d..cf64583 100644
--- a/fs/gfs2/util.c
+++ b/fs/gfs2/util.c
@@ -28,7 +28,6 @@ struct kmem_cache *gfs2_bufdata_cachep __read_mostly;
 struct kmem_cache *gfs2_rgrpd_cachep __read_mostly;
 struct kmem_cache *gfs2_quotad_cachep __read_mostly;
 struct kmem_cache *gfs2_qadata_cachep __read_mostly;
-struct kmem_cache *gfs2_rsrv_cachep __read_mostly;
 mempool_t *gfs2_page_pool __read_mostly;
 
 void gfs2_assert_i(struct gfs2_sbd *sdp)
diff --git a/fs/gfs2/util.h b/fs/gfs2/util.h
index 9edbcc9..c81295f 100644
--- a/fs/gfs2/util.h
+++ b/fs/gfs2/util.h
@@ -150,7 +150,6 @@ extern struct kmem_cache *gfs2_bufdata_cachep;
 extern struct kmem_cache *gfs2_rgrpd_cachep;
 extern struct kmem_cache *gfs2_quotad_cachep;
 extern struct kmem_cache *gfs2_qadata_cachep;
-extern struct kmem_cache *gfs2_rsrv_cachep;
 extern mempool_t *gfs2_page_pool;
 
 static inline unsigned int gfs2_tune_get_i(struct gfs2_tune *gt,
-- 
2.4.3

Reply via email to