From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.5 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4E32BC04AB6 for ; Fri, 31 May 2019 15:52:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2AD0826950 for ; Fri, 31 May 2019 15:52:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726563AbfEaPwS (ORCPT ); Fri, 31 May 2019 11:52:18 -0400 Received: from fieldses.org ([173.255.197.46]:42186 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726546AbfEaPwS (ORCPT ); Fri, 31 May 2019 11:52:18 -0400 Received: by fieldses.org (Postfix, from userid 2815) id 85E671CEA; Fri, 31 May 2019 11:52:17 -0400 (EDT) Date: Fri, 31 May 2019 11:52:17 -0400 To: Trond Myklebust Cc: SteveD@redhat.com, linux-nfs@vger.kernel.org Subject: Re: [PATCH v3 04/11] Add utilities for resolving nfsd paths and stat()ing them Message-ID: <20190531155217.GC1251@fieldses.org> References: <20190528203122.11401-1-trond.myklebust@hammerspace.com> <20190528203122.11401-2-trond.myklebust@hammerspace.com> <20190528203122.11401-3-trond.myklebust@hammerspace.com> <20190528203122.11401-4-trond.myklebust@hammerspace.com> <20190528203122.11401-5-trond.myklebust@hammerspace.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190528203122.11401-5-trond.myklebust@hammerspace.com> User-Agent: Mutt/1.5.21 (2010-09-15) From: bfields@fieldses.org (J. Bruce Fields) Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org On Tue, May 28, 2019 at 04:31:15PM -0400, Trond Myklebust wrote: > +char * > +nfsd_path_strip_root(char *pathname) > +{ > + const char *dir = nfsd_path_nfsd_rootdir(); > + char *ret; > + > + ret = strstr(pathname, dir); > + if (!ret || ret != pathname) > + return pathname; Shouldn't we return NULL or an error or something here? It seems a little strange not to care if the path began with root or not. I guess I need to look at the caller.... --b. > + return pathname + strlen(dir); > +} > + > +char * > +nfsd_path_prepend_dir(const char *dir, const char *pathname) > +{ > + size_t len, dirlen; > + char *ret; > + > + dirlen = strlen(dir); > + while (dirlen > 0 && dir[dirlen - 1] == '/') > + dirlen--; > + if (!dirlen) > + return NULL; > + len = dirlen + strlen(pathname) + 1; > + ret = xmalloc(len + 1); > + snprintf(ret, len, "%.*s/%s", (int)dirlen, dir, pathname); > + return ret; > +} > + > +static void > +nfsd_setup_workqueue(void) > +{ > + const char *rootdir = nfsd_path_nfsd_rootdir(); > + > + if (!rootdir) > + return; > + nfsd_wq = xthread_workqueue_alloc(); > + if (!nfsd_wq) > + return; > + xthread_workqueue_chroot(nfsd_wq, rootdir); > +} > + > +void > +nfsd_path_init(void) > +{ > + nfsd_setup_workqueue(); > +} > + > +struct nfsd_stat_data { > + const char *pathname; > + struct stat *statbuf; > + int ret; > + int err; > +}; > + > +static void > +nfsd_statfunc(void *data) > +{ > + struct nfsd_stat_data *d = data; > + > + d->ret = xstat(d->pathname, d->statbuf); > + if (d->ret < 0) > + d->err = errno; > +} > + > +static void > +nfsd_lstatfunc(void *data) > +{ > + struct nfsd_stat_data *d = data; > + > + d->ret = xlstat(d->pathname, d->statbuf); > + if (d->ret < 0) > + d->err = errno; > +} > + > +static int > +nfsd_run_stat(struct xthread_workqueue *wq, > + void (*func)(void *), > + const char *pathname, > + struct stat *statbuf) > +{ > + struct nfsd_stat_data data = { > + pathname, > + statbuf, > + 0, > + 0 > + }; > + xthread_work_run_sync(wq, func, &data); > + if (data.ret < 0) > + errno = data.err; > + return data.ret; > +} > + > +int > +nfsd_path_stat(const char *pathname, struct stat *statbuf) > +{ > + if (!nfsd_wq) > + return xstat(pathname, statbuf); > + return nfsd_run_stat(nfsd_wq, nfsd_statfunc, pathname, statbuf); > +} > + > +int > +nfsd_path_lstat(const char *pathname, struct stat *statbuf) > +{ > + if (!nfsd_wq) > + return xlstat(pathname, statbuf); > + return nfsd_run_stat(nfsd_wq, nfsd_lstatfunc, pathname, statbuf); > +} > diff --git a/support/misc/xstat.c b/support/misc/xstat.c > new file mode 100644 > index 000000000000..d092f73dfd65 > --- /dev/null > +++ b/support/misc/xstat.c > @@ -0,0 +1,33 @@ > +#include > +#include > +#include > +#include > + > +#include "config.h" > +#include "xstat.h" > + > +#ifdef HAVE_FSTATAT > + > +int xlstat(const char *pathname, struct stat *statbuf) > +{ > + return fstatat(AT_FDCWD, pathname, statbuf, AT_NO_AUTOMOUNT | > + AT_SYMLINK_NOFOLLOW); > +} > + > +int xstat(const char *pathname, struct stat *statbuf) > +{ > + return fstatat(AT_FDCWD, pathname, statbuf, AT_NO_AUTOMOUNT); > +} > + > +#else > + > +int xlstat(const char *pathname, struct stat *statbuf) > +{ > + return lstat(pathname, statbuf); > +} > + > +int xstat(const char *pathname, struct stat *statbuf) > +{ > + return stat(pathname, statbuf); > +} > +#endif > -- > 2.21.0