From e83d36544ff3ac5e495fe3fcdabc784496d515e5 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Wed, 21 Mar 2012 16:05:16 -0400 Subject: [PATCH] symlink: handle errors from REMOVE Signed-off-by: Casey Bodley --- daemon/symlink.c | 10 +++++++++- sys/nfs41_driver.c | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/daemon/symlink.c b/daemon/symlink.c index c02cbc1..61ccc0d 100644 --- a/daemon/symlink.c +++ b/daemon/symlink.c @@ -214,6 +214,8 @@ static int map_symlink_errors(int status) case NFS4ERR_BADCHAR: case NFS4ERR_BADNAME: return ERROR_INVALID_REPARSE_DATA; case NFS4ERR_WRONG_TYPE: return ERROR_NOT_A_REPARSE_POINT; + case NFS4ERR_ACCESS: return ERROR_ACCESS_DENIED; + case NFS4ERR_NOTEMPTY: return ERROR_NOT_EMPTY; default: return nfs_to_windows_error(status, ERROR_BAD_NET_RESP); } } @@ -236,8 +238,14 @@ static int handle_symlink(nfs41_upcall *upcall) eprintf("handle_symlink: attempting to create a symlink when " "the file=%s was already created on open; sending REMOVE " "first\n", state->file.path->path); - nfs41_remove(state->session, &state->parent, + status = nfs41_remove(state->session, &state->parent, &state->file.name, state->file.fh.fileid); + if (status) { + eprintf("nfs41_remove() for symlink=%s failed with %s\n", + args->target_set, nfs_error_string(status)); + status = map_symlink_errors(status); + goto out; + } } /* create the symlink */ diff --git a/sys/nfs41_driver.c b/sys/nfs41_driver.c index 730673e..5d59cf9 100644 --- a/sys/nfs41_driver.c +++ b/sys/nfs41_driver.c @@ -5838,6 +5838,8 @@ NTSTATUS map_symlink_errors( case NO_ERROR: return STATUS_SUCCESS; case ERROR_INVALID_REPARSE_DATA: return STATUS_IO_REPARSE_DATA_INVALID; case ERROR_NOT_A_REPARSE_POINT: return STATUS_NOT_A_REPARSE_POINT; + case ERROR_ACCESS_DENIED: return STATUS_ACCESS_DENIED; + case ERROR_NOT_EMPTY: return STATUS_DIRECTORY_NOT_EMPTY; case ERROR_OUTOFMEMORY: return STATUS_INSUFFICIENT_RESOURCES; case ERROR_INSUFFICIENT_BUFFER: return STATUS_BUFFER_TOO_SMALL; case STATUS_BUFFER_TOO_SMALL: