Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5122201 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Move error handling out of the delegation generic code



The NFSv4 delegation recovery code is required by the protocol to handle
more errors. Rather than add NFSv4.0 specific errors into 'generic'
delegation code, we should move the error handling into the NFSv4 layer.

Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 01c3f052
Loading
Loading
Loading
Loading
+3 −15
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_
{
	struct inode *inode = state->inode;
	struct file_lock *fl;
	int status;
	int status = 0;

	for (fl = inode->i_flock; fl != NULL; fl = fl->fl_next) {
		if (!(fl->fl_flags & (FL_POSIX|FL_FLOCK)))
@@ -76,21 +76,9 @@ static int nfs_delegation_claim_locks(struct nfs_open_context *ctx, struct nfs4_
		if (nfs_file_open_context(fl->fl_file) != ctx)
			continue;
		status = nfs4_lock_delegation_recall(state, fl);
		if (status >= 0)
			continue;
		switch (status) {
			default:
				printk(KERN_ERR "%s: unhandled error %d.\n",
						__func__, status);
			case -NFS4ERR_EXPIRED:
				/* kill_proc(fl->fl_pid, SIGLOST, 1); */
			case -NFS4ERR_STALE_CLIENTID:
				nfs4_schedule_state_recovery(NFS_SERVER(inode)->nfs_client);
				goto out_err;
		}
		if (status < 0)
			break;
	}
	return 0;
out_err:
	return status;
}

+13 −2
Original line number Diff line number Diff line
@@ -3630,8 +3630,19 @@ int nfs4_lock_delegation_recall(struct nfs4_state *state, struct file_lock *fl)
		goto out;
	do {
		err = _nfs4_do_setlk(state, F_SETLK, fl, 0);
		if (err != -NFS4ERR_DELAY)
		switch (err) {
			default:
				printk(KERN_ERR "%s: unhandled error %d.\n",
						__func__, err);
			case 0:
				goto out;
			case -NFS4ERR_EXPIRED:
			case -NFS4ERR_STALE_CLIENTID:
				nfs4_schedule_state_recovery(server->nfs_client);
				goto out;
			case -NFS4ERR_DELAY:
				break;
		}
		err = nfs4_handle_exception(server, err, &exception);
	} while (exception.retry);
out: