From fbd95487d193ee917d5d7e8db423dc1f327cfafc Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Fri, 18 Nov 2011 17:35:38 +0100 Subject: [PATCH] 9p: pass dotl flags to the unlinkat method AT_REMOVEDIR is not defined on all systems. Pass the raw flags from the 9p protocol, which are always there. Signed-off-by: Paolo Bonzini Signed-off-by: Anthony Liguori --- hw/9pfs/virtio-9p-handle.c | 12 +++++++++++- hw/9pfs/virtio-9p.c | 10 ---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/hw/9pfs/virtio-9p-handle.c b/hw/9pfs/virtio-9p-handle.c index 27889d8..7644ae5 100644 --- a/hw/9pfs/virtio-9p-handle.c +++ b/hw/9pfs/virtio-9p-handle.c @@ -65,6 +65,9 @@ struct rpl_file_handle { }; #define file_handle rpl_file_handle +#ifndef AT_REMOVEDIR +#define AT_REMOVEDIR 0x200 +#endif #ifndef AT_EMPTY_PATH #define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname */ #endif @@ -575,13 +578,20 @@ static int handle_unlinkat(FsContext *ctx, V9fsPath *dir, { int dirfd, ret; struct handle_data *data = (struct handle_data *)ctx->private; + int rflags; dirfd = open_by_handle(data->mountfd, dir->data, O_PATH); if (dirfd < 0) { return dirfd; } - ret = unlinkat(dirfd, name, flags); + rflags = 0; + if (flags & P9_DOTL_AT_REMOVEDIR) { + rflags |= AT_REMOVEDIR; + } + + ret = unlinkat(dirfd, name, rflags); + close(dirfd); return ret; } diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 01cf337..1b2fc5d 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -74,15 +74,6 @@ static int omode_to_uflags(int8_t mode) return ret; } -static int dotl_to_at_flags(int flags) -{ - int rflags = 0; - if (flags & P9_DOTL_AT_REMOVEDIR) { - rflags |= AT_REMOVEDIR; - } - return rflags; -} - struct dotl_openflag_map { int dotl_flag; int open_flag; @@ -2444,7 +2435,6 @@ static void v9fs_unlinkat(void *opaque) V9fsPDU *pdu = opaque; pdu_unmarshal(pdu, offset, "dsd", &dfid, &name, &flags); - flags = dotl_to_at_flags(flags); dfidp = get_fid(pdu, dfid); if (dfidp == NULL) { -- 2.7.4