Received: by 2002:a25:ad19:0:0:0:0:0 with SMTP id y25csp7156501ybi; Mon, 8 Jul 2019 15:47:37 -0700 (PDT) X-Google-Smtp-Source: APXvYqwZVtjr+h9rcfys6F5Aq3BcAqnIoReuc6jA2ySsAS5E2LmM0fAskN3MPiSnCzaXHV6+fHIE X-Received: by 2002:a17:902:b186:: with SMTP id s6mr27840308plr.343.1562626057364; Mon, 08 Jul 2019 15:47:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1562626057; cv=none; d=google.com; s=arc-20160816; b=lj7izBNPF3E7fc2AUy8ZwNs2D7L9eoGb2NOaht1vwCSA3Pbn8YEd8RzT0sm1kSGTw9 v+9qyjok74xtyd0k1j+g/JsZAXJs8XhvGpho/sNo6vYBpCwR37F4mEtzLrRhN+/axIR4 T0QkWMlD489q+Eg/bTjkPcFWz0Ugm8iwX8mca8lGXxXdAxKb3QpRApfRZ5niAWBREXei Z61yOBCRKBP+ygdzms0Evsz4/g839TnuNVL94BaCtXx54xL+bkEyhhEbg+uPrkR9pEPj Lhl0bdhPOnfVUtX5DV2GJjQlFmSKAm31NRAK/+uyfgEUOvXYa9COzLeVp/r4ptubUQbd RezQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=5cemtBtX1hls1+MLsuRSuTCDoBbFIh1Cf7gu0TW+wAA=; b=aiulh4CV5hDJrJJzGOjMVBPJ73PWBjpyMqtU9f/SOXxkyO2E6Mf7S/QfDWJQ8ubbkq P76uALtPSviHd5gsb9leLI1cLnIXHVBC2FN0Vur5JUybF1S9jM8dElZkOSSwhawJ2M3u g30HcXbf2y/ga/bT2f1STLcKfWxlU0aPdWfOFXFvE8bxj3Q6zFtmvr6oit3oPYtLXJoC SMqE/rY5+Ypi7ZniGZYHcN5MI1TBvTTJc0NwHm2UCWKiGngscQViEVFtMEqNzwMXw2DD 2EY2JQdKKlaoZ2Ahzd0LTXA8CsrU18NbFPoazxHq/0mkkl9fTahgRqKeZgNY0ebdkgvn wSIw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=mRdUDy2Y; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v189si19257547pgd.289.2019.07.08.15.47.23; Mon, 08 Jul 2019 15:47:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=mRdUDy2Y; spf=pass (google.com: best guess record for domain of linux-nfs-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-nfs-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2391664AbfGHTYs (ORCPT + 99 others); Mon, 8 Jul 2019 15:24:48 -0400 Received: from mail-io1-f66.google.com ([209.85.166.66]:34643 "EHLO mail-io1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2391660AbfGHTYs (ORCPT ); Mon, 8 Jul 2019 15:24:48 -0400 Received: by mail-io1-f66.google.com with SMTP id k8so37945953iot.1 for ; Mon, 08 Jul 2019 12:24:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5cemtBtX1hls1+MLsuRSuTCDoBbFIh1Cf7gu0TW+wAA=; b=mRdUDy2YawJEIVBoBodO1HH3a/w0W9iXP/2m0aQr1BYn10FxofLNqD84Xhwu0PEInt CO4WrvzCH1pHmt7765znPUdcGnWD83zcgbQB0C4SOoFtuK6j+kvdGPR/bQFGrLKZrEe3 OUH7CnQkQOeRL+4X1dESTuE/MfoigLsLYKjqoJ7lA9qSjo70mebhuGAPDGbD2qvBDvR1 MK2Zc96U+jTgdujJAZ3mVWesAB4/rn8emQ5QSmOoM4kMfTboTmbk6ks+zWoCZebYIg2B pQa8/H9++eSApcNFLUYaW1Kv9EccFq3TA48ROUq6UmILokqVWeOS9i7wLCiNZf/7rtyD Mcvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5cemtBtX1hls1+MLsuRSuTCDoBbFIh1Cf7gu0TW+wAA=; b=mdWieFmOJi+o4o7iCGY6SaS77qSHT6aRmW7rR4XdELVBNURS+jeAJJzRvXJd6b1rrk i3cog13Oy38Fu//KhPTuImlDhQvpOW82ytan1AV0ZTZBxKfyIRLDcUaTdc/Zh+t1abyq S1nI0/Iywoa7Z7VKpQtNuXuwDr2jH79WbX/u2cAEWxlG7Mc4j8LCyzB9xO6tTGUkfkPX Ty8Cu1FD22GnFAbEsw/LZk/wggMeYPJB4uEGyWl6l7B06+BhzEPKpcTINdFn9Z4dYNTN KENG6HgIxtItAnwWaf2NGykjhiz4ITvPM1HK5H8Q89bYRlPcyEn3BdCNyig4vWh3i/kT 6D3w== X-Gm-Message-State: APjAAAXRzp5n2TVZUvMd825vcpexBgXkI6pDWr2zh6YxJ2NiH422Gfyi gLr8wpI6+KaZk2c1CTT6bDo= X-Received: by 2002:a6b:da01:: with SMTP id x1mr20531336iob.216.1562613886585; Mon, 08 Jul 2019 12:24:46 -0700 (PDT) Received: from Olgas-MBP-201.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id n17sm17026554iog.63.2019.07.08.12.24.45 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 08 Jul 2019 12:24:46 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com Cc: linux-nfs@vger.kernel.org Subject: [PATCH v10 04/12] NFS: inter ssc open Date: Mon, 8 Jul 2019 15:24:36 -0400 Message-Id: <20190708192444.12664-5-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20190708192444.12664-1-olga.kornievskaia@gmail.com> References: <20190708192444.12664-1-olga.kornievskaia@gmail.com> Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org From: Olga Kornievskaia NFSv4.2 inter server to server copy requires the destination server to READ the data from the source server using the provided stateid and file handle. Given an NFSv4 stateid and filehandle from the COPY operaion, provide the destination server with an NFS client function to create a struct file suitable for the destiniation server to READ the data to be copied. Signed-off-by: Olga Kornievskaia Signed-off-by: Andy Adamson --- fs/nfs/nfs4_fs.h | 7 ++++ fs/nfs/nfs4file.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++ fs/nfs/nfs4proc.c | 5 +-- 3 files changed, 103 insertions(+), 3 deletions(-) diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index d75fea7ecf12..ff1cd600f07f 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -311,6 +311,13 @@ extern int nfs4_set_rw_stateid(nfs4_stateid *stateid, const struct nfs_open_context *ctx, const struct nfs_lock_context *l_ctx, fmode_t fmode); +extern int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, + struct nfs_fattr *fattr, struct nfs4_label *label, + struct inode *inode); +extern int update_open_stateid(struct nfs4_state *state, + const nfs4_stateid *open_stateid, + const nfs4_stateid *deleg_stateid, + fmode_t fmode); #if defined(CONFIG_NFS_V4_1) extern int nfs41_sequence_done(struct rpc_task *, struct nfs4_sequence_res *); diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index b9825d02443e..aab4d48764a7 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "delegation.h" #include "internal.h" #include "iostat.h" @@ -282,6 +283,99 @@ static loff_t nfs42_remap_file_range(struct file *src_file, loff_t src_off, out: return ret < 0 ? ret : count; } + +static int read_name_gen = 1; +#define SSC_READ_NAME_BODY "ssc_read_%d" + +struct file * +nfs42_ssc_open(struct vfsmount *ss_mnt, struct nfs_fh *src_fh, + nfs4_stateid *stateid) +{ + struct nfs_fattr fattr; + struct file *filep, *res; + struct nfs_server *server; + struct inode *r_ino = NULL; + struct nfs_open_context *ctx; + struct nfs4_state_owner *sp; + char *read_name; + int len, status = 0; + + server = NFS_SERVER(ss_mnt->mnt_root->d_inode); + + nfs_fattr_init(&fattr); + + status = nfs4_proc_getattr(server, src_fh, &fattr, NULL, NULL); + if (status < 0) { + res = ERR_PTR(status); + goto out; + } + + res = ERR_PTR(-ENOMEM); + len = strlen(SSC_READ_NAME_BODY) + 16; + read_name = kzalloc(len, GFP_NOFS); + if (read_name == NULL) + goto out; + snprintf(read_name, len, SSC_READ_NAME_BODY, read_name_gen++); + + r_ino = nfs_fhget(ss_mnt->mnt_root->d_inode->i_sb, src_fh, &fattr, + NULL); + if (IS_ERR(r_ino)) { + res = ERR_CAST(r_ino); + goto out; + } + + filep = alloc_file_pseudo(r_ino, ss_mnt, read_name, FMODE_READ, + r_ino->i_fop); + if (IS_ERR(filep)) { + res = ERR_CAST(filep); + goto out; + } + filep->f_mode |= FMODE_READ; + + ctx = alloc_nfs_open_context(filep->f_path.dentry, filep->f_mode, + filep); + if (IS_ERR(ctx)) { + res = ERR_CAST(ctx); + goto out_filep; + } + + res = ERR_PTR(-EINVAL); + sp = nfs4_get_state_owner(server, ctx->cred, GFP_KERNEL); + if (sp == NULL) + goto out_ctx; + + ctx->state = nfs4_get_open_state(r_ino, sp); + if (ctx->state == NULL) + goto out_stateowner; + + set_bit(NFS_OPEN_STATE, &ctx->state->flags); + memcpy(&ctx->state->open_stateid.other, &stateid->other, + NFS4_STATEID_OTHER_SIZE); + update_open_stateid(ctx->state, stateid, NULL, filep->f_mode); + + nfs_file_set_open_context(filep, ctx); + put_nfs_open_context(ctx); + + file_ra_state_init(&filep->f_ra, filep->f_mapping->host->i_mapping); + res = filep; +out: + return res; +out_stateowner: + nfs4_put_state_owner(sp); +out_ctx: + put_nfs_open_context(ctx); +out_filep: + fput(filep); + goto out; +} +EXPORT_SYMBOL_GPL(nfs42_ssc_open); +void nfs42_ssc_close(struct file *filep) +{ + struct nfs_open_context *ctx = nfs_file_open_context(filep); + + ctx->state->flags = 0; +} +EXPORT_SYMBOL_GPL(nfs42_ssc_close); #endif /* CONFIG_NFS_V4_2 */ const struct file_operations nfs4_file_operations = { diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 9bbd9bad5412..c898ce1bccc6 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -91,7 +91,6 @@ struct nfs4_opendata; static int _nfs4_recover_proc_open(struct nfs4_opendata *data); static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr); -static int nfs4_proc_getattr(struct nfs_server *, struct nfs_fh *, struct nfs_fattr *, struct nfs4_label *label, struct inode *inode); static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label, struct inode *inode); static int nfs4_do_setattr(struct inode *inode, const struct cred *cred, struct nfs_fattr *fattr, struct iattr *sattr, @@ -1674,7 +1673,7 @@ static void nfs_state_clear_delegation(struct nfs4_state *state) write_sequnlock(&state->seqlock); } -static int update_open_stateid(struct nfs4_state *state, +int update_open_stateid(struct nfs4_state *state, const nfs4_stateid *open_stateid, const nfs4_stateid *delegation, fmode_t fmode) @@ -3966,7 +3965,7 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, return nfs4_call_sync(server->client, server, &msg, &args.seq_args, &res.seq_res, 0); } -static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, +int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr, struct nfs4_label *label, struct inode *inode) { -- 2.18.1