From patchwork Thu Oct 11 04:13:35 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 10635831 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D24AB14DB for ; Thu, 11 Oct 2018 04:13:44 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B62792856E for ; Thu, 11 Oct 2018 04:13:44 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A992F2A63B; Thu, 11 Oct 2018 04:13:44 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1E3DA2856E for ; Thu, 11 Oct 2018 04:13:44 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0502C6B027C; Thu, 11 Oct 2018 00:13:43 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 027556B027D; Thu, 11 Oct 2018 00:13:42 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E811C6B027E; Thu, 11 Oct 2018 00:13:42 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by kanga.kvack.org (Postfix) with ESMTP id AB2F46B027C for ; Thu, 11 Oct 2018 00:13:42 -0400 (EDT) Received: by mail-pf1-f198.google.com with SMTP id n81-v6so6709655pfi.20 for ; Wed, 10 Oct 2018 21:13:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:subject:from:to:cc:date :message-id:in-reply-to:references:user-agent:mime-version :content-transfer-encoding; bh=/3l7N/X857KPTkSp1muxCsYvuhsKcEoEr7NE87oRJI0=; b=lrikFAROxV84f2xwZsflT3McAQQnm05fKYHbtbgEx5pT5q+7sJnrFX8iNhaOtHNH8y G5qrl8fTQ/gITNe3Z/mKZHO3aGGChUSN/E/cGZac/VhrnENT5Pouq9n9V5gL/DYpRadt ZW8uilqx0+wi8OgfXLioirur394R8Y80XgxG2UXWFVI6LCRUDfYgUj5p7PZvwiAwd9HU krCODfDOhfMC4oVFw60Co1jr/G2A9PiRDSUECIuEMm2FHuGg8n61+PtfQnAXQjGDiVAQ WdArZoTxz8jp+cOIRIcL2PbzyuFvFY3ipLtQPnnqNSjVvB1BC4htxtdPZGTKZ79jhj38 n4SQ== X-Gm-Message-State: ABuFfoibdTWjDin7TogjF/3ctPMhOR0l9cZ9DrdluFsz/O9DR/6W5B4P zrQkbQ2Cr1qFaA9ZvtYyatVW8BlkiNOAKbmi9vq/pnru71GdNUoU9hlGmUD0eqXPG8+bUw6PSTf xpMmUmRh3gps7LFly4PkaxkXUdR6wYjAP6C4rrgqXrc6+WWW9FA3nZf4xIjP/gZTGOg== X-Received: by 2002:a17:902:8bc3:: with SMTP id r3-v6mr35485173plo.218.1539231222357; Wed, 10 Oct 2018 21:13:42 -0700 (PDT) X-Google-Smtp-Source: ACcGV63eARtPjZt9Mm/5YDAxcz64VuIRwhrEA/DX757hRiHV9aAF4V1xSUydu9hjbN91TS947mBq X-Received: by 2002:a17:902:8bc3:: with SMTP id r3-v6mr35485144plo.218.1539231221590; Wed, 10 Oct 2018 21:13:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1539231221; cv=none; d=google.com; s=arc-20160816; b=BwWf/2QabvBjGQ5HBd4UN0ExSD/vHGpB/a8/WxSlMyBSN3KY410Ki9TV00qLGsuoQO SVPz1OQVD8uBuXKTecbjQwu6J/wUOHVe32kvW7oBYissHkF1EsBkyVlcCAVybFHvEKXW cZiT4pUT8+QEntVsb9+eukKiGNCzcEjlmi0AIGMzEOkteYn3RdwYc/edvLtm+d2IqRJB vr0OZFRX2IBfcUS4MDIm35dNQzcAI2AeC+BgqDQNWavagV/LrhGTF64kW0qoYOSZzddd zPmsv/zMfYRpknZncZHnk/Pk54JHAGAT885sHFx0xenj6YgE7hP2HG+B//5LUBcZgWWC p6KQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:user-agent:references :in-reply-to:message-id:date:cc:to:from:subject:dkim-signature; bh=/3l7N/X857KPTkSp1muxCsYvuhsKcEoEr7NE87oRJI0=; b=Q829SuYbqabvUlioa3S+Z0ovw2xQ2nNRdbA2rFtR96FO3wiXXY/myHkXRZpcqFq/EJ 6iinvodjQyasT1EUJkm+RuvZKMDUtuw4Z+HicSmmtz1TBrIujvYRsJ4Di0Ji68/A3YFT vPwaMzuFnlox/SeWzNAfEnRfWk+isqOKEvXz0kmCwYciQ/loTFs67tOzk+0HH7SAbFq8 0cvTfLwRZ6rmfUAQ7zr5ZvSmVrgte3JTaslaZOHsUjb3GCPjQTf2o7p8GPQG8uBEW/nf tYBL8R3hSOXWQv9/dz8aLyNr33T1p/B+iXAqxOooRhUkzPx0zPVcMWrKAIwhSOMR6jhf riAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=BSqSq+tr; spf=pass (google.com: domain of darrick.wong@oracle.com designates 156.151.31.85 as permitted sender) smtp.mailfrom=darrick.wong@oracle.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: from userp2120.oracle.com (userp2120.oracle.com. [156.151.31.85]) by mx.google.com with ESMTPS id a94-v6si28662526pla.123.2018.10.10.21.13.41 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Oct 2018 21:13:41 -0700 (PDT) Received-SPF: pass (google.com: domain of darrick.wong@oracle.com designates 156.151.31.85 as permitted sender) client-ip=156.151.31.85; Authentication-Results: mx.google.com; dkim=pass header.i=@oracle.com header.s=corp-2018-07-02 header.b=BSqSq+tr; spf=pass (google.com: domain of darrick.wong@oracle.com designates 156.151.31.85 as permitted sender) smtp.mailfrom=darrick.wong@oracle.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=oracle.com Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.22/8.16.0.22) with SMTP id w9B49E23191454; Thu, 11 Oct 2018 04:13:39 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2018-07-02; bh=/3l7N/X857KPTkSp1muxCsYvuhsKcEoEr7NE87oRJI0=; b=BSqSq+trbEleQirbu1tgM1FSk0fFdALrWymV5yUCvcDC8onpQEavsKsxUvbOqT3ky3aV Mm/zXYWW/BSOSXOMS7n1uJiEVhoD6tKE9/Xq6yweq/RzNytIEb0mjj1xNgalnGGZibuu xG9eRGAPdm8OY+ZPaAOdxsZpNQIhega+aohUa6c1PXi9/YeopMPaWPXca5WXOpymdX0c 4AyJFtBnUK6trvNj0KFTZe5ckm5qqrIe27Qy6xaOfvOfS672dpH4Y18bgIOIcl2Y1ZXo X1VB6UBlTzs8FCtUSLpMUxpQdIytUBB1O29GMuqAC7sV5lxuGu+bnG6+YMON3mRyJ6wB 8g== Received: from userv0022.oracle.com (userv0022.oracle.com [156.151.31.74]) by userp2120.oracle.com with ESMTP id 2mxnpr98yn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 11 Oct 2018 04:13:39 +0000 Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0022.oracle.com (8.14.4/8.14.4) with ESMTP id w9B4DbV5020339 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 11 Oct 2018 04:13:37 GMT Received: from abhmp0016.oracle.com (abhmp0016.oracle.com [141.146.116.22]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id w9B4DboT011825; Thu, 11 Oct 2018 04:13:37 GMT Received: from localhost (/10.159.132.249) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Thu, 11 Oct 2018 04:13:36 +0000 Subject: [PATCH 10/25] vfs: create generic_remap_file_range_touch to update inode metadata From: "Darrick J. Wong" To: david@fromorbit.com, darrick.wong@oracle.com Cc: sandeen@redhat.com, linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org, Amir Goldstein , linux-unionfs@vger.kernel.org, linux-xfs@vger.kernel.org, linux-mm@kvack.org, linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, ocfs2-devel@oss.oracle.com Date: Wed, 10 Oct 2018 21:13:35 -0700 Message-ID: <153923121518.5546.15603284343898988670.stgit@magnolia> In-Reply-To: <153923113649.5546.9840926895953408273.stgit@magnolia> References: <153923113649.5546.9840926895953408273.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=5900 definitions=9042 signatures=668706 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-1807170000 definitions=main-1810110039 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Darrick J. Wong Create a new VFS helper to handle inode metadata updates when remapping into a file. If the operation can possibly alter the file contents, we must update the ctime and mtime and remove security privileges, just like we do for regular file writes. Wire up ocfs2 to ensure consistent behavior. Signed-off-by: Darrick J. Wong Reviewed-by: Amir Goldstein --- fs/ocfs2/refcounttree.c | 8 ++++++++ fs/read_write.c | 24 ++++++++++++++++++++++++ fs/xfs/xfs_reflink.c | 29 +++++++---------------------- include/linux/fs.h | 1 + 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c index 36c56dfbe485..ee1ed11379b3 100644 --- a/fs/ocfs2/refcounttree.c +++ b/fs/ocfs2/refcounttree.c @@ -4855,6 +4855,14 @@ int ocfs2_reflink_remap_range(struct file *file_in, if (ret <= 0) goto out_unlock; + /* + * Update inode timestamps and remove security privileges before we + * take the ilock. + */ + ret = generic_remap_file_range_touch(file_out, is_dedupe); + if (ret) + goto out_unlock; + /* Lock out changes to the allocation maps and remap. */ down_write(&OCFS2_I(inode_in)->ip_alloc_sem); if (!same_inode) diff --git a/fs/read_write.c b/fs/read_write.c index 60cdfb576d81..b233fe019fae 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -1811,6 +1811,30 @@ int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in, } EXPORT_SYMBOL(generic_remap_file_range_prep); +/* Update inode timestamps and remove security privileges when remapping. */ +int generic_remap_file_range_touch(struct file *file, bool is_dedupe) +{ + int ret; + + /* If can't alter the file contents, we're done. */ + if (is_dedupe) + return 0; + + /* Update the timestamps, since we can alter file contents. */ + if (!(file->f_mode & FMODE_NOCMTIME)) { + ret = file_update_time(file); + if (ret) + return ret; + } + + /* + * Clear the security bits if the process is not being run by root. + * This keeps people from modifying setuid and setgid binaries. + */ + return file_remove_privs(file); +} +EXPORT_SYMBOL(generic_remap_file_range_touch); + int do_clone_file_range(struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, u64 len) { diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c index a7757a128a78..99f2ea4fcaba 100644 --- a/fs/xfs/xfs_reflink.c +++ b/fs/xfs/xfs_reflink.c @@ -1371,28 +1371,13 @@ xfs_reflink_remap_prep( truncate_inode_pages_range(&inode_out->i_data, pos_out, PAGE_ALIGN(pos_out + *len) - 1); - /* If we're altering the file contents... */ - if (!is_dedupe) { - /* - * ...update the timestamps (which will grab the ilock again - * from xfs_fs_dirty_inode, so we have to call it before we - * take the ilock). - */ - if (!(file_out->f_mode & FMODE_NOCMTIME)) { - ret = file_update_time(file_out); - if (ret) - goto out_unlock; - } - - /* - * ...clear the security bits if the process is not being run - * by root. This keeps people from modifying setuid and setgid - * binaries. - */ - ret = file_remove_privs(file_out); - if (ret) - goto out_unlock; - } + /* + * Update inode timestamps and remove security privileges before we + * take the ilock. + */ + ret = generic_remap_file_range_touch(file_out, is_dedupe); + if (ret) + goto out_unlock; return 1; out_unlock: diff --git a/include/linux/fs.h b/include/linux/fs.h index 686905be04c0..91fd3c77763b 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1847,6 +1847,7 @@ extern ssize_t vfs_copy_file_range(struct file *, loff_t , struct file *, extern int generic_remap_file_range_prep(struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, u64 *count, bool is_dedupe); +extern int generic_remap_file_range_touch(struct file *file, bool is_dedupe); extern int do_clone_file_range(struct file *file_in, loff_t pos_in, struct file *file_out, loff_t pos_out, u64 len); extern int vfs_clone_file_range(struct file *file_in, loff_t pos_in,