nfsd: fix race in nfsd_nrthreads()
[safe/jmp/linux-2.6] / fs / nfsd / nfs4state.c
index 55dfdd7..bf11d68 100644 (file)
@@ -1579,8 +1579,8 @@ nfs4_upgrade_open(struct svc_rqst *rqstp, struct svc_fh *cur_fh, struct nfs4_sta
        }
        /* remember the open */
        filp->f_mode |= open->op_share_access;
-       set_bit(open->op_share_access, &stp->st_access_bmap);
-       set_bit(open->op_share_deny, &stp->st_deny_bmap);
+       __set_bit(open->op_share_access, &stp->st_access_bmap);
+       __set_bit(open->op_share_deny, &stp->st_deny_bmap);
 
        return nfs_ok;
 }
@@ -2712,9 +2712,6 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
        * Note: locks.c uses the BKL to protect the inode's lock list.
        */
 
-       /* XXX?: Just to divert the locks_release_private at the start of
-        * locks_copy_lock: */
-       locks_init_lock(&conflock);
        err = vfs_lock_file(filp, cmd, &file_lock, &conflock);
        switch (-err) {
        case 0: /* success! */
@@ -3252,12 +3249,14 @@ nfs4_state_shutdown(void)
        nfs4_unlock_state();
 }
 
+/*
+ * user_recovery_dirname is protected by the nfsd_mutex since it's only
+ * accessed when nfsd is starting.
+ */
 static void
 nfs4_set_recdir(char *recdir)
 {
-       nfs4_lock_state();
        strcpy(user_recovery_dirname, recdir);
-       nfs4_unlock_state();
 }
 
 /*
@@ -3281,6 +3280,12 @@ nfs4_reset_recoverydir(char *recdir)
        return status;
 }
 
+char *
+nfs4_recoverydir(void)
+{
+       return user_recovery_dirname;
+}
+
 /*
  * Called when leasetime is changed.
  *
@@ -3289,11 +3294,12 @@ nfs4_reset_recoverydir(char *recdir)
  * we start to register any changes in lease time.  If the administrator
  * really wants to change the lease time *now*, they can go ahead and bring
  * nfsd down and then back up again after changing the lease time.
+ *
+ * user_lease_time is protected by nfsd_mutex since it's only really accessed
+ * when nfsd is starting
  */
 void
 nfs4_reset_lease(time_t leasetime)
 {
-       lock_kernel();
        user_lease_time = leasetime;
-       unlock_kernel();
 }