Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3550835imm; Tue, 29 May 2018 09:06:40 -0700 (PDT) X-Google-Smtp-Source: AB8JxZoRYuQ9flC/O3kMLxI41fBZ5Ojt0Mx5mcLxxGfFnLPr4KZem7J73e+os63P7TER6regnQbE X-Received: by 2002:a17:902:8:: with SMTP id 8-v6mr17884644pla.287.1527610000358; Tue, 29 May 2018 09:06:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527610000; cv=none; d=google.com; s=arc-20160816; b=LK06zQt3fPH2vLJ6s6JiX50YnjIG+uUx2qtKbuIs56EgaqjE/yxvAcFobZ0vF0oZj/ j4NtSTS6JBbw6dTHF6ZIWq3/2/cXiPJWWsXMxKdZq5vbrrZ7wkUo0CRto4HYNunJp13G 9vX2TfXapTZGrfR0WRXOdDXxVnnmO4YOvbJIRmISrqqI8LHywTxkI0bFNxZAM8CqUrsH DYQCiOJuVYgDm65qDHY6GCozfHl4Uexmy8c6i3UG05ZkEn512J7r3gXZtRUHzXiMGAGb pT/yjj1X4ONs1L2sI7lU4giOJ7ZXL4mzeTlKJk+Rm6Tboz4163uHkoDd7EY3BF9leaJg u5QA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=jWiR7ZCFalnX9v1//EnxfaGF2P3bbVDQXcmGgu+lVSg=; b=ZqXslBmruAizip8KSRsK1G5b0kGAQkajNOSTeOjYA9e4DoW5Xn+Rl5k6Y5bheADZPE GY3BC3MUodv6jSzBSx7ModesxG6Q1nSVggVM3gtBQ1YNMf6bKto2kRHjv9dL8VYDGvtA BPNwLiBmaUdT020ih3exS9drfwhYYKkg6sneZobaqkAZlTS4mByLgTN/ny554oXsZqdg lzfpyVkZMsEPl5c7yZTwfN43EacA28fobv3+MHi7YPx4LXbytkB9RH+Dc3g5V9bts12F ssS6Vblc6I+o06fwsd5iuI7yT+irCm8DhC9PIAgMiAA2b2TymHgdN6lXXJGFKQagkVwz e4rQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=eeB7iX6T; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s5-v6si25754478pgo.12.2018.05.29.09.06.25; Tue, 29 May 2018 09:06:40 -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=@gmail.com header.s=20161025 header.b=eeB7iX6T; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936398AbeE2QEv (ORCPT + 99 others); Tue, 29 May 2018 12:04:51 -0400 Received: from mail-yb0-f193.google.com ([209.85.213.193]:38353 "EHLO mail-yb0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S934963AbeE2QEt (ORCPT ); Tue, 29 May 2018 12:04:49 -0400 Received: by mail-yb0-f193.google.com with SMTP id q62-v6so3775803ybg.5; Tue, 29 May 2018 09:04:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=jWiR7ZCFalnX9v1//EnxfaGF2P3bbVDQXcmGgu+lVSg=; b=eeB7iX6TgvegfMdvOODV3f88HPHBvLwoiykGnAdAqFag89ZEacCBr17JfSoogh2Lcy CDABtPWyYp01pUIZDrPbCgVWnvwf0iZDscqNAFMtSzni3WyT1UgL4JDfuyRR62XoeJvc 6VvoFgDEvYy49mB7GfVF2Bq+bwXmfG96FvXmySBBaaFAHBsTgqPCjES+BdxEWm36ME9f YDEqHFXBwPWYfiB6M+UTh7w/AlfibMFfJ8TpQVxYYjWJtavTh0YnACpVWBQTuV391zaT 1qziNxrUVGFENq/Fo3xOaV6Tj54zcGNFetiBmWP3YkVT8MBOUOPs9hzycVhu1BP5LnuR lhcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=jWiR7ZCFalnX9v1//EnxfaGF2P3bbVDQXcmGgu+lVSg=; b=iuE0S9zdOKDODthwweNBWOg+khZ/wAjdxE7nEQVRoDxbRZuaHsxmFa5YaQf1N7vfOq Zt+tEj8hzhU7aCU65gtyNShL9uGYUSn/H6WS9QedoKgEjxygTKPUGM46ZoK8xKl0fheY NFr5kSnUUX28vyXL1d+nacO+wcWa6V9GwOFwEqVdFkCrRhOjWyw/Svc1S4KOcukSM1A6 kgFDxOdfbCcHwMLaPYPT9UQ5kY3ok1LeEBvczyP1Y4ekcI7K9jrXPgtf7CKvHiVOlS3U BCrSEuGJ+acF7PlCmw2CZUlTX3ngrvwy7RD1RarSpxzP7NCn8YQ3c5Bg+yBy639LOXUF vt0Q== X-Gm-Message-State: ALKqPwdadmC3d/mN6WAA38BTvK5i1t5kfkI5NhXvKdXmIdWPHkLBzP1H YB5+5pQtHZqkzIpYeAagcGMxzmWSy3lO1zMIZvQ= X-Received: by 2002:a25:c4c6:: with SMTP id u189-v6mr9991259ybf.138.1527609888148; Tue, 29 May 2018 09:04:48 -0700 (PDT) MIME-Version: 1.0 Received: by 2002:a0d:efc6:0:0:0:0:0 with HTTP; Tue, 29 May 2018 09:04:47 -0700 (PDT) In-Reply-To: References: <20180529144339.16538-1-mszeredi@redhat.com> <20180529144339.16538-4-mszeredi@redhat.com> From: Amir Goldstein Date: Tue, 29 May 2018 19:04:47 +0300 Message-ID: Subject: Re: [PATCH 03/39] vfs: dedupe: extract helper for a single dedup To: Miklos Szeredi Cc: overlayfs , linux-fsdevel , linux-kernel Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, May 29, 2018 at 6:41 PM, Amir Goldstein wrote: > On Tue, May 29, 2018 at 5:43 PM, Miklos Szeredi wrote: >> Extract vfs_dedupe_file_range_one() helper to deal with a single dedup >> request. >> >> Signed-off-by: Miklos Szeredi >> --- >> fs/read_write.c | 89 +++++++++++++++++++++++++++++++-------------------------- >> 1 file changed, 49 insertions(+), 40 deletions(-) >> >> diff --git a/fs/read_write.c b/fs/read_write.c >> index 1818581cadf6..82a53c44c0aa 100644 >> --- a/fs/read_write.c >> +++ b/fs/read_write.c >> @@ -1964,6 +1964,44 @@ int vfs_dedupe_file_range_compare(struct inode *src, loff_t srcoff, >> } >> EXPORT_SYMBOL(vfs_dedupe_file_range_compare); >> >> +static s64 vfs_dedupe_file_range_one(struct file *src_file, loff_t src_pos, >> + struct file *dst_file, loff_t dst_pos, >> + u64 len) >> +{ >> + s64 ret; >> + >> + ret = mnt_want_write_file(dst_file); >> + if (ret) >> + return ret; >> + >> + ret = clone_verify_area(dst_file, dst_pos, len, true); >> + if (ret < 0) >> + goto out_drop_write; >> + >> + ret = -EINVAL; >> + if (!(capable(CAP_SYS_ADMIN) || (dst_file->f_mode & FMODE_WRITE))) >> + goto out_drop_write; >> + >> + ret = -EXDEV; >> + if (src_file->f_path.mnt != dst_file->f_path.mnt) >> + goto out_drop_write; >> + >> + ret = -EISDIR; >> + if (S_ISDIR(file_inode(dst_file)->i_mode)) >> + goto out_drop_write; >> + >> + ret = -EINVAL; >> + if (!dst_file->f_op->dedupe_file_range) >> + goto out_drop_write; >> + >> + ret = dst_file->f_op->dedupe_file_range(src_file, src_pos, >> + dst_file, dst_pos, len); >> +out_drop_write: >> + mnt_drop_write_file(dst_file); >> + >> + return ret; >> +} >> + >> int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same) >> { >> struct file_dedupe_range_info *info; >> @@ -1972,10 +2010,7 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same) >> u64 len; >> int i; >> int ret; >> - bool is_admin = capable(CAP_SYS_ADMIN); >> u16 count = same->dest_count; >> - struct file *dst_file; >> - loff_t dst_off; >> loff_t deduped; >> >> if (!(file->f_mode & FMODE_READ)) >> @@ -2010,54 +2045,28 @@ int vfs_dedupe_file_range(struct file *file, struct file_dedupe_range *same) >> } >> >> for (i = 0, info = same->info; i < count; i++, info++) { >> - struct inode *dst; >> struct fd dst_fd = fdget(info->dest_fd); >> + struct file *dst_file = dst_fd.file; >> >> - dst_file = dst_fd.file; >> if (!dst_file) { >> info->status = -EBADF; >> goto next_loop; >> } >> - dst = file_inode(dst_file); >> - >> - ret = mnt_want_write_file(dst_file); >> - if (ret) { >> - info->status = ret; >> - goto next_loop; >> - } >> - >> - dst_off = info->dest_offset; >> - ret = clone_verify_area(dst_file, dst_off, len, true); >> - if (ret < 0) { >> - info->status = ret; >> - goto next_file; >> - } >> - ret = 0; >> >> if (info->reserved) { >> info->status = -EINVAL; >> - } else if (!(is_admin || (dst_file->f_mode & FMODE_WRITE))) { >> - info->status = -EINVAL; >> - } else if (file->f_path.mnt != dst_file->f_path.mnt) { >> - info->status = -EXDEV; >> - } else if (S_ISDIR(dst->i_mode)) { >> - info->status = -EISDIR; >> - } else if (dst_file->f_op->dedupe_file_range == NULL) { >> - info->status = -EINVAL; >> - } else { >> - deduped = dst_file->f_op->dedupe_file_range(file, off, >> - dst_file, >> - info->dest_offset, len); >> - if (deduped == -EBADE) >> - info->status = FILE_DEDUPE_RANGE_DIFFERS; >> - else if (deduped < 0) >> - info->status = deduped; >> - else >> - info->bytes_deduped += deduped; >> + goto next_loop; >> } >> >> -next_file: >> - mnt_drop_write_file(dst_file); >> + deduped = vfs_dedupe_file_range_one(file, off, dst_file, >> + info->dest_offset, len); >> + if (deduped == -EBADE) >> + info->status = FILE_DEDUPE_RANGE_DIFFERS; >> + else if (deduped < 0) >> + info->status = deduped; >> + else >> + info->bytes_deduped += deduped; >> + >> next_loop: >> fdput(dst_fd); >> > > Please note that this patch conflicts with but is also an alternative to commit > 227627114799 fs: avoid fdput() after failed fdget() in vfs_dedupe_file_range() > on Al's fixes => for-next branch. > Sorry, that's a conflict, and a rather trivial one, but Miklos' patch is not an alternative fix. Thanks, Amir.