Merge tag 'media/v5.15-1' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[linux-2.6-microblaze.git] / fs / gfs2 / ops_fstype.c
index 5f4504d..7f8410d 100644 (file)
@@ -614,6 +614,7 @@ static int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
                        break;
                }
 
+               d_mark_dontcache(jd->jd_inode);
                spin_lock(&sdp->sd_jindex_spin);
                jd->jd_jid = sdp->sd_journals++;
                jip = GFS2_I(jd->jd_inode);
@@ -677,6 +678,7 @@ static int init_statfs(struct gfs2_sbd *sdp)
                        error = PTR_ERR(lsi->si_sc_inode);
                        fs_err(sdp, "can't find local \"sc\" file#%u: %d\n",
                               jd->jd_jid, error);
+                       kfree(lsi);
                        goto free_local;
                }
                lsi->si_jid = jd->jd_jid;
@@ -695,8 +697,16 @@ static int init_statfs(struct gfs2_sbd *sdp)
                fs_err(sdp, "can't lock local \"sc\" file: %d\n", error);
                goto free_local;
        }
+       /* read in the local statfs buffer - other nodes don't change it. */
+       error = gfs2_meta_inode_buffer(ip, &sdp->sd_sc_bh);
+       if (error) {
+               fs_err(sdp, "Cannot read in local statfs: %d\n", error);
+               goto unlock_sd_gh;
+       }
        return 0;
 
+unlock_sd_gh:
+       gfs2_glock_dq_uninit(&sdp->sd_sc_gh);
 free_local:
        free_local_statfs_inodes(sdp);
        iput(pn);
@@ -710,6 +720,7 @@ out:
 static void uninit_statfs(struct gfs2_sbd *sdp)
 {
        if (!sdp->sd_args.ar_spectator) {
+               brelse(sdp->sd_sc_bh);
                gfs2_glock_dq_uninit(&sdp->sd_sc_gh);
                free_local_statfs_inodes(sdp);
        }
@@ -1088,6 +1099,34 @@ void gfs2_online_uevent(struct gfs2_sbd *sdp)
        kobject_uevent_env(&sdp->sd_kobj, KOBJ_ONLINE, envp);
 }
 
+static int init_threads(struct gfs2_sbd *sdp)
+{
+       struct task_struct *p;
+       int error = 0;
+
+       p = kthread_run(gfs2_logd, sdp, "gfs2_logd");
+       if (IS_ERR(p)) {
+               error = PTR_ERR(p);
+               fs_err(sdp, "can't start logd thread: %d\n", error);
+               return error;
+       }
+       sdp->sd_logd_process = p;
+
+       p = kthread_run(gfs2_quotad, sdp, "gfs2_quotad");
+       if (IS_ERR(p)) {
+               error = PTR_ERR(p);
+               fs_err(sdp, "can't start quotad thread: %d\n", error);
+               goto fail;
+       }
+       sdp->sd_quotad_process = p;
+       return 0;
+
+fail:
+       kthread_stop(sdp->sd_logd_process);
+       sdp->sd_logd_process = NULL;
+       return error;
+}
+
 /**
  * gfs2_fill_super - Read in superblock
  * @sb: The VFS superblock
@@ -1216,6 +1255,14 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc)
                goto fail_per_node;
        }
 
+       if (!sb_rdonly(sb)) {
+               error = init_threads(sdp);
+               if (error) {
+                       gfs2_withdraw_delayed(sdp);
+                       goto fail_per_node;
+               }
+       }
+
        error = gfs2_freeze_lock(sdp, &freeze_gh, 0);
        if (error)
                goto fail_per_node;
@@ -1225,6 +1272,12 @@ static int gfs2_fill_super(struct super_block *sb, struct fs_context *fc)
 
        gfs2_freeze_unlock(&freeze_gh);
        if (error) {
+               if (sdp->sd_quotad_process)
+                       kthread_stop(sdp->sd_quotad_process);
+               sdp->sd_quotad_process = NULL;
+               if (sdp->sd_logd_process)
+                       kthread_stop(sdp->sd_logd_process);
+               sdp->sd_logd_process = NULL;
                fs_err(sdp, "can't make FS RW: %d\n", error);
                goto fail_per_node;
        }