nfsd4: fix failure to end nfsd4 grace period
Even if we fail to write a recovery record, we should still mark the client as having acquired its first state. Otherwise we leave 4.1 clients with indefinite ERR_GRACE returns. However, an inability to write stable storage records may cause failures of reboot recovery, and the problem should still be brought to the server administrator's attention. So, make sure the error is logged. These errors shouldn't normally be triggered on a corectly functioning server--this isn't a case where a misconfigured client could spam the logs. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
48483bf23a
commit
6577aac01f
|
@ -130,6 +130,7 @@ nfsd4_create_clid_dir(struct nfs4_client *clp)
|
|||
if (!rec_file || clp->cl_firststate)
|
||||
return 0;
|
||||
|
||||
clp->cl_firststate = 1;
|
||||
status = nfs4_save_creds(&original_cred);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
@ -144,10 +145,8 @@ nfsd4_create_clid_dir(struct nfs4_client *clp)
|
|||
goto out_unlock;
|
||||
}
|
||||
status = -EEXIST;
|
||||
if (dentry->d_inode) {
|
||||
dprintk("NFSD: nfsd4_create_clid_dir: DIRECTORY EXISTS\n");
|
||||
if (dentry->d_inode)
|
||||
goto out_put;
|
||||
}
|
||||
status = mnt_want_write(rec_file->f_path.mnt);
|
||||
if (status)
|
||||
goto out_put;
|
||||
|
@ -157,12 +156,14 @@ out_put:
|
|||
dput(dentry);
|
||||
out_unlock:
|
||||
mutex_unlock(&dir->d_inode->i_mutex);
|
||||
if (status == 0) {
|
||||
clp->cl_firststate = 1;
|
||||
if (status == 0)
|
||||
vfs_fsync(rec_file, 0);
|
||||
}
|
||||
else
|
||||
printk(KERN_ERR "NFSD: failed to write recovery record"
|
||||
" (err %d); please check that %s exists"
|
||||
" and is writeable", status,
|
||||
user_recovery_dirname);
|
||||
nfs4_reset_creds(original_cred);
|
||||
dprintk("NFSD: nfsd4_create_clid_dir returns %d\n", status);
|
||||
return status;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue