Received: by 10.192.165.148 with SMTP id m20csp3516034imm; Mon, 7 May 2018 13:44:52 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpjmKoST2d5CO35HN54hawmmoihlpP21/NetxZ/5Ts1KshSgtR13Ehms4LYOIERhUrM5EQ/ X-Received: by 2002:a9d:14b9:: with SMTP id d54-v6mr11256863ote.380.1525725892107; Mon, 07 May 2018 13:44:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525725892; cv=none; d=google.com; s=arc-20160816; b=VKx/AU9vihkS6a8KzMOXmCvBDHTrIF7XyJ/7DSP2RZcM51iIR5WsQ9nqvVwKwTU9Fp s41o9Ys7/YJIPY4l7OuLYMJLeBZhPnWTavmx/LWSBjo4XqJmUZErsD4f1W42a+f5dg/+ zsE+OK6gwDGVFTBik9Mdw90SJLkCeLRFydnGd/Ddi19waPwSQZtBXcAGkOHo0mFS4aa5 mdNHJIjqKUwB8Tm7fuRCebaqYrMJt5Uaap4NpJLqRwzJzGGQkhSE0Ysf4o8+aCa+w7kc TiJlLBZEPU5E0UPGYp+fhMOUsgR5P2sydwlVN1mA1vCLjMfJsL1LSVOwXWi8n+byMjq5 HuNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature:arc-authentication-results; bh=+rAsXW2hF2CHfVUlggIZvuttbmnWh8Bbx5qu7g9XDEQ=; b=AJcX24x4vURER0qEM0MhdcsXUvLb8qaggkPwHZGSHrn76e+Z4segrG90BR3PuL99wC mFj60jVrtjAj4YYNsdzKDIp+cbsC6UHvVIAZUeuEDYWQM9TM9s+NIfEeIqBWuZJnn/ZA WBtdtN1oVcQM9nY+tryilNWHbLGhbFn69ZC87JOOMhV50e39af04qY70HVyDk98ZSds9 qzZo9sXrwe//+UftdMNIAu7nQZE7rO8xpuuNnuantOH4YBaSU5/ppkF42aTZaOrIX83w N60ExUCkYc9cjBUnNazsJl+wfrFehaFJWhkrPzPgm7oM9gBRqy7RXaqTAWc1hePP9ZNf 4dXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2017-10-26 header.b=pDqND317; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p185-v6si7480770oia.396.2018.05.07.13.44.38; Mon, 07 May 2018 13:44:52 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-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=@oracle.com header.s=corp-2017-10-26 header.b=pDqND317; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753068AbeEGUoM (ORCPT + 99 others); Mon, 7 May 2018 16:44:12 -0400 Received: from aserp2120.oracle.com ([141.146.126.78]:38018 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752389AbeEGUoL (ORCPT ); Mon, 7 May 2018 16:44:11 -0400 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w47KfELo065778; Mon, 7 May 2018 20:43:54 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=date : from : to : cc : subject : message-id : references : mime-version : content-type : in-reply-to; s=corp-2017-10-26; bh=+rAsXW2hF2CHfVUlggIZvuttbmnWh8Bbx5qu7g9XDEQ=; b=pDqND317bhTgHjezq9oMuzoh4IFtNEmXoCejVNnBjk6+B0IBednZmA5vA1rQhgA8cxW5 qYb8zqyVmrU5dyGXx/PFHrbIpEpomy8y5CPs8mvM71Pmer94kMH1kdH+VU5hDHjUGcxK Eg4dypd6k4aumkTyx0bxVHGBamqebysOGLtuBjMnsg8RGfecVjTxOEw51ksum523UrSR OLyylEH+baoT48H6jBA2esj6uh7QtnsajwZmvzvch96B3kxYScw4VdhjlK5yHDF1pniU maJ+DMUrElyS9bdNgmsB0LKY6SH59cmS7wN1kTMaNZSzzkGXbvhIFhLhsaO6TB2rGGNT xA== Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by aserp2120.oracle.com with ESMTP id 2hs4k25ufb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 07 May 2018 20:43:53 +0000 Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w47KhqOo006141 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 7 May 2018 20:43:53 GMT Received: from abhmp0002.oracle.com (abhmp0002.oracle.com [141.146.116.8]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id w47KhqkS026145; Mon, 7 May 2018 20:43:52 GMT Received: from localhost (/67.169.218.210) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 07 May 2018 13:43:51 -0700 Date: Mon, 7 May 2018 13:43:50 -0700 From: "Darrick J. Wong" To: Miklos Szeredi Cc: linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 21/35] ovl: add reflink/copyfile/dedup support Message-ID: <20180507204350.GB9510@magnolia> References: <20180507083807.28792-1-mszeredi@redhat.com> <20180507083807.28792-22-mszeredi@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180507083807.28792-22-mszeredi@redhat.com> User-Agent: Mutt/1.9.4 (2018-02-28) X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=8886 signatures=668698 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1711220000 definitions=main-1805070203 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, May 07, 2018 at 10:37:53AM +0200, Miklos Szeredi wrote: > Since set of arguments are so similar, handle in a common helper. > > Signed-off-by: Miklos Szeredi > --- > fs/overlayfs/file.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 88 insertions(+) > > diff --git a/fs/overlayfs/file.c b/fs/overlayfs/file.c > index ce871a15e185..2ac95c95e8e6 100644 > --- a/fs/overlayfs/file.c > +++ b/fs/overlayfs/file.c > @@ -382,6 +382,90 @@ static long ovl_compat_ioctl(struct file *file, unsigned int cmd, > return ovl_ioctl(file, cmd, arg); > } > > +enum ovl_copyop { > + OVL_COPY, > + OVL_CLONE, > + OVL_DEDUPE, > +}; > + > +static s64 ovl_copyfile(struct file *file_in, loff_t pos_in, > + struct file *file_out, loff_t pos_out, > + u64 len, unsigned int flags, enum ovl_copyop op) > +{ > + struct inode *inode_out = file_inode(file_out); > + struct fd real_in, real_out; > + const struct cred *old_cred; > + s64 ret; > + > + ret = ovl_real_fdget(file_out, &real_out); > + if (ret) > + return ret; > + > + ret = ovl_real_fdget(file_in, &real_in); > + if (ret) { > + fdput(real_out); > + return ret; > + } > + > + old_cred = ovl_override_creds(file_inode(file_out)->i_sb); > + switch (op) { > + case OVL_COPY: > + ret = vfs_copy_file_range(real_in.file, pos_in, > + real_out.file, pos_out, len, flags); > + break; > + > + case OVL_CLONE: > + ret = vfs_clone_file_range(real_in.file, pos_in, > + real_out.file, pos_out, len); > + break; > + > + case OVL_DEDUPE: > + ret = vfs_dedupe_file_range_one(real_in.file, pos_in, > + real_out.file, pos_out, len); > + break; > + } > + revert_creds(old_cred); > + > + /* Update size */ > + ovl_copyattr(ovl_inode_real(inode_out), inode_out); > + > + fdput(real_in); > + fdput(real_out); > + > + return ret; > +} > + > +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) > +{ > + return ovl_copyfile(file_in, pos_in, file_out, pos_out, len, flags, > + OVL_COPY); > +} > + > +static int ovl_clone_file_range(struct file *file_in, loff_t pos_in, > + struct file *file_out, loff_t pos_out, u64 len) > +{ > + return ovl_copyfile(file_in, pos_in, file_out, pos_out, len, 0, > + OVL_CLONE); > +} > + > +static s64 ovl_dedupe_file_range(struct file *file_in, loff_t pos_in, > + struct file *file_out, loff_t pos_out, > + u64 len) > +{ > + /* > + * Don't copy up because of a dedupe request, this wouldn't make sense > + * most of the time (data would be duplicated instead of deduplicated). > + */ > + if (!ovl_inode_upper(file_inode(file_in)) || > + !ovl_inode_upper(file_inode(file_out))) > + return -EPERM; /me wonders, why not EOPNOTSUPP? That's what we've been using (in xfs anyway) for "filesystem doesn't want to let you do this". (Or I guess EXDEV, but "cross-device link not supported" might not be quite what you want users to see...) --D > + > + return ovl_copyfile(file_in, pos_in, file_out, pos_out, len, 0, > + OVL_DEDUPE); > +} > + > const struct file_operations ovl_file_operations = { > .open = ovl_open, > .release = ovl_release, > @@ -393,4 +477,8 @@ const struct file_operations ovl_file_operations = { > .fallocate = ovl_fallocate, > .unlocked_ioctl = ovl_ioctl, > .compat_ioctl = ovl_compat_ioctl, > + > + .copy_file_range = ovl_copy_file_range, > + .clone_file_range = ovl_clone_file_range, > + .dedupe_file_range = ovl_dedupe_file_range, > }; > -- > 2.14.3 >