|
@@ -46,6 +46,7 @@
|
|
|
#include <linux/scatterlist.h>
|
|
|
#include <linux/crypto.h>
|
|
|
#include <linux/sched.h>
|
|
|
+#include <linux/mount.h>
|
|
|
|
|
|
#define NFSDDBG_FACILITY NFSDDBG_PROC
|
|
|
|
|
@@ -313,12 +314,17 @@ nfsd4_remove_clid_dir(struct nfs4_client *clp)
|
|
|
if (!rec_dir_init || !clp->cl_firststate)
|
|
|
return;
|
|
|
|
|
|
+ status = mnt_want_write(rec_dir.path.mnt);
|
|
|
+ if (status)
|
|
|
+ goto out;
|
|
|
clp->cl_firststate = 0;
|
|
|
nfs4_save_user(&uid, &gid);
|
|
|
status = nfsd4_unlink_clid_dir(clp->cl_recdir, HEXDIR_LEN-1);
|
|
|
nfs4_reset_user(uid, gid);
|
|
|
if (status == 0)
|
|
|
nfsd4_sync_rec_dir();
|
|
|
+ mnt_drop_write(rec_dir.path.mnt);
|
|
|
+out:
|
|
|
if (status)
|
|
|
printk("NFSD: Failed to remove expired client state directory"
|
|
|
" %.*s\n", HEXDIR_LEN, clp->cl_recdir);
|
|
@@ -347,13 +353,17 @@ nfsd4_recdir_purge_old(void) {
|
|
|
|
|
|
if (!rec_dir_init)
|
|
|
return;
|
|
|
+ status = mnt_want_write(rec_dir.path.mnt);
|
|
|
+ if (status)
|
|
|
+ goto out;
|
|
|
status = nfsd4_list_rec_dir(rec_dir.path.dentry, purge_old);
|
|
|
if (status == 0)
|
|
|
nfsd4_sync_rec_dir();
|
|
|
+ mnt_drop_write(rec_dir.path.mnt);
|
|
|
+out:
|
|
|
if (status)
|
|
|
printk("nfsd4: failed to purge old clients from recovery"
|
|
|
" directory %s\n", rec_dir.path.dentry->d_name.name);
|
|
|
- return;
|
|
|
}
|
|
|
|
|
|
static int
|