return error;
 }
 
-static int init_threads(struct gfs2_sbd *sdp, int undo)
-{
-       struct task_struct *p;
-       int error = 0;
-
-       if (undo)
-               goto fail_quotad;
-
-       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_quotad:
-       kthread_stop(sdp->sd_quotad_process);
-fail:
-       kthread_stop(sdp->sd_logd_process);
-       return error;
-}
-
 static const match_table_t nolock_tokens = {
        { Opt_jid, "jid=%d\n", },
        { Opt_err, NULL },
                goto fail_per_node;
        }
 
-       error = init_threads(sdp, DO);
-       if (error)
-               goto fail_per_node;
-
        if (!(sb->s_flags & MS_RDONLY)) {
                error = gfs2_make_fs_rw(sdp);
                if (error) {
                        fs_err(sdp, "can't make FS RW: %d\n", error);
-                       goto fail_threads;
+                       goto fail_per_node;
                }
        }
 
        gfs2_online_uevent(sdp);
        return 0;
 
-fail_threads:
-       init_threads(sdp, UNDO);
 fail_per_node:
        init_per_node(sdp, UNDO);
 fail_inodes:
 
        while (!list_empty(head)) {
                qd = list_entry(head->prev, struct gfs2_quota_data, qd_list);
 
-               /*
-                * To be removed in due course... we should be able to
-                * ensure that all refs to the qd have done by this point
-                * so that this rather odd test is not required
-                */
-               spin_lock(&qd->qd_lockref.lock);
-               if (qd->qd_lockref.count > 1 ||
-                   (qd->qd_lockref.count && !test_bit(QDF_CHANGE, &qd->qd_flags))) {
-                       spin_unlock(&qd->qd_lockref.lock);
-                       list_move(&qd->qd_list, head);
-                       spin_unlock(&qd_lock);
-                       schedule();
-                       spin_lock(&qd_lock);
-                       continue;
-               }
-               spin_unlock(&qd->qd_lockref.lock);
-
                list_del(&qd->qd_list);
 
                /* Also remove if this qd exists in the reclaim list */
                hlist_bl_del_rcu(&qd->qd_hlist);
                spin_unlock_bucket(qd->qd_hash);
 
-               if (!qd->qd_lockref.count) {
-                       gfs2_assert_warn(sdp, !qd->qd_change);
-                       gfs2_assert_warn(sdp, !qd->qd_slot_count);
-               } else
-                       gfs2_assert_warn(sdp, qd->qd_slot_count == 1);
+               gfs2_assert_warn(sdp, !qd->qd_change);
+               gfs2_assert_warn(sdp, !qd->qd_slot_count);
                gfs2_assert_warn(sdp, !qd->qd_bh_count);
 
                gfs2_glock_put(qd->qd_gl);
 
        return 0;
 }
 
+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);
+       return error;
+}
+
 /**
  * gfs2_make_fs_rw - Turn a Read-Only FS into a Read-Write one
  * @sdp: the filesystem
        struct gfs2_log_header_host head;
        int error;
 
-       error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &t_gh);
+       error = init_threads(sdp);
        if (error)
                return error;
 
+       error = gfs2_glock_nq_init(sdp->sd_trans_gl, LM_ST_SHARED, 0, &t_gh);
+       if (error)
+               goto fail_threads;
+
        j_gl->gl_ops->go_inval(j_gl, DIO_METADATA);
 
        error = gfs2_find_jhead(sdp->sd_jdesc, &head);
 fail:
        t_gh.gh_flags |= GL_NOCACHE;
        gfs2_glock_dq_uninit(&t_gh);
-
+fail_threads:
+       kthread_stop(sdp->sd_quotad_process);
+       kthread_stop(sdp->sd_logd_process);
        return error;
 }
 
        struct gfs2_holder t_gh;
        int error;
 
+       kthread_stop(sdp->sd_quotad_process);
+       kthread_stop(sdp->sd_logd_process);
+
        flush_workqueue(gfs2_delete_workqueue);
        gfs2_quota_sync(sdp->sd_vfs, 0);
        gfs2_statfs_sync(sdp->sd_vfs, 0);
        }
        spin_unlock(&sdp->sd_jindex_spin);
 
-       kthread_stop(sdp->sd_quotad_process);
-       kthread_stop(sdp->sd_logd_process);
-
        if (!(sb->s_flags & MS_RDONLY)) {
                error = gfs2_make_fs_ro(sdp);
                if (error)