From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jlayton@redhat.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH v3 3/4] nfsd: pass info about the legacy recoverydir in environment variables
Date: Wed, 24 Oct 2012 17:31:31 -0400 [thread overview]
Message-ID: <20121024213131.GH6697@fieldses.org> (raw)
In-Reply-To: <1351089018-24551-4-git-send-email-jlayton@redhat.com>
On Wed, Oct 24, 2012 at 10:30:17AM -0400, Jeff Layton wrote:
> The usermodehelper upcall program can then decide to use this info as
> a (one-way) transition mechanism to the new scheme. When a "check"
> upcall occurs and the client doesn't exist in the database, we can
> look to see whether the directory exists. If it does, then we'd add
> the client to the database, remove the legacy recdir, and return
> success to the kernel to allow the recovery to proceed.
>
> For gracedone, we simply pass the v4recovery "topdir" so that the
> upcall can clean it out prior to returning to the kernel.
I don't understand why the kernel needs to be involved here--can't
userspace find the old directory on its own?
--b.
>
> A module parm is also added to disable the legacy conversion if
> the admin chooses.
>
> Signed-off-by: Jeff Layton <jlayton@redhat.com>
> ---
> fs/nfsd/nfs4recover.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 82 insertions(+), 8 deletions(-)
>
> diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c
> index aa165fd..782168d 100644
> --- a/fs/nfsd/nfs4recover.c
> +++ b/fs/nfsd/nfs4recover.c
> @@ -932,10 +932,75 @@ module_param_string(cltrack_prog, cltrack_prog, sizeof(cltrack_prog),
> S_IRUGO|S_IWUSR);
> MODULE_PARM_DESC(cltrack_prog, "Path to the nfsdcltrack upcall program");
>
> +static bool cltrack_legacy_disable;
> +module_param(cltrack_legacy_disable, bool, S_IRUGO|S_IWUSR);
> +MODULE_PARM_DESC(cltrack_legacy_disable,
> + "Disable legacy recoverydir conversion. Default: false");
> +
> +#define LEGACY_TOPDIR_ENV_PREFIX "NFSDCLTRACK_LEGACY_TOPDIR="
> +#define LEGACY_RECDIR_ENV_PREFIX "NFSDCLTRACK_LEGACY_RECDIR="
> +
> +static char *
> +nfsd4_cltrack_legacy_topdir(void)
> +{
> + int copied;
> + size_t len;
> + char *result;
> +
> + if (cltrack_legacy_disable)
> + return NULL;
> +
> + len = strlen(LEGACY_TOPDIR_ENV_PREFIX) +
> + strlen(nfs4_recoverydir()) + 1;
> +
> + result = kmalloc(len, GFP_KERNEL);
> + if (!result)
> + return result;
> +
> + copied = snprintf(result, len, LEGACY_TOPDIR_ENV_PREFIX "%s",
> + nfs4_recoverydir());
> + if (copied >= len) {
> + /* just return nothing if output was truncated */
> + kfree(result);
> + return NULL;
> + }
> +
> + return result;
> +}
> +
> +static char *
> +nfsd4_cltrack_legacy_recdir(const char *recdir)
> +{
> + int copied;
> + size_t len;
> + char *result;
> +
> + if (cltrack_legacy_disable)
> + return NULL;
> +
> + /* +1 is for '/' between "topdir" and "recdir" */
> + len = strlen(LEGACY_RECDIR_ENV_PREFIX) +
> + strlen(nfs4_recoverydir()) + 1 + HEXDIR_LEN;
> +
> + result = kmalloc(len, GFP_KERNEL);
> + if (!result)
> + return result;
> +
> + copied = snprintf(result, len, LEGACY_RECDIR_ENV_PREFIX "%s/%s",
> + nfs4_recoverydir(), recdir);
> + if (copied >= len) {
> + /* just return nothing if output was truncated */
> + kfree(result);
> + return NULL;
> + }
> +
> + return result;
> +}
> +
> static int
> -nfsd4_umh_cltrack_upcall(char *cmd, char *arg)
> +nfsd4_umh_cltrack_upcall(char *cmd, char *arg, char *legacy)
> {
> - char *envp[] = { NULL };
> + char *envp[2];
> char *argv[4];
> int ret;
>
> @@ -946,6 +1011,10 @@ nfsd4_umh_cltrack_upcall(char *cmd, char *arg)
>
> dprintk("%s: cmd: %s\n", __func__, cmd);
> dprintk("%s: arg: %s\n", __func__, arg ? arg : "(null)");
> + dprintk("%s: legacy: %s\n", __func__, legacy ? legacy : "(null)");
> +
> + envp[0] = legacy;
> + envp[1] = NULL;
>
> argv[0] = (char *)cltrack_prog;
> argv[1] = cmd;
> @@ -991,7 +1060,7 @@ bin_to_hex_dup(const unsigned char *src, int srclen)
> static int
> nfsd4_umh_cltrack_init(struct net __attribute__((unused)) *net)
> {
> - return nfsd4_umh_cltrack_upcall("init", NULL);
> + return nfsd4_umh_cltrack_upcall("init", NULL, NULL);
> }
>
> static void
> @@ -1004,7 +1073,7 @@ nfsd4_umh_cltrack_create(struct nfs4_client *clp)
> dprintk("%s: can't allocate memory for upcall!\n", __func__);
> return;
> }
> - nfsd4_umh_cltrack_upcall("create", hexid);
> + nfsd4_umh_cltrack_upcall("create", hexid, NULL);
> kfree(hexid);
> }
>
> @@ -1018,7 +1087,7 @@ nfsd4_umh_cltrack_remove(struct nfs4_client *clp)
> dprintk("%s: can't allocate memory for upcall!\n", __func__);
> return;
> }
> - nfsd4_umh_cltrack_upcall("remove", hexid);
> + nfsd4_umh_cltrack_upcall("remove", hexid, NULL);
> kfree(hexid);
> }
>
> @@ -1026,14 +1095,16 @@ static int
> nfsd4_umh_cltrack_check(struct nfs4_client *clp)
> {
> int ret;
> - char *hexid;
> + char *hexid, *legacy;
>
> hexid = bin_to_hex_dup(clp->cl_name.data, clp->cl_name.len);
> if (!hexid) {
> dprintk("%s: can't allocate memory for upcall!\n", __func__);
> return -ENOMEM;
> }
> - ret = nfsd4_umh_cltrack_upcall("check", hexid);
> + legacy = nfsd4_cltrack_legacy_recdir(clp->cl_recdir);
> + ret = nfsd4_umh_cltrack_upcall("check", hexid, legacy);
> + kfree(legacy);
> kfree(hexid);
> return ret;
> }
> @@ -1042,10 +1113,13 @@ static void
> nfsd4_umh_cltrack_grace_done(struct net __attribute__((unused)) *net,
> time_t boot_time)
> {
> + char *legacy;
> char timestr[22]; /* FIXME: better way to determine max size? */
>
> sprintf(timestr, "%ld", boot_time);
> - nfsd4_umh_cltrack_upcall("gracedone", timestr);
> + legacy = nfsd4_cltrack_legacy_topdir();
> + nfsd4_umh_cltrack_upcall("gracedone", timestr, legacy);
> + kfree(legacy);
> }
>
> static struct nfsd4_client_tracking_ops nfsd4_umh_tracking_ops = {
> --
> 1.7.11.7
>
next prev parent reply other threads:[~2012-10-24 21:31 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-24 14:30 [PATCH v3 0/4] nfsd: add a usermodehelper upcall for client id tracking Jeff Layton
2012-10-24 14:30 ` [PATCH v3 1/4] nfsd: add a usermodehelper upcall for NFSv4 client ID tracking Jeff Layton
2012-10-24 21:03 ` J. Bruce Fields
2012-10-25 11:39 ` Jeff Layton
2012-10-25 15:06 ` J. Bruce Fields
2012-10-25 15:27 ` Jeff Layton
2012-10-25 15:49 ` J. Bruce Fields
2012-10-25 16:59 ` Jeff Layton
2012-10-24 14:30 ` [PATCH v3 2/4] nfsd: change heuristic for selecting the client_tracking_ops Jeff Layton
2012-10-24 14:30 ` [PATCH v3 3/4] nfsd: pass info about the legacy recoverydir in environment variables Jeff Layton
2012-10-24 21:31 ` J. Bruce Fields [this message]
2012-10-24 14:30 ` [PATCH v3 4/4] nfsd: warn about impending removal of nfsdcld upcall Jeff Layton
2012-10-24 21:32 ` [PATCH v3 0/4] nfsd: add a usermodehelper upcall for client id tracking J. Bruce Fields
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20121024213131.GH6697@fieldses.org \
--to=bfields@fieldses.org \
--cc=jlayton@redhat.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.