]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/gfs2/ops_fstype.c
Merge tag 'mtd/for-5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mtd/linux
[linux.git] / fs / gfs2 / ops_fstype.c
index 08823bb3b2d0601707e0802a96450947521c0783..4a8e5a7310f0b222694cf96b12289c497267c9db 100644 (file)
@@ -61,6 +61,13 @@ static void gfs2_tune_init(struct gfs2_tune *gt)
        gt->gt_complain_secs = 10;
 }
 
+void free_sbd(struct gfs2_sbd *sdp)
+{
+       if (sdp->sd_lkstats)
+               free_percpu(sdp->sd_lkstats);
+       kfree(sdp);
+}
+
 static struct gfs2_sbd *init_sbd(struct super_block *sb)
 {
        struct gfs2_sbd *sdp;
@@ -72,10 +79,8 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
 
        sdp->sd_vfs = sb;
        sdp->sd_lkstats = alloc_percpu(struct gfs2_pcpu_lkstats);
-       if (!sdp->sd_lkstats) {
-               kfree(sdp);
-               return NULL;
-       }
+       if (!sdp->sd_lkstats)
+               goto fail;
        sb->s_fs_info = sdp;
 
        set_bit(SDF_NOJOURNALID, &sdp->sd_flags);
@@ -134,8 +139,11 @@ static struct gfs2_sbd *init_sbd(struct super_block *sb)
        mutex_init(&sdp->sd_freeze_mutex);
 
        return sdp;
-}
 
+fail:
+       free_sbd(sdp);
+       return NULL;
+}
 
 /**
  * gfs2_check_sb - Check superblock
@@ -568,7 +576,7 @@ static int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
 
                INIT_WORK(&jd->jd_work, gfs2_recover_func);
                jd->jd_inode = gfs2_lookupi(sdp->sd_jindex, &name, 1);
-               if (!jd->jd_inode || IS_ERR(jd->jd_inode)) {
+               if (IS_ERR_OR_NULL(jd->jd_inode)) {
                        if (!jd->jd_inode)
                                error = -ENOENT;
                        else
@@ -996,7 +1004,7 @@ static int gfs2_lm_mount(struct gfs2_sbd *sdp, int silent)
 void gfs2_lm_unmount(struct gfs2_sbd *sdp)
 {
        const struct lm_lockops *lm = sdp->sd_lockstruct.ls_ops;
-       if (likely(!test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) &&
+       if (likely(!test_bit(SDF_WITHDRAWN, &sdp->sd_flags)) &&
            lm->lm_unmount)
                lm->lm_unmount(sdp);
 }
@@ -1086,8 +1094,7 @@ static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent
        if (error) {
                /* In this case, we haven't initialized sysfs, so we have to
                   manually free the sdp. */
-               free_percpu(sdp->sd_lkstats);
-               kfree(sdp);
+               free_sbd(sdp);
                sb->s_fs_info = NULL;
                return error;
        }
@@ -1190,7 +1197,6 @@ static int fill_super(struct super_block *sb, struct gfs2_args *args, int silent
        gfs2_lm_unmount(sdp);
 fail_debug:
        gfs2_delete_debugfs_file(sdp);
-       free_percpu(sdp->sd_lkstats);
        /* gfs2_sys_fs_del must be the last thing we do, since it causes
         * sysfs to call function gfs2_sbd_release, which frees sdp. */
        gfs2_sys_fs_del(sdp);
@@ -1370,7 +1376,6 @@ static void gfs2_kill_sb(struct super_block *sb)
        sdp->sd_root_dir = NULL;
        sdp->sd_master_dir = NULL;
        shrink_dcache_sb(sb);
-       free_percpu(sdp->sd_lkstats);
        kill_block_super(sb);
 }