Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp3502761imm; Tue, 29 May 2018 08:18:42 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrSBP5gI+Nr4Bgaa6+/nHzTbnclz0+C67KicAX7kGeYaWfkPtMbmHqBb4iKf2g+n7Nx+5DS X-Received: by 2002:a17:902:42a3:: with SMTP id h32-v6mr18237574pld.72.1527607122317; Tue, 29 May 2018 08:18:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527607122; cv=none; d=google.com; s=arc-20160816; b=LgNZqHc9/v7Z6jU4Zrrj8zt9SO545BAXaTdPJIEvSfFIK2zs78dgtf9WDW+ob7eg/S lkq05RxUlnidAqoHoJxj3F5PgWZfKuqPiCm7f9ymqk/1aazRpKRjJWKwin9kFTzr6hI/ lawCFY/mpbOui+Ep3IjOMeOVluMnd6HKoIwg9Jtz0+xx9nIM/qTkB1+zTCUxD2uBSynQ B1XMZmjJpNtq36iBOwZoaqtskpdaiNOnZTuxD02FA5B8fx4KELVy8rT+Fvkzw5DPKDDg CyI9k8x/2FRDcluRgT/YI6R8WG8gmabpEoK1qSosXWFZ7GqSa+2lVszYD0jq/EtxqWC5 8XCA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=j3FkgtHWNO7DF/r/Zz49vsxAaVEsFcvlr1N8qV55l0s=; b=FbjGrON94ytgdYHKfAvxJIp4R8NBaEdVlzTs0dsvDdc3Z+61vi8sJJ1IX4YaFrEO0W 0srUNyb9iDIfFAFchBAWeBT+/dWbzIy+RyBc2fkLjYmjcTFu7OjUMdbVJIB9l5lcec/V 9iE4uKzC345aYc/hRbjJyN/sY25kbZQAjM9t09rkHYMXxdG3tmjGO3ZPL0yF2on6PrQH HzGN5cqUtjTbnZSMQL4AOslahhaCEC9accbIer+nYg32rU//vqW26sSmLARRq4bf8a5f yo3mSoVMPvGI9XxhKiY3tiCkkYT+BrwidCAFe5zyTx1PiIj6THY31s4u6II2Ui64a7G1 oAVQ== ARC-Authentication-Results: i=1; mx.google.com; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u2-v6si10821197plr.598.2018.05.29.08.18.28; Tue, 29 May 2018 08:18:42 -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; 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=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S936596AbeE2PQv (ORCPT + 99 others); Tue, 29 May 2018 11:16:51 -0400 Received: from mail-wr0-f193.google.com ([209.85.128.193]:38721 "EHLO mail-wr0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S935241AbeE2Onp (ORCPT ); Tue, 29 May 2018 10:43:45 -0400 Received: by mail-wr0-f193.google.com with SMTP id 94-v6so25968747wrf.5 for ; Tue, 29 May 2018 07:43:45 -0700 (PDT) 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=j3FkgtHWNO7DF/r/Zz49vsxAaVEsFcvlr1N8qV55l0s=; b=SZdwjmlsxI5gcNDyiM+HHvlbyzM4ktrjkgo2LmPD7sYKiTnVvjNwjVHZENmdJY+Ga6 RmdBLzWHrzbTUgwn/BJyoAyMHiqbrnoFGxRmmyRWcWzO5baXdlPrMxmmjOrqO7m1+wd/ T9yoj+wvunhxGaqYZkxNCLPSoDSE26/pVNV8M+RXxZ10s37Y/EUW4xwUBrnylIUGTVdu f091ad67UysYv+mdc6yPHyDXAuuvyeIaPsxQ+EXmYd1rnWJt4B8C9sA1SskJ5epDbgmm WqH5ysz3nrOd7pDtlI7zTYi3EgBHc0yJ0LQR3GseadJqa1cbADAo6rtFMXwkXKmRI4Rf Pfaw== X-Gm-Message-State: ALKqPwd911EPKFklsUzcjksD1lZAkrxhH1mw/eRBaCJAaweUhGnHYBe4 +5xbEl1Iy3AZrWLRYHsFjdKt6g== X-Received: by 2002:adf:9561:: with SMTP id 88-v6mr12792288wrs.264.1527605024687; Tue, 29 May 2018 07:43:44 -0700 (PDT) Received: from veci.piliscsaba.redhat.com (catv-176-63-54-97.catv.broadband.hu. [176.63.54.97]) by smtp.gmail.com with ESMTPSA id t198-v6sm18834422wmt.23.2018.05.29.07.43.43 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 29 May 2018 07:43:44 -0700 (PDT) From: Miklos Szeredi To: linux-unionfs@vger.kernel.org Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 03/39] vfs: dedupe: extract helper for a single dedup Date: Tue, 29 May 2018 16:43:03 +0200 Message-Id: <20180529144339.16538-4-mszeredi@redhat.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180529144339.16538-1-mszeredi@redhat.com> References: <20180529144339.16538-1-mszeredi@redhat.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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); -- 2.14.3