From patchwork Mon Oct 29 19:03:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990489 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="dYcgJmoW"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCS55lCz9sBq for ; Tue, 30 Oct 2018 06:04:04 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728285AbeJ3DyB (ORCPT ); Mon, 29 Oct 2018 23:54:01 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:40561 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725923AbeJ3DyB (ORCPT ); Mon, 29 Oct 2018 23:54:01 -0400 Received: by mail-qt1-f196.google.com with SMTP id k12so4705707qtf.7; Mon, 29 Oct 2018 12:04:02 -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=v5fKmkh8T+Ommp9W6hAHXoyDi5Y6lfOuGF2pswJXawE=; b=dYcgJmoWwDdjoLjnA7Swb+gssWTUz1sTHDHEafSYmQTSNHqoL0pX4/vKBLARLm0AuI P5jonfKSPwMMF/tbi6/Dv+b9+A/MHOTmXjRR1zXlCKnZHvtg5dwkmc9z1e8ZblyuRt42 xv3Pcbo9vCqI+fMVVmchtylCuUHVh4wgnJphmyBS87VbDlsANr/X7Df0O03eFsg0hQsr zG0UtUCVhrDFvvjDkMmUlWVuJWda6TOl7pUp5KXFLWcPd9D+LniuhPInP+2beYZytNKu HSxp8NpYr+V21bKney3sbMeSTclkRmPb/NGQJykygxz4ZDNx5YlCV+VPrWstyeKWe9HR R5Lg== 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=v5fKmkh8T+Ommp9W6hAHXoyDi5Y6lfOuGF2pswJXawE=; b=B65iCO+ZC5que3UTaX495ftGZBxdvGI0I5sIRx12AhhfIVzQcBJt7bFaisLRuelYGS cBiYyPINS3D8/3aBERuWw2hCv+SLnjUgV+6hSmXHCsXALOlOIyIq49ZGy4mkaWG5evBV VxYTXDs07WfQ1OpPNVXkYT0A7micu1e77Ps2ZG19tT2PPDcV6EY8pDCmWb4uplaqPyg2 EDGFXhAXGvwrdTZ5+Podn5jCIKdb8CW8Lk78aJk3stAtPEG6ckKILW/1KR9OUgvvhXNZ aKvxpKbgL42ISh+P77skKDtX4KwESZ5PzN8q2DvfblgwvjLrrrI33zw7IJxJ52o9SggU UwPg== X-Gm-Message-State: AGRZ1gKCm0ZmG/8witA+ZB8ynEMWzf4J3uho1+Gi/DF/RT7fmq19jkgR UOLsIHGCwzNx7KhLSVqtofs= X-Google-Smtp-Source: AJdET5efjAP78uWV5E7TZTR6aVNAtidRd/VoPiRIGSwHj6fjHvwgFkje73zkwjj7gicvmlC9FleYGA== X-Received: by 2002:aed:3a82:: with SMTP id o2-v6mr14003624qte.240.1540839842108; Mon, 29 Oct 2018 12:04:02 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.00 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:01 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 01/12] VFS: generic cross-device copy_file_range() support for all filesystems Date: Mon, 29 Oct 2018 15:03:45 -0400 Message-Id: <20181029190357.38439-2-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia In preparation for enabling cross-device offloading of copy_file_range() functionality, first enable generic cross-device support by allowing copy_file_range() to fall back to a page cache based physical data copy. This means the copy_file_range() syscall will never fail with EXDEV, and so in future userspace will not need to detect or provide a fallback for failed cross-device copies anymore. This requires pushing the cross device support checks down into the filesystem ->copy_file_range methods and falling back to the page cache copy if they return EXDEV. This will come in the following patch. Now enforcing same superblock check for copy_file_range(). Further, clone_file_range() is only supported within a filesystem, so we must also check that the files belong to the same superblock before calling ->clone_file_range(). If they are on different superblocks, skip the attempt to clone the file and instead try to copy the file. Signed-off-by: Olga Kornievskaia --- fs/read_write.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/fs/read_write.c b/fs/read_write.c index 39b4a21..70f6939 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -1575,10 +1575,6 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, (file_out->f_flags & O_APPEND)) return -EBADF; - /* this could be relaxed once a method supports cross-fs copies */ - if (inode_in->i_sb != inode_out->i_sb) - return -EXDEV; - if (len == 0) return 0; @@ -1588,7 +1584,8 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, * Try cloning first, this is supported by more file systems, and * more efficient if both clone and copy are supported (e.g. NFS). */ - if (file_in->f_op->clone_file_range) { + if (inode_in->i_sb == inode_out->i_sb && + file_in->f_op->clone_file_range) { ret = file_in->f_op->clone_file_range(file_in, pos_in, file_out, pos_out, len); if (ret == 0) { @@ -1597,7 +1594,8 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, } } - if (file_out->f_op->copy_file_range) { + if (inode_in->i_sb == inode_out->i_sb && + file_out->f_op->copy_file_range) { ret = file_out->f_op->copy_file_range(file_in, pos_in, file_out, pos_out, len, flags); if (ret != -EOPNOTSUPP) From patchwork Mon Oct 29 19:03:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990491 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="sQo6XU2y"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCY4LNZz9sBj for ; Tue, 30 Oct 2018 06:04:09 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729399AbeJ3DyG (ORCPT ); Mon, 29 Oct 2018 23:54:06 -0400 Received: from mail-qt1-f195.google.com ([209.85.160.195]:44027 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725923AbeJ3DyG (ORCPT ); Mon, 29 Oct 2018 23:54:06 -0400 Received: by mail-qt1-f195.google.com with SMTP id q41-v6so10562061qtq.10; Mon, 29 Oct 2018 12:04:07 -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=VV4M/cnS3hlXxtfqYU3EINln0tSbPvkrsIvgg+rY9zg=; b=sQo6XU2y5z0GSR+MhXF9q4GJTy/GWyIaBH1ljb3hGh5DWAuh0LLFCLeWiNYC4dVwXg flUQQad9Ik5JDuHMfQ29T5FxeZ2CrFrXgpmjIFD1rBztnbN35eBJcWcNHspzQCUME4m4 MSAe99xkXtWTDzAyCmm8OjG0wo1QMQuPikcvpXe5i9k51Gibf0/jKvwjbMWO96fACip3 /JLaPqsalwMLRS55kJcsnLTbougrqtXMpOroHWkECpflHMrPfK6KS2KBE98ik3l7PVMv yzK+ZisGxG+OIgOM/9+/n0Du/AEEeIpF7Ve1BO1WzHhHhUf3VZxoON274VggEl00Yngq cXtQ== 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=VV4M/cnS3hlXxtfqYU3EINln0tSbPvkrsIvgg+rY9zg=; b=hIvgrJuUW5xVv+adYiXZjSICSVCumZCzETGnO46azezWv3ElFoT5x7wA+JEXvQXDuS yBlxFDmfgsDG/tL32TgoiBh6+rcurj4NDo2S4HW8BYlqtxkxm9hSy2VwgO6dt3nbFP3M RYmRFbEsg+8kL8/1dkkhpBm/qLy8QzebIdCP4WgE3fTfMPMrFNC6RVhUkfNTHEsGZXR6 zVCKeiDYWyuljvW+6frafXBLz8VsFsd4+AJfsSHu1+eMAjt77eev2bCKZFGt4TuLerrW Yq1o7n0c5xEmHKT/+Mrq0JcN9o+U09QlySwgpPOIxQP9Gdx74SoAAUNtvHIZjnXP7zIr pCxQ== X-Gm-Message-State: AGRZ1gI8DIVQn9NjInDB97F4oFxWC6zk5fpcCtNu+nQ308uxfk/W/bfP HBPu+VpBO6ZC3c0SnAYvyQo= X-Google-Smtp-Source: AJdET5dTxJl/I0yHj2Q+jRYmUXASNnuvPHcwDmcaD3T5lxxbvzovrkPu2FkV0yM+9PtDXA9AQQhF6A== X-Received: by 2002:aed:2429:: with SMTP id r38-v6mr3975681qtc.128.1540839846651; Mon, 29 Oct 2018 12:04:06 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.04 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:05 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 02/12] VFS: move cross device copy_file_range() check into filesystems Date: Mon, 29 Oct 2018 15:03:47 -0400 Message-Id: <20181029190357.38439-4-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia This patch makes it the responsibility of individual filesystems to allow or deny cross device copies. Both NFS and CIFS have operations for cross-server copies, and later patches will implement this feature. Note that as of this patch, the copy_file_range() function might be passed superblocks from different filesystem types. -EXDEV should be returned if cross device copies aren't supported. Reviewed-by: Amir Goldstein Reviewed-by: Matthew Wilcox Reviewed-by: Steve French Reviewed-by: Jeff Layton Signed-off-by: Olga Kornievskaia --- Documentation/filesystems/porting | 7 +++++++ fs/cifs/cifsfs.c | 3 +++ fs/nfs/nfs4file.c | 3 +++ fs/overlayfs/file.c | 3 +++ fs/read_write.c | 5 ++--- 5 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index 7b7b845..897e1e7 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting @@ -622,3 +622,10 @@ in your dentry operations instead. alloc_file_clone(file, flags, ops) does not affect any caller's references. On success you get a new struct file sharing the mount/dentry with the original, on failure - ERR_PTR(). +-- +[mandatory] + ->copy_file_range() may now be passed files which belong to two + different superblocks of the same file system type or which belong + to two different filesystems types all together. As before, the + destination's copy_file_range() is the function which is called. + If it cannot copy ranges from the source, it should return -EXDEV. diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 7065426..ca8fc87 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -1114,6 +1114,9 @@ static ssize_t cifs_copy_file_range(struct file *src_file, loff_t off, unsigned int xid = get_xid(); ssize_t rc; + if (file_inode(src_file)->i_sb != file_inode(dst_file)->i_sb) + return -EXDEV; + rc = cifs_file_copychunk_range(xid, src_file, off, dst_file, destoff, len, flags); free_xid(xid); diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 4288a6e..5a73c90 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -135,6 +135,9 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in, { ssize_t ret; + if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) + return -EXDEV; + if (file_inode(file_in) == file_inode(file_out)) return -EINVAL; retry: diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c index aeaefd2..0331e33 100644 --- a/fs/overlayfs/file.c +++ b/fs/overlayfs/file.c @@ -483,6 +483,9 @@ static ssize_t ovl_copy_file_range(struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t len, unsigned int flags) { + if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) + return -EXDEV; + return ovl_copyfile(file_in, pos_in, file_out, pos_out, len, flags, OVL_COPY); } diff --git a/fs/read_write.c b/fs/read_write.c index 70f6939..cff59bd 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -1594,11 +1594,10 @@ ssize_t vfs_copy_file_range(struct file *file_in, loff_t pos_in, } } - if (inode_in->i_sb == inode_out->i_sb && - file_out->f_op->copy_file_range) { + if (file_out->f_op->copy_file_range) { ret = file_out->f_op->copy_file_range(file_in, pos_in, file_out, pos_out, len, flags); - if (ret != -EOPNOTSUPP) + if (ret != -EOPNOTSUPP && ret != -EXDEV) goto done; } From patchwork Mon Oct 29 19:03:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990492 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="PkiPvVK6"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCZ3yxMz9s9m for ; Tue, 30 Oct 2018 06:04:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729431AbeJ3DyH (ORCPT ); Mon, 29 Oct 2018 23:54:07 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:40574 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725923AbeJ3DyH (ORCPT ); Mon, 29 Oct 2018 23:54:07 -0400 Received: by mail-qt1-f196.google.com with SMTP id k12so4706149qtf.7; Mon, 29 Oct 2018 12:04:08 -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=nArMGW/INjteRrujdLkp69gM/ZmeUcX82tVQQvtlFnc=; b=PkiPvVK6v+vRhPNZbosjBxdv90qUWk6PekiblvS37xgMfqFL9LoH2sUHeVZZZwOjla eG48+GNFYtJY6lQCihlAK+1SshQp4bF6z6bBuXMQua4wbVM+RpeKpUZkw3VulBHL1ewZ qDj4DeQO9RT/uU/rj5r8v/UUjlkNOVJui6kN1GmdMYba0cJKPWpmmmJQCj2+L1mJYW1R cL3RKW3TTjmTAGFLuz8JRtTu/ImlAa5XQhII2v7e7/+N9TykttmcLJ+9ZVgTLeWbYliR gHmWTriRAn9vG0z5tQphayIDdACO+IckklAllI1uxCiQNLVreMRVnBMflHiUgQFsmVsU Xmbw== 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=nArMGW/INjteRrujdLkp69gM/ZmeUcX82tVQQvtlFnc=; b=S0Y/fH4qolkLha1F3xaNCxViK1PzWJX2+xk/T/1RM7PexviVRIBkCdjV0nDe9Os59F V4UGavtH4vhNYncKb6ikCjN8s4kqt11lJT0ZULSx5YFi5SA4nsSzF+OaJk7pTi6crnfL 8ERkO0vo7O5nwlB8Pnlu89jSnfUzN8R/EZu5QQCOhuO2lGioef5hIvYPrt+GvrIDL3aZ xYJUglkIM6x+7hlAcjz+wJaa3t3tLGaW1lcR38qURW1PqXhNqa6wCQIWmRBwxnqR6Rvn aS4D30GAXC0aHpIsgF3wQ9Ll2IUT+O65NG1aP1TonSpI6yo4uspOqNeqf62xKvvvKQ+I zW/g== X-Gm-Message-State: AGRZ1gKdROMq//OjMOEayP8PPdMvqf0xFSUpcK7xtDMOSBXzMMAZcZ5a wvKKHgZbs8UKOYpa779bU2w= X-Google-Smtp-Source: AJdET5cPTZPWikuv//UVpkUGGsjlDHuzdK36xsMoyvdCN7Hg095g+KFZFRAoU/5eOWeBzaqX/abvxA== X-Received: by 2002:aed:20a3:: with SMTP id 32-v6mr14230345qtb.195.1540839848116; Mon, 29 Oct 2018 12:04:08 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.06 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:07 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 03/12] NFS: validity check for source offset in copy_file_range Date: Mon, 29 Oct 2018 15:03:48 -0400 Message-Id: <20181029190357.38439-5-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia Input source offset can not be beyond the end of the file. Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs4file.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 5a73c90..7838bdf 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -135,6 +135,9 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in, { ssize_t ret; + if (pos_in >= i_size_read(file_inode(file_in))) + return -EINVAL; + if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) return -EXDEV; From patchwork Mon Oct 29 19:03:49 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990493 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="gwEh1aZy"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCc3fCDz9sC2 for ; Tue, 30 Oct 2018 06:04:12 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729443AbeJ3DyI (ORCPT ); Mon, 29 Oct 2018 23:54:08 -0400 Received: from mail-qk1-f194.google.com ([209.85.222.194]:44998 "EHLO mail-qk1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725923AbeJ3DyI (ORCPT ); Mon, 29 Oct 2018 23:54:08 -0400 Received: by mail-qk1-f194.google.com with SMTP id n12so5638389qkh.11; Mon, 29 Oct 2018 12:04:10 -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=CNj2pCMxPlcH1fEKnenx/QqOVUgHVEB5Ekmf2YUbfVA=; b=gwEh1aZyYGSNFFFz5kk7BIr2QIx4YC+/5+qpHQpOrqJvTQYESWipOP1iaLwC+XErI/ m1tedvFSKKF13UKf/fSjFP5QhRFrMEWPHquDl6DtzomehZdQ7ANQ+S5yKrF9MOHxcvAy q9Mlw6PoeRHL7L2AtqFepeBPXi8iPn5bNw8uqIFRBECI6ouZLVwkx0AKNx9FobXL4OP1 R9u55+MfgLXqozjjE7SmqlfTbULcZFnpybDfu7DvXaQZ53oiwoNqksbkc0KluK8Xdgm0 FRnNPhCRLGFsFkmVQN+L0rDJSGknAmeUXTBdTpBQDsGXh/Nj0g+vzlRqRsKZdgVBi/An luXw== 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=CNj2pCMxPlcH1fEKnenx/QqOVUgHVEB5Ekmf2YUbfVA=; b=mAOhH5l2j7l/QGWg8jFI5CzpgLClPBhR8TB8dUkvRF3LDzi/XzHaRNcN6YQzOYh+SE uX+vm8LpwsgngqJMqm8yKjKSt2QJym0961x2a7R2vivrs8E6QOPYEjxO7uFuWTAdSIlw COdxBFdwy4nf9YiwyXhMk3e1SthqpYMfrNq11Rs5kIVXqPBQQmUXhSMmIXXjGjSEbmD8 tWbPPoBj9ClsHE6+Ux2hBKYgoLSDPaocv5dQrA8tQL4uAI3GrdBXpLwb3ZdAcnxbRfyT qjBBzDPps7wBYsCbJcB3aQyk47tg3S9lgGDF4Yc0kUWFjK809eVv87L+UP6mRwzX4ni4 8HsQ== X-Gm-Message-State: AGRZ1gKZSDsY+WG4GoByZllPOEDqupTkUFA5NOcquRh8O6Y/fgrkv0fM gzyc6icgnk4S3m/ZlZzNcCw= X-Google-Smtp-Source: AJdET5fEvOkkSLADksyuO2iNpjbJro5W5LMaIeEI6lBrKNeqzThyX7wVcY5EfG+LIkVRBFsGAgoz+A== X-Received: by 2002:a37:8d4:: with SMTP id 203mr5727983qki.338.1540839849730; Mon, 29 Oct 2018 12:04:09 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.08 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:08 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 04/12] NFS NFSD: defining nl4_servers structure needed by both Date: Mon, 29 Oct 2018 15:03:49 -0400 Message-Id: <20181029190357.38439-6-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia These structures are needed by COPY_NOTIFY on the client and needed by the nfsd as well Reviewed-by: Jeff Layton Signed-off-by: Olga Kornievskaia --- include/linux/nfs4.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 1b06f0b..4803507 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -16,6 +16,7 @@ #include #include #include +#include enum nfs4_acl_whotype { NFS4_ACL_WHO_NAMED = 0, @@ -672,4 +673,27 @@ struct nfs4_op_map { } u; }; +struct nfs42_netaddr { + char netid[RPCBIND_MAXNETIDLEN]; + char addr[RPCBIND_MAXUADDRLEN + 1]; + u32 netid_len; + u32 addr_len; +}; + +enum netloc_type4 { + NL4_NAME = 1, + NL4_URL = 2, + NL4_NETADDR = 3, +}; + +struct nl4_server { + enum netloc_type4 nl4_type; + union { + struct { /* NL4_NAME, NL4_URL */ + int nl4_str_sz; + char nl4_str[NFS4_OPAQUE_LIMIT + 1]; + }; + struct nfs42_netaddr nl4_addr; /* NL4_NETADDR */ + } u; +}; #endif From patchwork Mon Oct 29 19:03:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990494 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="VJU0cOPE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCf5w12z9sBj for ; Tue, 30 Oct 2018 06:04:14 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729450AbeJ3DyL (ORCPT ); Mon, 29 Oct 2018 23:54:11 -0400 Received: from mail-qt1-f195.google.com ([209.85.160.195]:33324 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725923AbeJ3DyL (ORCPT ); Mon, 29 Oct 2018 23:54:11 -0400 Received: by mail-qt1-f195.google.com with SMTP id i15-v6so10613165qtr.0; Mon, 29 Oct 2018 12:04:12 -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=sxpwy6K01WTZfX4+OAfEXIBBPNNAjwngI4oqBhF7nFk=; b=VJU0cOPEcAFXAWIjilvYWq5tHv7p4RO3W+DcztYs6uBKX81ttYwiIArF4m0G+ApRRf lcOhx+cY4DC9OpTBegY5X9POaejlAf+hXwsQwaMVpb0TDStJe5WAXiCtxDUPdHhXxQcw ju0uGahx0UezQvimkwKBhd4GMKI0vOwbIEnQGxJanOhl91vaGfXCLr4VhZY47SvT5Kaq o0clgnyyL4QcmUOCrOfX6hk1xHksRk0MNPQlfWTQAMDfsB+oaxnwkhDPi9Sf+a1nUGYP VDrgqn9ljiJLugXPI1Gpkv7/Rm4o0TRgEAAufn82gV1YzC/AHyj6gq3GAGJLyFD65EdW B2lA== 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=sxpwy6K01WTZfX4+OAfEXIBBPNNAjwngI4oqBhF7nFk=; b=c0s9smOBVKhAee7mZRwUObCI2Cd9n1JgjZjMsXXppkx7TBrOxpmMcY+gegF5R219/B sNRo1+cNEPBFhoIWhQFrn0ZaQPfQZTaZUJtCQpPBNbxUEzQbkn64dNO+XV3+jxx85tcI vaNofvSulikiUmAaY4QGFFl9FN6+Bcx5U5wR/LVUWv9RXGLVutmQAjgSZAlax34PnrPv zdDUvpCYrxu4pmQ0tLDcGhqrPK8hYQ8X21JAz7pHmwqtdtqz3TgxrDDDnlpUeB6P/gg7 LENCLXIt4YT8Oa7/SpDEMlgotAxQiVYkCpFu8eOHK3VU4ZJ5tncyzxeCErkxnKhjOOFv h/NQ== X-Gm-Message-State: AGRZ1gLd8OrS/piay3B7L9XeAohYqugDvjVaFHXCzjyzIThJahFAjVVD 7ovjqjKd2sWnMAw1SOJCRRo= X-Google-Smtp-Source: AJdET5eoP/04qoPLsKXQEaaPoBVHpaIQCoa+sZIw0n1/5tgv5SWuXwcQtiQz+kI+8kPTwf+Tee3QSg== X-Received: by 2002:a0c:fd8a:: with SMTP id p10mr5283441qvr.48.1540839851708; Mon, 29 Oct 2018 12:04:11 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.09 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:10 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 05/12] NFS: add COPY_NOTIFY operation Date: Mon, 29 Oct 2018 15:03:50 -0400 Message-Id: <20181029190357.38439-7-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia Try using the delegation stateid, then the open stateid. Only NL4_NETATTR, No support for NL4_NAME and NL4_URL. Allow only one source server address to be returned for now. To distinguish between same server copy offload ("intra") and a copy between different server ("inter"), do a check of server owner identity. Reviewed-by: Jeff Layton Signed-off-by: Andy Adamson Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs42.h | 12 +++ fs/nfs/nfs42proc.c | 91 +++++++++++++++++++++++ fs/nfs/nfs42xdr.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++ fs/nfs/nfs4_fs.h | 2 + fs/nfs/nfs4client.c | 2 +- fs/nfs/nfs4file.c | 14 ++++ fs/nfs/nfs4proc.c | 1 + fs/nfs/nfs4xdr.c | 1 + include/linux/nfs4.h | 1 + include/linux/nfs_fs_sb.h | 1 + include/linux/nfs_xdr.h | 16 ++++ 11 files changed, 321 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs42.h b/fs/nfs/nfs42.h index 19ec38f8..bbe49a3 100644 --- a/fs/nfs/nfs42.h +++ b/fs/nfs/nfs42.h @@ -13,6 +13,7 @@ #define PNFS_LAYOUTSTATS_MAXDEV (4) /* nfs4.2proc.c */ +#ifdef CONFIG_NFS_V4_2 int nfs42_proc_allocate(struct file *, loff_t, loff_t); ssize_t nfs42_proc_copy(struct file *, loff_t, struct file *, loff_t, size_t); int nfs42_proc_deallocate(struct file *, loff_t, loff_t); @@ -20,5 +21,16 @@ int nfs42_proc_layoutstats_generic(struct nfs_server *, struct nfs42_layoutstat_data *); int nfs42_proc_clone(struct file *, struct file *, loff_t, loff_t, loff_t); +int nfs42_proc_copy_notify(struct file *, struct file *, + struct nfs42_copy_notify_res *); +static inline bool nfs42_files_from_same_server(struct file *in, + struct file *out) +{ + struct nfs_client *c_in = (NFS_SERVER(file_inode(in)))->nfs_client; + struct nfs_client *c_out = (NFS_SERVER(file_inode(out)))->nfs_client; + return nfs4_check_serverowner_major_id(c_in->cl_serverowner, + c_out->cl_serverowner); +} +#endif /* CONFIG_NFS_V4_2 */ #endif /* __LINUX_FS_NFS_NFS4_2_H */ diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index ac5b784..b1c57a4 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -3,6 +3,7 @@ * Copyright (c) 2014 Anna Schumaker */ #include +#include #include #include #include @@ -15,10 +16,30 @@ #include "pnfs.h" #include "nfs4session.h" #include "internal.h" +#include "delegation.h" #define NFSDBG_FACILITY NFSDBG_PROC static int nfs42_do_offload_cancel_async(struct file *dst, nfs4_stateid *std); +static void nfs42_set_netaddr(struct file *filep, struct nfs42_netaddr *naddr) +{ + struct nfs_client *clp = (NFS_SERVER(file_inode(filep)))->nfs_client; + unsigned short port = 2049; + + rcu_read_lock(); + naddr->netid_len = scnprintf(naddr->netid, + sizeof(naddr->netid), "%s", + rpc_peeraddr2str(clp->cl_rpcclient, + RPC_DISPLAY_NETID)); + naddr->addr_len = scnprintf(naddr->addr, + sizeof(naddr->addr), + "%s.%u.%u", + rpc_peeraddr2str(clp->cl_rpcclient, + RPC_DISPLAY_ADDR), + port >> 8, port & 255); + rcu_read_unlock(); +} + static int _nfs42_proc_fallocate(struct rpc_message *msg, struct file *filep, struct nfs_lock_context *lock, loff_t offset, loff_t len) { @@ -461,6 +482,76 @@ static int nfs42_do_offload_cancel_async(struct file *dst, return status; } +int _nfs42_proc_copy_notify(struct file *src, struct file *dst, + struct nfs42_copy_notify_args *args, + struct nfs42_copy_notify_res *res) +{ + struct nfs_server *src_server = NFS_SERVER(file_inode(src)); + struct rpc_message msg = { + .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY_NOTIFY], + .rpc_argp = args, + .rpc_resp = res, + }; + int status; + struct nfs_open_context *ctx; + struct nfs_lock_context *l_ctx; + + ctx = get_nfs_open_context(nfs_file_open_context(src)); + l_ctx = nfs_get_lock_context(ctx); + if (IS_ERR(l_ctx)) + return PTR_ERR(l_ctx); + + status = nfs4_set_rw_stateid(&args->cna_src_stateid, ctx, l_ctx, + FMODE_READ); + nfs_put_lock_context(l_ctx); + if (status) + return status; + + status = nfs4_call_sync(src_server->client, src_server, &msg, + &args->cna_seq_args, &res->cnr_seq_res, 0); + if (status == -ENOTSUPP) + src_server->caps &= ~NFS_CAP_COPY_NOTIFY; + + put_nfs_open_context(nfs_file_open_context(src)); + return status; +} + +int nfs42_proc_copy_notify(struct file *src, struct file *dst, + struct nfs42_copy_notify_res *res) +{ + struct nfs_server *src_server = NFS_SERVER(file_inode(src)); + struct nfs42_copy_notify_args *args; + struct nfs4_exception exception = { + .inode = file_inode(src), + }; + int status; + + if (!(src_server->caps & NFS_CAP_COPY_NOTIFY)) + return -EOPNOTSUPP; + + args = kzalloc(sizeof(struct nfs42_copy_notify_args), GFP_NOFS); + if (args == NULL) + return -ENOMEM; + + args->cna_src_fh = NFS_FH(file_inode(src)), + args->cna_dst.nl4_type = NL4_NETADDR; + nfs42_set_netaddr(dst, &args->cna_dst.u.nl4_addr); + exception.stateid = &args->cna_src_stateid; + + do { + status = _nfs42_proc_copy_notify(src, dst, args, res); + if (status == -ENOTSUPP) { + status = -EOPNOTSUPP; + goto out; + } + status = nfs4_handle_exception(src_server, status, &exception); + } while (exception.retry); + +out: + kfree(args); + return status; +} + static loff_t _nfs42_proc_llseek(struct file *filep, struct nfs_lock_context *lock, loff_t offset, int whence) { diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index 69f72ed..e6e7cbf 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -29,6 +29,16 @@ #define encode_offload_cancel_maxsz (op_encode_hdr_maxsz + \ XDR_QUADLEN(NFS4_STATEID_SIZE)) #define decode_offload_cancel_maxsz (op_decode_hdr_maxsz) +#define encode_copy_notify_maxsz (op_encode_hdr_maxsz + \ + XDR_QUADLEN(NFS4_STATEID_SIZE) + \ + 1 + /* nl4_type */ \ + 1 + XDR_QUADLEN(NFS4_OPAQUE_LIMIT)) +#define decode_copy_notify_maxsz (op_decode_hdr_maxsz + \ + 3 + /* cnr_lease_time */\ + XDR_QUADLEN(NFS4_STATEID_SIZE) + \ + 1 + /* Support 1 cnr_source_server */\ + 1 + /* nl4_type */ \ + 1 + XDR_QUADLEN(NFS4_OPAQUE_LIMIT)) #define encode_deallocate_maxsz (op_encode_hdr_maxsz + \ encode_fallocate_maxsz) #define decode_deallocate_maxsz (op_decode_hdr_maxsz) @@ -84,6 +94,12 @@ #define NFS4_dec_offload_cancel_sz (compound_decode_hdr_maxsz + \ decode_putfh_maxsz + \ decode_offload_cancel_maxsz) +#define NFS4_enc_copy_notify_sz (compound_encode_hdr_maxsz + \ + encode_putfh_maxsz + \ + encode_copy_notify_maxsz) +#define NFS4_dec_copy_notify_sz (compound_decode_hdr_maxsz + \ + decode_putfh_maxsz + \ + decode_copy_notify_maxsz) #define NFS4_enc_deallocate_sz (compound_encode_hdr_maxsz + \ encode_putfh_maxsz + \ encode_deallocate_maxsz + \ @@ -137,6 +153,25 @@ static void encode_allocate(struct xdr_stream *xdr, encode_fallocate(xdr, args); } +static void encode_nl4_server(struct xdr_stream *xdr, const struct nl4_server *ns) +{ + encode_uint32(xdr, ns->nl4_type); + switch (ns->nl4_type) { + case NL4_NAME: + case NL4_URL: + encode_string(xdr, ns->u.nl4_str_sz, ns->u.nl4_str); + break; + case NL4_NETADDR: + encode_string(xdr, ns->u.nl4_addr.netid_len, + ns->u.nl4_addr.netid); + encode_string(xdr, ns->u.nl4_addr.addr_len, + ns->u.nl4_addr.addr); + break; + default: + WARN_ON_ONCE(1); + } +} + static void encode_copy(struct xdr_stream *xdr, const struct nfs42_copy_args *args, struct compound_hdr *hdr) @@ -162,6 +197,15 @@ static void encode_offload_cancel(struct xdr_stream *xdr, encode_nfs4_stateid(xdr, &args->osa_stateid); } +static void encode_copy_notify(struct xdr_stream *xdr, + const struct nfs42_copy_notify_args *args, + struct compound_hdr *hdr) +{ + encode_op_hdr(xdr, OP_COPY_NOTIFY, decode_copy_notify_maxsz, hdr); + encode_nfs4_stateid(xdr, &args->cna_src_stateid); + encode_nl4_server(xdr, &args->cna_dst); +} + static void encode_deallocate(struct xdr_stream *xdr, const struct nfs42_falloc_args *args, struct compound_hdr *hdr) @@ -298,6 +342,25 @@ static void nfs4_xdr_enc_offload_cancel(struct rpc_rqst *req, } /* + * Encode COPY_NOTIFY request + */ +static void nfs4_xdr_enc_copy_notify(struct rpc_rqst *req, + struct xdr_stream *xdr, + const void *data) +{ + const struct nfs42_copy_notify_args *args = data; + struct compound_hdr hdr = { + .minorversion = nfs4_xdr_minorversion(&args->cna_seq_args), + }; + + encode_compound_hdr(xdr, req, &hdr); + encode_sequence(xdr, &args->cna_seq_args, &hdr); + encode_putfh(xdr, args->cna_src_fh, &hdr); + encode_copy_notify(xdr, args, &hdr); + encode_nops(&hdr); +} + +/* * Encode DEALLOCATE request */ static void nfs4_xdr_enc_deallocate(struct rpc_rqst *req, @@ -416,6 +479,58 @@ static int decode_write_response(struct xdr_stream *xdr, return -EIO; } +static int decode_nl4_server(struct xdr_stream *xdr, struct nl4_server *ns) +{ + struct nfs42_netaddr *naddr; + uint32_t dummy; + char *dummy_str; + __be32 *p; + int status; + + /* nl_type */ + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + return -EIO; + ns->nl4_type = be32_to_cpup(p); + switch (ns->nl4_type) { + case NL4_NAME: + case NL4_URL: + status = decode_opaque_inline(xdr, &dummy, &dummy_str); + if (unlikely(status)) + return status; + if (unlikely(dummy > NFS4_OPAQUE_LIMIT)) + return -EIO; + memcpy(&ns->u.nl4_str, dummy_str, dummy); + ns->u.nl4_str_sz = dummy; + break; + case NL4_NETADDR: + naddr = &ns->u.nl4_addr; + + /* netid string */ + status = decode_opaque_inline(xdr, &dummy, &dummy_str); + if (unlikely(status)) + return status; + if (unlikely(dummy > RPCBIND_MAXNETIDLEN)) + return -EIO; + naddr->netid_len = dummy; + memcpy(naddr->netid, dummy_str, naddr->netid_len); + + /* uaddr string */ + status = decode_opaque_inline(xdr, &dummy, &dummy_str); + if (unlikely(status)) + return status; + if (unlikely(dummy > RPCBIND_MAXUADDRLEN)) + return -EIO; + naddr->addr_len = dummy; + memcpy(naddr->addr, dummy_str, naddr->addr_len); + break; + default: + WARN_ON_ONCE(1); + return -EIO; + } + return 0; +} + static int decode_copy_requirements(struct xdr_stream *xdr, struct nfs42_copy_res *res) { __be32 *p; @@ -458,6 +573,46 @@ static int decode_offload_cancel(struct xdr_stream *xdr, return decode_op_hdr(xdr, OP_OFFLOAD_CANCEL); } +static int decode_copy_notify(struct xdr_stream *xdr, + struct nfs42_copy_notify_res *res) +{ + __be32 *p; + int status, count; + + status = decode_op_hdr(xdr, OP_COPY_NOTIFY); + if (status) + return status; + /* cnr_lease_time */ + p = xdr_inline_decode(xdr, 12); + if (unlikely(!p)) + goto out_overflow; + p = xdr_decode_hyper(p, &res->cnr_lease_time.seconds); + res->cnr_lease_time.nseconds = be32_to_cpup(p); + + status = decode_opaque_fixed(xdr, &res->cnr_stateid, NFS4_STATEID_SIZE); + if (unlikely(status)) + goto out_overflow; + + /* number of source addresses */ + p = xdr_inline_decode(xdr, 4); + if (unlikely(!p)) + goto out_overflow; + + count = be32_to_cpup(p); + if (count > 1) + pr_warn("NFS: %s: nsvr %d > Supported. Use first servers\n", + __func__, count); + + status = decode_nl4_server(xdr, &res->cnr_src); + if (unlikely(status)) + goto out_overflow; + return 0; + +out_overflow: + print_overflow_msg(__func__, xdr); + return -EIO; +} + static int decode_deallocate(struct xdr_stream *xdr, struct nfs42_falloc_res *res) { return decode_op_hdr(xdr, OP_DEALLOCATE); @@ -585,6 +740,32 @@ static int nfs4_xdr_dec_offload_cancel(struct rpc_rqst *rqstp, } /* + * Decode COPY_NOTIFY response + */ +static int nfs4_xdr_dec_copy_notify(struct rpc_rqst *rqstp, + struct xdr_stream *xdr, + void *data) +{ + struct nfs42_copy_notify_res *res = data; + struct compound_hdr hdr; + int status; + + status = decode_compound_hdr(xdr, &hdr); + if (status) + goto out; + status = decode_sequence(xdr, &res->cnr_seq_res, rqstp); + if (status) + goto out; + status = decode_putfh(xdr); + if (status) + goto out; + status = decode_copy_notify(xdr, res); + +out: + return status; +} + +/* * Decode DEALLOCATE request */ static int nfs4_xdr_dec_deallocate(struct rpc_rqst *rqstp, diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 8d59c96..7d17b31 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -460,6 +460,8 @@ int nfs41_discover_server_trunking(struct nfs_client *clp, struct nfs_client **, struct rpc_cred *); extern void nfs4_schedule_session_recovery(struct nfs4_session *, int); extern void nfs41_notify_server(struct nfs_client *); +bool nfs4_check_serverowner_major_id(struct nfs41_server_owner *o1, + struct nfs41_server_owner *o2); #else static inline void nfs4_schedule_session_recovery(struct nfs4_session *session, int err) { diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 8f53455..ac00eb8 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c @@ -625,7 +625,7 @@ int nfs40_walk_client_list(struct nfs_client *new, /* * Returns true if the server major ids match */ -static bool +bool nfs4_check_serverowner_major_id(struct nfs41_server_owner *o1, struct nfs41_server_owner *o2) { diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 7838bdf..beda4b3 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -133,6 +133,7 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, size_t count, unsigned int flags) { + struct nfs42_copy_notify_res *cn_resp = NULL; ssize_t ret; if (pos_in >= i_size_read(file_inode(file_in))) @@ -144,7 +145,20 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in, if (file_inode(file_in) == file_inode(file_out)) return -EINVAL; retry: + if (!nfs42_files_from_same_server(file_in, file_out)) { + cn_resp = kzalloc(sizeof(struct nfs42_copy_notify_res), + GFP_NOFS); + if (unlikely(cn_resp == NULL)) + return -ENOMEM; + + ret = nfs42_proc_copy_notify(file_in, file_out, cn_resp); + if (ret) + goto out; + } + ret = nfs42_proc_copy(file_in, pos_in, file_out, pos_out, count); +out: + kfree(cn_resp); if (ret == -EAGAIN) goto retry; return ret; diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index db84b4a..fec6e6b 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -9692,6 +9692,7 @@ static bool nfs4_match_stateid(const nfs4_stateid *s1, | NFS_CAP_ALLOCATE | NFS_CAP_COPY | NFS_CAP_OFFLOAD_CANCEL + | NFS_CAP_COPY_NOTIFY | NFS_CAP_DEALLOCATE | NFS_CAP_SEEK | NFS_CAP_LAYOUTSTATS diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index b7bde12..2163900 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c @@ -7790,6 +7790,7 @@ int nfs4_decode_dirent(struct xdr_stream *xdr, struct nfs_entry *entry, PROC42(CLONE, enc_clone, dec_clone), PROC42(COPY, enc_copy, dec_copy), PROC42(OFFLOAD_CANCEL, enc_offload_cancel, dec_offload_cancel), + PROC42(COPY_NOTIFY, enc_copy_notify, dec_copy_notify), PROC(LOOKUPP, enc_lookupp, dec_lookupp), }; diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index 4803507..9e49a6c 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h @@ -537,6 +537,7 @@ enum { NFSPROC4_CLNT_CLONE, NFSPROC4_CLNT_COPY, NFSPROC4_CLNT_OFFLOAD_CANCEL, + NFSPROC4_CLNT_COPY_NOTIFY, NFSPROC4_CLNT_LOOKUPP, }; diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 0fc0b91..e5d89ff 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h @@ -261,5 +261,6 @@ struct nfs_server { #define NFS_CAP_CLONE (1U << 23) #define NFS_CAP_COPY (1U << 24) #define NFS_CAP_OFFLOAD_CANCEL (1U << 25) +#define NFS_CAP_COPY_NOTIFY (1U << 26) #endif diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 0e01625..dfc59bc 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -1428,6 +1428,22 @@ struct nfs42_offload_status_res { int osr_status; }; +struct nfs42_copy_notify_args { + struct nfs4_sequence_args cna_seq_args; + + struct nfs_fh *cna_src_fh; + nfs4_stateid cna_src_stateid; + struct nl4_server cna_dst; +}; + +struct nfs42_copy_notify_res { + struct nfs4_sequence_res cnr_seq_res; + + struct nfstime4 cnr_lease_time; + nfs4_stateid cnr_stateid; + struct nl4_server cnr_src; +}; + struct nfs42_seek_args { struct nfs4_sequence_args seq_args; From patchwork Mon Oct 29 19:03:51 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990495 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Zobboxoi"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCh1d07z9sC2 for ; Tue, 30 Oct 2018 06:04:16 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729465AbeJ3DyN (ORCPT ); Mon, 29 Oct 2018 23:54:13 -0400 Received: from mail-qt1-f194.google.com ([209.85.160.194]:36581 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725923AbeJ3DyN (ORCPT ); Mon, 29 Oct 2018 23:54:13 -0400 Received: by mail-qt1-f194.google.com with SMTP id u34-v6so10587030qth.3; Mon, 29 Oct 2018 12:04:13 -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=L/lyESnrT7eI5UkekwLVWgapYd9jVCBDfyygHzXaoSk=; b=Zobboxoi3rIHLzjq5cGCEFtypv86Xv/IGeKN8d0b/pMziuwT3VhH50N5oQUG+fRHaw 0L24LgoMJpc0UZ1AAY4rWJ9DI2uPTRTDw8pH+sUM54DrGQ66X00YJ8f4T6JWRzGpmgeI GLaJUS7LK65dGRdNtf/BQ8VSLOjOb0NRyWsLeH6wY2ElcQ12vkBD2mD0oNlnVurkeN5t 4dC1LjnbABkQx4tB2+a0Z3WUXsxZCeAHQ0nQPegB2MfJF0W0NDBioChn6JPFOQJND5hf iiwm7GJ8vR0HpMuwOtuJyCtJiM0CsZLECFG7Qw47Ifl5PwzVv4GNGQWeQcRZU8hsAuLe uNGg== 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=L/lyESnrT7eI5UkekwLVWgapYd9jVCBDfyygHzXaoSk=; b=QjitRo12kaTcUs+TQ+O5AY+ay8mM6lEhvVW7X3aEEGPba86V/35RP3pX1or0rnp/kG enaZbaqIeY5Jktk5+XPhIiAg5WO/DlYuQdIKW9Aa6YYYpAJ/i/7i9bwaotu0MSeoEPV9 S/8Cnxz7HyZGooe6LmxiSAbR24w63SC5LMC1adlkah7vJj+7wypOgfUs3I6HjJ0xgzuu rmigQYmBnRQN1MJlruVTZmMxFu3KZMlX9FMaj8lLWCNrve1Qh0AMIVfPDsFgnO6B0lnm zC0SEWB2snaLUAC3H1KdY3qZFp/vwGV2ZeZ2uFadd9qZN91KShoe/kJEJdtaaE1y0lE1 W+5Q== X-Gm-Message-State: AGRZ1gKBbWbfH8C40byqJe/suwxBm9R9I8Jf4+PSzSlXnJnGrEAH499z hkmNgmMctoz2qdv4/CUbhY8= X-Google-Smtp-Source: AJdET5d7e8cu+pNjkadlnIuYManbEADxkKfkh6r1slOVmkYEMdaHR2Dw8Sc/Oxv6idX2WPm65dXeLg== X-Received: by 2002:ac8:3a81:: with SMTP id x1-v6mr14557542qte.370.1540839853437; Mon, 29 Oct 2018 12:04:13 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.11 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:12 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 06/12] NFS: add ca_source_server<> to COPY Date: Mon, 29 Oct 2018 15:03:51 -0400 Message-Id: <20181029190357.38439-8-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia Support only one source server address: the same address that the client and source server use. Signed-off-by: Andy Adamson Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs42.h | 3 ++- fs/nfs/nfs42proc.c | 26 +++++++++++++++++--------- fs/nfs/nfs42xdr.c | 12 ++++++++++-- fs/nfs/nfs4file.c | 7 ++++++- include/linux/nfs_xdr.h | 1 + 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/fs/nfs/nfs42.h b/fs/nfs/nfs42.h index bbe49a3..28dcee5 100644 --- a/fs/nfs/nfs42.h +++ b/fs/nfs/nfs42.h @@ -15,7 +15,8 @@ /* nfs4.2proc.c */ #ifdef CONFIG_NFS_V4_2 int nfs42_proc_allocate(struct file *, loff_t, loff_t); -ssize_t nfs42_proc_copy(struct file *, loff_t, struct file *, loff_t, size_t); +ssize_t nfs42_proc_copy(struct file *, loff_t, struct file *, loff_t, size_t, + struct nl4_server *, nfs4_stateid *); int nfs42_proc_deallocate(struct file *, loff_t, loff_t); loff_t nfs42_proc_llseek(struct file *, loff_t, int); int nfs42_proc_layoutstats_generic(struct nfs_server *, diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index b1c57a4..bb9e799 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -242,7 +242,9 @@ static ssize_t _nfs42_proc_copy(struct file *src, struct file *dst, struct nfs_lock_context *dst_lock, struct nfs42_copy_args *args, - struct nfs42_copy_res *res) + struct nfs42_copy_res *res, + struct nl4_server *nss, + nfs4_stateid *cnr_stateid) { struct rpc_message msg = { .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY], @@ -256,11 +258,15 @@ static ssize_t _nfs42_proc_copy(struct file *src, size_t count = args->count; ssize_t status; - status = nfs4_set_rw_stateid(&args->src_stateid, src_lock->open_context, - src_lock, FMODE_READ); - if (status) - return status; - + if (nss) { + args->cp_src = nss; + nfs4_stateid_copy(&args->src_stateid, cnr_stateid); + } else { + status = nfs4_set_rw_stateid(&args->src_stateid, + src_lock->open_context, src_lock, FMODE_READ); + if (status) + return status; + } status = nfs_filemap_write_and_wait_range(file_inode(src)->i_mapping, pos_src, pos_src + (loff_t)count - 1); if (status) @@ -324,8 +330,9 @@ static ssize_t _nfs42_proc_copy(struct file *src, } ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, - struct file *dst, loff_t pos_dst, - size_t count) + struct file *dst, loff_t pos_dst, size_t count, + struct nl4_server *nss, + nfs4_stateid *cnr_stateid) { struct nfs_server *server = NFS_SERVER(file_inode(dst)); struct nfs_lock_context *src_lock; @@ -370,7 +377,8 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, inode_lock(file_inode(dst)); err = _nfs42_proc_copy(src, src_lock, dst, dst_lock, - &args, &res); + &args, &res, + nss, cnr_stateid); inode_unlock(file_inode(dst)); if (err >= 0) diff --git a/fs/nfs/nfs42xdr.c b/fs/nfs/nfs42xdr.c index e6e7cbf..c96c3f8 100644 --- a/fs/nfs/nfs42xdr.c +++ b/fs/nfs/nfs42xdr.c @@ -21,7 +21,10 @@ #define encode_copy_maxsz (op_encode_hdr_maxsz + \ XDR_QUADLEN(NFS4_STATEID_SIZE) + \ XDR_QUADLEN(NFS4_STATEID_SIZE) + \ - 2 + 2 + 2 + 1 + 1 + 1) + 2 + 2 + 2 + 1 + 1 + 1 +\ + 1 + /* One cnr_source_server */\ + 1 + /* nl4_type */ \ + 1 + XDR_QUADLEN(NFS4_OPAQUE_LIMIT)) #define decode_copy_maxsz (op_decode_hdr_maxsz + \ NFS42_WRITE_RES_SIZE + \ 1 /* cr_consecutive */ + \ @@ -186,7 +189,12 @@ static void encode_copy(struct xdr_stream *xdr, encode_uint32(xdr, 1); /* consecutive = true */ encode_uint32(xdr, args->sync); - encode_uint32(xdr, 0); /* src server list */ + if (args->cp_src == NULL) { /* intra-ssc */ + encode_uint32(xdr, 0); /* no src server list */ + return; + } + encode_uint32(xdr, 1); /* supporting 1 server */ + encode_nl4_server(xdr, args->cp_src); } static void encode_offload_cancel(struct xdr_stream *xdr, diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index beda4b3..e5c1a68 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -134,6 +134,8 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in, size_t count, unsigned int flags) { struct nfs42_copy_notify_res *cn_resp = NULL; + struct nl4_server *nss = NULL; + nfs4_stateid *cnrs = NULL; ssize_t ret; if (pos_in >= i_size_read(file_inode(file_in))) @@ -154,9 +156,12 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in, ret = nfs42_proc_copy_notify(file_in, file_out, cn_resp); if (ret) goto out; + nss = &cn_resp->cnr_src; + cnrs = &cn_resp->cnr_stateid; } - ret = nfs42_proc_copy(file_in, pos_in, file_out, pos_out, count); + ret = nfs42_proc_copy(file_in, pos_in, file_out, pos_out, count, nss, + cnrs); out: kfree(cn_resp); if (ret == -EAGAIN) diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index dfc59bc..3a40b17 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h @@ -1400,6 +1400,7 @@ struct nfs42_copy_args { u64 count; bool sync; + struct nl4_server *cp_src; }; struct nfs42_write_res { From patchwork Mon Oct 29 19:03:52 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990496 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="FXoZ44PX"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCk2ckPz9sBj for ; Tue, 30 Oct 2018 06:04:18 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729473AbeJ3DyO (ORCPT ); Mon, 29 Oct 2018 23:54:14 -0400 Received: from mail-qt1-f194.google.com ([209.85.160.194]:33331 "EHLO mail-qt1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725969AbeJ3DyO (ORCPT ); Mon, 29 Oct 2018 23:54:14 -0400 Received: by mail-qt1-f194.google.com with SMTP id i15-v6so10613396qtr.0; Mon, 29 Oct 2018 12:04:15 -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=DqnHnZrMSvA0or48b6pnWzyYDz4iWYc8+TMTuA2+K94=; b=FXoZ44PXZaoiI5U/LlShSfMtLHpKwDvZEDri1ITE0YaMbnkGD1XLdLHUC9ppdaNp16 hT0IrrpcbCqNK13NJLpZQJFlRqgrynw+TXt/2vrgNFiZsn/vlIMnNHGphVU9Bk7VHDdP wTUXZ0qTejBsJ3+j4+R1a3Lp3TOybON2i/hUrVmhRJOU8EvbEMPA3KBzU114eHuDRW96 1R4HeDR96bYr2boI+ykW9SN1QdPWqFrKeWZgQNNT0JHyiB8nejF40fNE+D1Z8FbMy5aq Ndn5TnXl/74Fm1MQcvMQbaPAGXDPEFFXtKmo5oby3jjN5dXXFGD2M+6kWgWK+i8cikHn /4NQ== 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=DqnHnZrMSvA0or48b6pnWzyYDz4iWYc8+TMTuA2+K94=; b=FowflJdxMOhbiHGlv9L5RPG9LIcdCjy+RKZ1hUXNm5u1MjT2tamYsMhXpx2zLfG+TF MRj9ahYF3s7nsKfNwZ1muY8zmYmEDV3chpdA+QaEIIjcFwCPAVFAtekQKYWh7VYsWb3+ 0OPnr78hCxRCDHL/hucEvrsSzWq38jNA0gyxxsHqQJMxXC22qB3zdo+6lfJcqpbqE9Dd gSdx60Ex/7suu9gSEsQpfatGafbYUYwSVxk3Ot24XFcvqZmbVAtZxvO6bW9HDCjE3aQe V0P1DJ24ZLrHNhAYj0L7M8ek/Z7Sd6YHjn8lb6qEMnhEcejgaX9MAJ7Dd9GhBgK31vTg i2Mw== X-Gm-Message-State: AGRZ1gIiYWSppxjoCYhSgvNNBBcIJlzrlf/UqlDT9kdNSqlOBz94T69e gvU/THKh25wkc0wipvvu/r0= X-Google-Smtp-Source: AJdET5f/kGKaYiahxprOoOnVYpdRB3PtFuUyLNGUcOLZnvHYogiFOoWqKbw3aIN3Y+3wkS7fr2FvCA== X-Received: by 2002:ac8:191a:: with SMTP id t26-v6mr13444924qtj.327.1540839855192; Mon, 29 Oct 2018 12:04:15 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.13 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:14 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 07/12] NFS: also send OFFLOAD_CANCEL to source server Date: Mon, 29 Oct 2018 15:03:52 -0400 Message-Id: <20181029190357.38439-9-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia In case of copy is cancelled, also send OFFLOAD_CANCEL to the source server. Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs42proc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index bb9e799..98fe00b 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -205,12 +205,14 @@ static int handle_async_copy(struct nfs42_copy_res *res, memcpy(&res->write_res.verifier, ©->verf, sizeof(copy->verf)); status = -copy->error; +out_free: kfree(copy); return status; out_cancel: nfs42_do_offload_cancel_async(dst, ©->stateid); - kfree(copy); - return status; + if (!nfs42_files_from_same_server(src, dst)) + nfs42_do_offload_cancel_async(src, src_stateid); + goto out_free; } static int process_copy_commit(struct file *dst, loff_t pos_dst, From patchwork Mon Oct 29 19:03:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990497 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="JWfo1rDB"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCm0jM5z9sBj for ; Tue, 30 Oct 2018 06:04:20 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729479AbeJ3DyQ (ORCPT ); Mon, 29 Oct 2018 23:54:16 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:33339 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725969AbeJ3DyQ (ORCPT ); Mon, 29 Oct 2018 23:54:16 -0400 Received: by mail-qt1-f196.google.com with SMTP id i15-v6so10613557qtr.0; Mon, 29 Oct 2018 12:04:17 -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=qWc4e/0MmfBIIgJWWnXm9U9/kkhvubDK4oN4lTXjqm4=; b=JWfo1rDBlJGsmP6/Tjb26ymRNA5Evw+upoKR9y/HE5cZAbv+tb8mipti6WheyXrv4Q A1lP9VJT8OyBMGWxxF309l5bAL6SEpEobMBSGQf9TaoFipcC3WWqiSh50KN+Yu81Yc/S wWFmhW1Z0X0jTE32lUXmr6YtFeGfD71BqKJ+HVOBP9XR73aQ+vFRidqqUHXm1bGkshlf qdsEs7OyAQu/gMwXAeoxCNSBiN9skp3tXZnzKLV9GBJEzyF1tryMtNXjWaz7w7vgx5r1 DjV/uJhjiGkkiLQa0VwaD1RpDuetWS1P4eo0yXrBXBQrDpdKh9leLwDLYEs9o7iTMCiH gEVA== 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=qWc4e/0MmfBIIgJWWnXm9U9/kkhvubDK4oN4lTXjqm4=; b=IwStD2faw4gd55RJ7jz5M96/lhpfQJlYAebr7H5vzrHIXLUaZebkWht3RQAtmMzP9w ewOzjv7l8HfVJF4EDb2ekXgs6TWqoKe/dhtbOQlFE9ZZzb89QlpVTHrhscXgAp3cYkXc it29xmbpYdv3NmrtQzKbHbdv0cvG+MPp71teQKJV2bAC7RM5a0FDRx6+eCX1IO57169M QXnE8zIYHCJnyK31M6sxwRATObBKmK4sdlMXveR3gdPy9iM0Li/TPsyZleVHS0/Tig5G Ko0Ltce1IYZegxuWe7WfPbqkE+KTrRK7acDB5QxRzpFqFvFF1E0sdIHb5/rq/xHf2sNB NYag== X-Gm-Message-State: AGRZ1gKSca0g5h6bUtuwiX3vxCYneE722PeletJNGTJDfApU6mQRR0dj BcnVUCIvP4phRE+TGmJUAG8= X-Google-Smtp-Source: AJdET5ehd7DBZWhx4fVBPXpQEABkROl9S7GceEwjqZNtLqZHjDWkpNCd5jKDDfBZOnVpJLdjxBlUkQ== X-Received: by 2002:a0c:8264:: with SMTP id h91mr7765457qva.116.1540839857155; Mon, 29 Oct 2018 12:04:17 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.15 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:16 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 08/12] NFS: inter ssc open Date: Mon, 29 Oct 2018 15:03:53 -0400 Message-Id: <20181029190357.38439-10-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@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 7d17b31..9c566a4 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -307,6 +307,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 e5c1a68..0b1dcf9 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" @@ -267,6 +268,99 @@ static int nfs42_clone_file_range(struct file *src_file, loff_t src_off, out: return ret; } + +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 fec6e6b..e5178b2f 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -91,7 +91,6 @@ 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, struct rpc_cred *cred, struct nfs_fattr *fattr, struct iattr *sattr, @@ -1653,7 +1652,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) @@ -3936,7 +3935,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) { From patchwork Mon Oct 29 19:03:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990498 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="KFQ1r7jE"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCn0tTWz9sC2 for ; Tue, 30 Oct 2018 06:04:21 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729486AbeJ3DyS (ORCPT ); Mon, 29 Oct 2018 23:54:18 -0400 Received: from mail-qt1-f195.google.com ([209.85.160.195]:45304 "EHLO mail-qt1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725969AbeJ3DyS (ORCPT ); Mon, 29 Oct 2018 23:54:18 -0400 Received: by mail-qt1-f195.google.com with SMTP id l9-v6so10549845qtj.12; Mon, 29 Oct 2018 12:04:19 -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=4PksShieLrh4Cf0smwQQ0hWXC8t13fGxowZ1fcGZ/Dw=; b=KFQ1r7jEijIFNoNj9v5ejI1tmFigSN8jHtxe09jpQDG0Ha59QFpTveEp2lYzsqBdaU cffse+bmzXcFFxX5zew1dyeKaUIEp6EaF+vs2oIjx7TTPFJaR0nmcer4Dt7C1/WPSFgN SIY+O6z9FNEiJ3g5VA4cJmQ6xJGZMIShqEYKdTA7jnbdWzWpNaPTLQNttBQTHUJrH/li gvQHPxDqnhji2k8qrEXApW1wVB7ydh7jN8v9KhKqUoacxAcDqG4afrx7O7CRKkzVvabV j0e/qm9N5LaAgqITSL1KZBj2A11JbMtmCEP7f8wEmUax+UcoEERl3bNZD/9X/ZBNWGdY xcdg== 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=4PksShieLrh4Cf0smwQQ0hWXC8t13fGxowZ1fcGZ/Dw=; b=D0fKnSY1oyAbxjuD7TUXqPOInRe+Hx5iKirYkd3lZQ9BXVS0E5vuciCiTDmCMGHu9J PEOJTWcEvv4FdafoaC1VCOd8i6/wqREvMx6FvUs7TGz3MzR/GrTrU6zqaYd6X3Bh+Ve3 Ewe0G+4/gREMGA+n4PPFC0Nh6X/a+DvfSj/OrP0liK5NYBjf2bn3PbGMxEUdaeYarA2n vOnpdS314IqtUJ+sbwA6rQnV6G9/7rf3y5xZ7ZlqfWDovSTjJpZVHVjoMUEbkVr2C+yk bAzot4uWtr3IwI4KcZR2DlPm745hPK0vtctnemeb7tt/1fa5YVEaa2RqA6w858LNXfjD CPYw== X-Gm-Message-State: AGRZ1gIaPmQemmyeiEqyYioCVO557bGUBt2qFQc3KzZPvquRQLCZ0mIn 10qWx/+QlOV2oNi4sJaE8ZE= X-Google-Smtp-Source: AJdET5dnpBEG5piJy8oNs2YqED+XaYSQO5YnZLpDncKKCEaNxJNv2aNS/B+7SmSiZNBEzNMxcx5q0w== X-Received: by 2002:ac8:2875:: with SMTP id 50-v6mr13630011qtr.54.1540839859098; Mon, 29 Oct 2018 12:04:19 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.17 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:18 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 09/12] NFS: skip recovery of copy open on dest server Date: Mon, 29 Oct 2018 15:03:54 -0400 Message-Id: <20181029190357.38439-11-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia Mark the open created for the source file on the destination server. Then if this open is going thru a recovery, then fail the recovery as we don't need to be recoving a "fake" open. We need to fail the ongoing READs and vfs_copy_file_range(). Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs4_fs.h | 1 + fs/nfs/nfs4file.c | 1 + fs/nfs/nfs4state.c | 14 ++++++++++++++ 3 files changed, 16 insertions(+) diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 9c566a4..482754d 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h @@ -165,6 +165,7 @@ enum { NFS_STATE_CHANGE_WAIT, /* A state changing operation is outstanding */ #ifdef CONFIG_NFS_V4_2 NFS_CLNT_DST_SSC_COPY_STATE, /* dst server open state on client*/ + NFS_SRV_SSC_COPY_STATE, /* ssc state on the dst server */ #endif /* CONFIG_NFS_V4_2 */ }; diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 0b1dcf9..989f174 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -333,6 +333,7 @@ struct file * if (ctx->state == NULL) goto out_stateowner; + set_bit(NFS_SRV_SSC_COPY_STATE, &ctx->state->flags); set_bit(NFS_OPEN_STATE, &ctx->state->flags); memcpy(&ctx->state->open_stateid.other, &stateid->other, NFS4_STATEID_OTHER_SIZE); diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 62ae0fd..b0b82c6 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -1606,6 +1606,9 @@ static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs { struct nfs4_state *state; int status = 0; +#ifdef CONFIG_NFS_V4_2 + bool found_ssc_copy_state = false; +#endif /* CONFIG_NFS_V4_2 */ /* Note: we rely on the sp->so_states list being ordered * so that we always reclaim open(O_RDWR) and/or open(O_WRITE) @@ -1625,6 +1628,13 @@ static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs continue; if (state->state == 0) continue; +#ifdef CONFIG_NFS_V4_2 + if (test_bit(NFS_SRV_SSC_COPY_STATE, &state->flags)) { + nfs4_state_mark_recovery_failed(state, -EIO); + found_ssc_copy_state = true; + continue; + } +#endif /* CONFIG_NFS_V4_2 */ refcount_inc(&state->count); spin_unlock(&sp->so_lock); status = __nfs4_reclaim_open_state(sp, state, ops); @@ -1671,6 +1681,10 @@ static int nfs4_reclaim_open_state(struct nfs4_state_owner *sp, const struct nfs } raw_write_seqcount_end(&sp->so_reclaim_seqcount); spin_unlock(&sp->so_lock); +#ifdef CONFIG_NFS_V4_2 + if (found_ssc_copy_state) + return -EIO; +#endif /* CONFIG_NFS_V4_2 */ return 0; out_err: nfs4_put_open_state(state); From patchwork Mon Oct 29 19:03:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990499 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="abKsq1Ar"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCr2MXDz9sBj for ; Tue, 30 Oct 2018 06:04:24 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729495AbeJ3DyT (ORCPT ); Mon, 29 Oct 2018 23:54:19 -0400 Received: from mail-qt1-f196.google.com ([209.85.160.196]:33347 "EHLO mail-qt1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725969AbeJ3DyT (ORCPT ); Mon, 29 Oct 2018 23:54:19 -0400 Received: by mail-qt1-f196.google.com with SMTP id i15-v6so10613777qtr.0; Mon, 29 Oct 2018 12:04:21 -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=7UYm6KwHepkUcFRejYDPg8EOERI1MmALOURzx0oOqU8=; b=abKsq1ArtZCaHIBtn77+V+0S2MNJjLsjaZpiGdjotXMAeXcQ6ygvFxE/11zdkO//fP iRc7DSuftrfH48BLMD3yvxS7yrdsZpygVk3BiMShWDmqljswokasjhpMTYk9QME6Y0LH h8IiT10YB+AKHHzpbUhDFVX0RugTQo5F/pnHFN6010pO29FaZJ/3LjFUGe8AQrayrVnz lUw0Z8vQNpFTNkiJfq9xyf2TFZAi2iwhYOXXMkCaXVwhp/zDYVgnFY8SrNlZuFelXsnR sZD+AH+jw2K2Ec2z0qG552jJRdOSQooFHH199o5QhyGxuOYW6sLwXGKwVS1UYHpq2zhP awjA== 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=7UYm6KwHepkUcFRejYDPg8EOERI1MmALOURzx0oOqU8=; b=nn/9IDAWDB9QK5ZtUEbH7/wAIVP/phPt4sztGD9PM7TY5G4lzgaEb70J8tkI5ou03f d4iAxcOQy4F0bESx8FNIfg7NmA21yupfY0wasQDwTNedbZkutJIIWejo9AWglXjaPfuK V2tRKWg2lrKjjjnkI2v/sApgmJGF6H37nBqEu3I/buGKR6SK9EpnNfQc3qFMLqIoONU6 E8QNdp79aqhH5btccJrLBLXnwjB85vga8KGSTN+akPbN4AbYGKcrQKOxwcL/r9X15cgl vKIUCSa8fVe06A8/VOCPAYUkB1afC/eSlM8TsNSi2tsBaYYLnqzW2nKugvWkQvRyQk58 vqyA== X-Gm-Message-State: AGRZ1gKucnCHSLXisU3ru7RN4fszEcGi5yZ4EUu1eljyMB+wNiSmruXk nOii99sqd3soQAkAjFT04fQ= X-Google-Smtp-Source: AJdET5dXLgBITk9np6eoDTc5LoG8de/M6uDqWv+oQFl9JeVheNEtPpBwC5bVdcHp1ZaXQQqr3PBBSg== X-Received: by 2002:aed:39a9:: with SMTP id m38-v6mr14379423qte.222.1540839860593; Mon, 29 Oct 2018 12:04:20 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.19 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:19 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 10/12] NFS: for "inter" copy treat ESTALE as ENOTSUPP Date: Mon, 29 Oct 2018 15:03:55 -0400 Message-Id: <20181029190357.38439-12-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia If the client sends an "inter" copy to the destination server but it only supports "intra" copy, it can return ESTALE (since it doesn't know anything about the file handle from the other server and does not recognize the special case of "inter" copy). Translate this error as ENOTSUPP and also send OFFLOAD_CANCEL to the source server so that it can clean up state. Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs42proc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index 98fe00b..00809b3 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -395,6 +395,11 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, args.sync = true; dst_exception.retry = 1; continue; + } else if (err == -ESTALE && + !nfs42_files_from_same_server(src, dst)) { + nfs42_do_offload_cancel_async(src, &args.src_stateid); + err = -EOPNOTSUPP; + break; } err2 = nfs4_handle_exception(server, err, &src_exception); From patchwork Mon Oct 29 19:03:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990500 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="bGkqSd4j"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCs2W6gz9sBq for ; Tue, 30 Oct 2018 06:04:25 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729499AbeJ3DyV (ORCPT ); Mon, 29 Oct 2018 23:54:21 -0400 Received: from mail-qt1-f193.google.com ([209.85.160.193]:41912 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725969AbeJ3DyV (ORCPT ); Mon, 29 Oct 2018 23:54:21 -0400 Received: by mail-qt1-f193.google.com with SMTP id l41-v6so10573971qtl.8; Mon, 29 Oct 2018 12:04:22 -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=fwlJnXfUGTRII/SW0YspOWGhfPFdbZ3Rgyeu7Z/VErM=; b=bGkqSd4jvN+T3Jg18VKGI4GP4V4VmwVuy/tUtGdRkeI5wzZl0lv3nnhPg2DvxcYBia nOXnmo4doGUALHp/Q5rLtrJ/jr32c0tN24HubNgsdTB17dLz6yvaOeohxa6Nm3YY87Wy jEXiDIoKsjKgH0eJNW8r1RGpSX4e22+dvdf4C26BAhQz/DXbqGmFrffsXmPJKoMdv773 9N6ohzVd9A/N66zQrUY27aexNUdtRWO70d3xIltcQjKCsWe6qr3ZFMMZWEl/s1aBDg8S O6Yj3WWBpCiPROcxfWJeQbe5ZTGfXyg7Z9aWQIc9O422Oyge7eTPUKvIndBgCMLi9+tr qegA== 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=fwlJnXfUGTRII/SW0YspOWGhfPFdbZ3Rgyeu7Z/VErM=; b=j4YbMx7LxkWmjROYux0+0kjhgQd8F9Lb4YqgqhtF5fcsBx5dT5gi7dzs8yPHtqlMhT +8mOiRhbQAqlzhG+QrHmsw6tPumR1dQuCSrvY7tk5lK41Ag5M11WvThw6YpssKpovK+F ftEwNrHEGJpRwoopepTmeTx4+12qhHwhpDfK943R1tkdkdWbTAhtS3gug0sLIhsVBkjR zpqoQJzq8VfwGaCl5Qsq/tfJOY1hZc69A3vzhkOa6QirSGkKnUKGpOsJeOpTE7P93WF9 gHnbRRO85wBEAkoBSr6iqNOluBQuRVSLLQUNj6krqPqFI0h3sCWyPUi1ch44HkUrr/ak 6H8g== X-Gm-Message-State: AGRZ1gIy1Io299swxgDOfeIXhdzHIShYpla337D6wGU77tjtdvDBfPjV 1u5lP14eGzOVIz4tvZcPY/Wg/Baw X-Google-Smtp-Source: AJdET5elM1dsFDyqq09yYrEcyJFqaGRQj94/ULj3D8zXo8LBcpY0GTopLwca/argRL/NSLE/CiXIBg== X-Received: by 2002:a0c:eb07:: with SMTP id j7mr9516163qvp.128.1540839862007; Mon, 29 Oct 2018 12:04:22 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.20 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:21 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 11/12] NFS: COPY handle ERR_OFFLOAD_DENIED Date: Mon, 29 Oct 2018 15:03:56 -0400 Message-Id: <20181029190357.38439-13-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia If server sends ERR_OFFLOAD_DENIED error, the client must fall back on doing copy the normal way. Return ENOTSUPP to the vfs and fallback to regular copy. Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs42proc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index 00809b3..c7c2ffa 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c @@ -395,7 +395,8 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, args.sync = true; dst_exception.retry = 1; continue; - } else if (err == -ESTALE && + } else if ((err == -ESTALE || + err == -NFS4ERR_OFFLOAD_DENIED) && !nfs42_files_from_same_server(src, dst)) { nfs42_do_offload_cancel_async(src, &args.src_stateid); err = -EOPNOTSUPP; From patchwork Mon Oct 29 19:03:57 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Olga Kornievskaia X-Patchwork-Id: 990501 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-cifs-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="lGYoQrF1"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 42kPCt0P9Cz9sBj for ; Tue, 30 Oct 2018 06:04:26 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729509AbeJ3DyW (ORCPT ); Mon, 29 Oct 2018 23:54:22 -0400 Received: from mail-qt1-f193.google.com ([209.85.160.193]:35153 "EHLO mail-qt1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725969AbeJ3DyW (ORCPT ); Mon, 29 Oct 2018 23:54:22 -0400 Received: by mail-qt1-f193.google.com with SMTP id a10-v6so10588182qtp.2; Mon, 29 Oct 2018 12:04:23 -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=vBxFiCMdm9zwB+fNOLFFTK+4s/3BLVSMs2/+B1oAwOg=; b=lGYoQrF1v0lKLHUkCbGmSsgvOocbEGuK0BYHteAgaZURtDiR2M5Ly4m6neVrRU+FoV B1eh0Yw9+VUcpTr25G7NHCeS1r9+R8DkIoIxt5JbC8Kafd1+MJqPivCUwj64rLGU1L/U JJcZfls86iV+YHOEKpK5LfkoaEXpIfhTog2P4uztJMlwY/nv/uTsTtw8tK5YSBtmoof5 uTkZozMEbbgkg7sPSgRmVH0gwpvzYlZOCDUEgyTm8GJvHqeZSDsJKFpxCT5OA6dw8Cq7 /OB5kZesVccgXdYUAKP8hcNPXrqmqVd4orpFbAnINdpSpLTxIKQVBVN8dq+tyHOkOp+I ZSxw== 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=vBxFiCMdm9zwB+fNOLFFTK+4s/3BLVSMs2/+B1oAwOg=; b=Td55ILHUDCL1FscWZ4pAYHr6XqI/qIGJEaj89BjF1WIw7QZMJEcK3pzfqKrVNvvX9B YMQH3t7+cVs0PKaMAy24MJuK19e9rmC4CtDaC+XqlfnhyGs/d+9zq/rtE3eJDLtDoQu1 gxpip7hsfC8HF9F6nic8d8pVqxvCoI3QKujF8WfNW/jUrG4jkYEqpaGZ6wnA/PBFqEkN U6Sy/69rfmh1r0HPJpPSywDm+fyZuL78bRZftCGI3MPFZXQtUzz91YSUUjMvuGYaKPrJ NktSdMvzkJaeeua/XDxlC2M8kOaMSzd76zh/94X88jMlXtN1t45rbyfflnVgJnnGJIXp 4orQ== X-Gm-Message-State: AGRZ1gLXALsAest9XdB+XEtlQH00u2F19+6H4GeOHSWgBCdqzpyJghP+ Ea7bPVXXtOKKaERuacA0eCI= X-Google-Smtp-Source: AJdET5fCK7pKZFbfyNmL8NJCc8a+XspA8JhfYoD/CPXIVnNa1ZBAzO7W9RTPQqB2zrf1zp4KAGwJ7w== X-Received: by 2002:a0c:9927:: with SMTP id h36mr2825391qvd.171.1540839863448; Mon, 29 Oct 2018 12:04:23 -0700 (PDT) Received: from Olgas-MBP-195.attlocal.net (172-10-226-31.lightspeed.livnmi.sbcglobal.net. [172.10.226.31]) by smtp.gmail.com with ESMTPSA id c5-v6sm2714373qtj.55.2018.10.29.12.04.22 (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 29 Oct 2018 12:04:22 -0700 (PDT) From: Olga Kornievskaia To: trond.myklebust@hammerspace.com, anna.schumaker@netapp.com, viro@zeniv.linux.org.uk, smfrench@gmail.com, miklos@szeredi.hu Cc: linux-nfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-cifs@vger.kernel.org, linux-unionfs@vger.kernel.org, linux-man@vger.kernel.org Subject: [PATCH v6 12/12] NFS: replace cross device check in copy_file_range Date: Mon, 29 Oct 2018 15:03:57 -0400 Message-Id: <20181029190357.38439-14-olga.kornievskaia@gmail.com> X-Mailer: git-send-email 2.10.1 (Apple Git-78) In-Reply-To: <20181029190357.38439-1-olga.kornievskaia@gmail.com> References: <20181029190357.38439-1-olga.kornievskaia@gmail.com> Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org From: Olga Kornievskaia Add a check to disallow cross file systems copy offload, both files are expected to be of NFS4.2+ type. Reviewed-by: Jeff Layton Reviewed-by: Matthew Wilcox Signed-off-by: Olga Kornievskaia --- fs/nfs/nfs4file.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 989f174..69e2705 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -142,7 +142,10 @@ static ssize_t nfs4_copy_file_range(struct file *file_in, loff_t pos_in, if (pos_in >= i_size_read(file_inode(file_in))) return -EINVAL; - if (file_inode(file_in)->i_sb != file_inode(file_out)->i_sb) + if (file_in->f_op != &nfs4_file_operations) + return -EXDEV; + + if ((NFS_SERVER(file_inode(file_in)))->nfs_client->cl_minorversion < 2) return -EXDEV; if (file_inode(file_in) == file_inode(file_out))