On Thu, 31 May 2018 21:26:04 -0400 Keno Fischer <k...@juliacomputing.com> wrote:
> This code previously relied on P9_DOTL_AT_REMOVEDIR and AT_REMOVEDIR > having the same numerical value and deferred any errorchecking to the > syscall itself. However, while the former assumption is true on Linux, > it is not true in general. Thus, add appropriate error checking and > translation to the 9p unlinkat server code. > > Signed-off-by: Keno Fischer <k...@juliacomputing.com> > --- > Looks good but handle_unlinkat() needs to be adapted to this change. Other backends (proxy and synth) seem to ignore the flags. > Changes since v1: > * Code was moved from 9p-local.c to server entry point in 9p.c > > hw/9pfs/9p.c | 13 +++++++++++-- > 1 file changed, 11 insertions(+), 2 deletions(-) > > diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c > index b80db65..a757374 100644 > --- a/hw/9pfs/9p.c > +++ b/hw/9pfs/9p.c > @@ -2522,7 +2522,7 @@ static void coroutine_fn v9fs_unlinkat(void *opaque) > { > int err = 0; > V9fsString name; > - int32_t dfid, flags; > + int32_t dfid, flags, rflags = 0; > size_t offset = 7; > V9fsPath path; > V9fsFidState *dfidp; > @@ -2549,6 +2549,15 @@ static void coroutine_fn v9fs_unlinkat(void *opaque) > goto out_nofid; > } > > + if (flags & ~P9_DOTL_AT_REMOVEDIR) { > + err = -EINVAL; > + goto out_nofid; > + } > + > + if (flags & P9_DOTL_AT_REMOVEDIR) { > + rflags |= AT_REMOVEDIR; > + } > + > dfidp = get_fid(pdu, dfid); > if (dfidp == NULL) { > err = -EINVAL; > @@ -2567,7 +2576,7 @@ static void coroutine_fn v9fs_unlinkat(void *opaque) > if (err < 0) { > goto out_err; > } > - err = v9fs_co_unlinkat(pdu, &dfidp->path, &name, flags); > + err = v9fs_co_unlinkat(pdu, &dfidp->path, &name, rflags); > if (!err) { > err = offset; > }