]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - fs/gfs2/glock.c
GFS2: Metadata address space clean up
[mirror_ubuntu-bionic-kernel.git] / fs / gfs2 / glock.c
index f42663325931c3c41be0a084f5869dba8ed86344..dfb10a4d467e34d5a70bfef124b48420e6a05eec 100644 (file)
@@ -154,12 +154,14 @@ static unsigned int gl_hash(const struct gfs2_sbd *sdp,
 static void glock_free(struct gfs2_glock *gl)
 {
        struct gfs2_sbd *sdp = gl->gl_sbd;
-       struct inode *aspace = gl->gl_aspace;
+       struct address_space *mapping = gfs2_glock2aspace(gl);
+       struct kmem_cache *cachep = gfs2_glock_cachep;
 
-       if (aspace)
-               gfs2_aspace_put(aspace);
+       GLOCK_BUG_ON(gl, mapping && mapping->nrpages);
        trace_gfs2_glock_put(gl);
-       sdp->sd_lockstruct.ls_ops->lm_put_lock(gfs2_glock_cachep, gl);
+       if (mapping)
+               cachep = gfs2_glock_aspace_cachep;
+       sdp->sd_lockstruct.ls_ops->lm_put_lock(cachep, gl);
 }
 
 /**
@@ -750,10 +752,11 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
                   const struct gfs2_glock_operations *glops, int create,
                   struct gfs2_glock **glp)
 {
+       struct super_block *s = sdp->sd_vfs;
        struct lm_lockname name = { .ln_number = number, .ln_type = glops->go_type };
        struct gfs2_glock *gl, *tmp;
        unsigned int hash = gl_hash(sdp, &name);
-       int error;
+       struct address_space *mapping;
 
        read_lock(gl_lock_addr(hash));
        gl = search_bucket(hash, sdp, &name);
@@ -765,7 +768,10 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
        if (!create)
                return -ENOENT;
 
-       gl = kmem_cache_alloc(gfs2_glock_cachep, GFP_KERNEL);
+       if (glops->go_flags & GLOF_ASPACE)
+               gl = kmem_cache_alloc(gfs2_glock_aspace_cachep, GFP_KERNEL);
+       else
+               gl = kmem_cache_alloc(gfs2_glock_cachep, GFP_KERNEL);
        if (!gl)
                return -ENOMEM;
 
@@ -784,18 +790,18 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
        gl->gl_tchange = jiffies;
        gl->gl_object = NULL;
        gl->gl_sbd = sdp;
-       gl->gl_aspace = NULL;
        INIT_DELAYED_WORK(&gl->gl_work, glock_work_func);
        INIT_WORK(&gl->gl_delete, delete_work_func);
 
-       /* If this glock protects actual on-disk data or metadata blocks,
-          create a VFS inode to manage the pages/buffers holding them. */
-       if (glops == &gfs2_inode_glops || glops == &gfs2_rgrp_glops) {
-               gl->gl_aspace = gfs2_aspace_get(sdp);
-               if (!gl->gl_aspace) {
-                       error = -ENOMEM;
-                       goto fail;
-               }
+       mapping = gfs2_glock2aspace(gl);
+       if (mapping) {
+                mapping->a_ops = &gfs2_meta_aops;
+               mapping->host = s->s_bdev->bd_inode;
+               mapping->flags = 0;
+               mapping_set_gfp_mask(mapping, GFP_NOFS);
+               mapping->assoc_mapping = NULL;
+               mapping->backing_dev_info = s->s_bdi;
+               mapping->writeback_index = 0;
        }
 
        write_lock(gl_lock_addr(hash));
@@ -812,10 +818,6 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
        *glp = gl;
 
        return 0;
-
-fail:
-       kmem_cache_free(gfs2_glock_cachep, gl);
-       return error;
 }
 
 /**