From patchwork Sun Dec 11 21:31:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fabio M. De Francesco" X-Patchwork-Id: 32203 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp1927907wrr; Sun, 11 Dec 2022 13:50:47 -0800 (PST) X-Google-Smtp-Source: AA0mqf56XazmAF1VqxvjoJf/Qt3HGUFN/n4+NEND+Zm8e9IkqPQAy36Coo+FFZbPyuIdCHNxa3gI X-Received: by 2002:a17:902:6b8b:b0:188:a4a3:7bb3 with SMTP id p11-20020a1709026b8b00b00188a4a37bb3mr13562334plk.9.1670795447152; Sun, 11 Dec 2022 13:50:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670795447; cv=none; d=google.com; s=arc-20160816; b=n2582xYJIILy63wtcAcfxiUYhZ05dkaFv2/IstriF6NRYroNpS4H3rEorrkR3L3euc LjpjkcTKQB8H5N43ufndxyFu2QUOVI0V/GP5rApQhCZ69eyXBSIa2x7KF6x/kSEUaWdw IDG7dtW3KFGmnq+V4OGoSjsQmaVy2/xDVzi4d7qvUkCjU1wd22Yv8oXtOkPkiARATdN/ F5tHGIe5n5zTIIuqN8QAkr/NoESyvnFLIuaW2jyHqZBM6ckozvJbDO3hplK64Y4LOiSe 98ELmMGCKr5bw05C5EuWowSRE0hLSDU6U2wBki4kBTzmYn7vj2i57nGS9zy3Hyiw+BH9 GeRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=iT8jy7hXGuLdSI3WnW19MAFpxEEAB5GqxCDkyx7KpM4=; b=LacyBUcsaMTLUkMSscT+4EW03Rnz6oIv3/LDv0OioKb3jltOZrKJxP2YsfSZ0rOLZr 0WJ6zVbJuPMzTpzonBdyIeawcPLvjho19kg57pFxn4wjSsnDx7ZSAYJECnkI7WiMUIe1 cvrDpRaWtY8TGmv+EUOniMy8HC0MNaTotFwtpGj7B+L96a8MFehe1bp1XA7LKMsWIb0s Y0eLLJrLZk60uAmClfZfH7RTjjxIyabkTJ40fZcd/Fbzrc5OtF7/YJdzV9t8s8ndyWdD cP4jxf6loMg1I0uYCAOS2THxf5mWkOT5fy16Vk5B9Y0LcYtdQZ21FOP8MzHrERcsslwA rdPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=bHIaQoWi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id o9-20020a1709026b0900b00188758ff467si7255423plk.29.2022.12.11.13.50.17; Sun, 11 Dec 2022 13:50:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=bHIaQoWi; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S230313AbiLKVbY (ORCPT + 99 others); Sun, 11 Dec 2022 16:31:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230031AbiLKVbW (ORCPT ); Sun, 11 Dec 2022 16:31:22 -0500 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4BD7ADE93; Sun, 11 Dec 2022 13:31:21 -0800 (PST) Received: by mail-wm1-x336.google.com with SMTP id f13-20020a1cc90d000000b003d08c4cf679so3631074wmb.5; Sun, 11 Dec 2022 13:31:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iT8jy7hXGuLdSI3WnW19MAFpxEEAB5GqxCDkyx7KpM4=; b=bHIaQoWiU/RqdS0GRKzMghm5tUXLJ+904G799bZNyECaA+xGQUUX5VrxuxK60g4z1n ngvtGi9jl+kCHdtgF0pR7EywnsK79hRXBKqaeJB7YvykSu+dv3RGDRBDup5d+lIuKe3/ B+3y71WOzZdUAnsPbvB6H4Fndjt0fS/VtB1i37X3gr896cbtSB+Qxi2unLBTDyxx6UcC F5mzvNnVp3c/baEZLDKJKe4KKn3YpB8VlNJs0i5ZCxfwqT+1oDdT12CFjm+pxWPckD8M cAUtAtvKLgwtxI0Q1IO2y0ezzQ0OJpGi5mBU6ghnuvBKIM8TOToMwV0KANPkWM42kE62 macw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iT8jy7hXGuLdSI3WnW19MAFpxEEAB5GqxCDkyx7KpM4=; b=0juqYqG7XVTesbxuRUg9S87e5Nza6+NxJw6jykgZKYwQZpwAes1nJugVw6Oa13H6Ar Vz9vaYciAoL1o/Czciw4/gViDw3qXkybQiPuR1as2p30BfEFwyEkTxSUs1cVjEWFUhZ9 N1UIaaLpWfvyU2t9ZRNIidZxdF50HfFmuG8EXprPWMFjyi2aP/QK8KKoNj1eql7QcOF9 ccCdLDpjyL8Hh8wfZNWwfuK3t+nItDw8LUFe2yF7cjOydgnnhoTyVRjWE43thwi9OAxW a98OIma1XsQ7yOgnlBH0O9M6wLqSxOndINnL9ujbtqwiCjAntpLMH8tlNDFmss0rpzet Otig== X-Gm-Message-State: ANoB5pmMx6BEumNACpGgKgySa7RAAx9pkCNo7l1+Dc+qLjbRqkeQuXg3 uaWNZ7mE/oDDb/saZhf8K70= X-Received: by 2002:a05:600c:3584:b0:3d1:bf7c:391c with SMTP id p4-20020a05600c358400b003d1bf7c391cmr10228233wmq.4.1670794279732; Sun, 11 Dec 2022 13:31:19 -0800 (PST) Received: from localhost.localdomain (host-95-247-100-134.retail.telecomitalia.it. [95.247.100.134]) by smtp.gmail.com with ESMTPSA id m127-20020a1c2685000000b003d1d5a83b2esm6866350wmm.35.2022.12.11.13.31.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Dec 2022 13:31:19 -0800 (PST) From: "Fabio M. De Francesco" To: Evgeniy Dushistov , Al Viro , Ira Weiny , linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: "Fabio M. De Francesco" Subject: [PATCH 1/3] fs/ufs: Use the offset_in_page() helper Date: Sun, 11 Dec 2022 22:31:09 +0100 Message-Id: <20221211213111.30085-2-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221211213111.30085-1-fmdefrancesco@gmail.com> References: <20221211213111.30085-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1751956006731729172?= X-GMAIL-MSGID: =?utf-8?q?1751956006731729172?= Use the offset_in_page() helper because it is more suitable than doing explicit subtractions between pointers to directory entries and kernel virtual addresses of mapped pages. Cc: Ira Weiny Suggested-by: Al Viro Signed-off-by: Fabio M. De Francesco --- fs/ufs/dir.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 391efaf1d528..69f78583c9c1 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -87,8 +87,7 @@ void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, struct page *page, struct inode *inode, bool update_times) { - loff_t pos = page_offset(page) + - (char *) de - (char *) page_address(page); + loff_t pos = page_offset(page) + offset_in_page(de); unsigned len = fs16_to_cpu(dir->i_sb, de->d_reclen); int err; @@ -371,8 +370,7 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) return -EINVAL; got_it: - pos = page_offset(page) + - (char*)de - (char*)page_address(page); + pos = page_offset(page) + offset_in_page(de); err = ufs_prepare_chunk(page, pos, rec_len); if (err) goto out_unlock; @@ -497,8 +495,8 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, { struct super_block *sb = inode->i_sb; char *kaddr = page_address(page); - unsigned from = ((char*)dir - kaddr) & ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); - unsigned to = ((char*)dir - kaddr) + fs16_to_cpu(sb, dir->d_reclen); + unsigned int from = offset_in_page(dir) & ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); + unsigned int to = offset_in_page(dir) + fs16_to_cpu(sb, dir->d_reclen); loff_t pos; struct ufs_dir_entry *pde = NULL; struct ufs_dir_entry *de = (struct ufs_dir_entry *) (kaddr + from); @@ -522,7 +520,7 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, de = ufs_next_entry(sb, de); } if (pde) - from = (char*)pde - (char*)page_address(page); + from = offset_in_page(pde); pos = page_offset(page) + from; lock_page(page); From patchwork Sun Dec 11 21:31:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Fabio M. De Francesco" X-Patchwork-Id: 32204 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp1927908wrr; Sun, 11 Dec 2022 13:50:47 -0800 (PST) X-Google-Smtp-Source: AA0mqf47vnUZ/jRTDA0Km7r6VRbcZL39/o+HGSqGe0FAm0CpamPuzXjHi9VY7s4vPumNyMqb5oK0 X-Received: by 2002:a05:6a20:d903:b0:a3:9dd1:6d38 with SMTP id jd3-20020a056a20d90300b000a39dd16d38mr17013977pzb.25.1670795447169; Sun, 11 Dec 2022 13:50:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670795447; cv=none; d=google.com; s=arc-20160816; b=R89su84l9+UMYiBVMyWrJkYBsi5jXgHqqiTqUsuSIpL//r2fd0/b+utrwhc8U3eMyD 88RmEimGiV4Dp/CF2eQEK6QXYOcqZpkwyyG2LXRzOxSpdf5A3IUmqOgseF+44VQfmHCj xMBvocNl2pJ5r5M30besCjmcFqAKwu7fgCJM6hhrN5E/eZlDJ5odzdS1OeUrtvdDrc1A wyVqShi/nWFHRnRj/kTYFRcENsT1YRXSMd7pvtNLBExzd99Z4UrutixHJXUvkWb7lTuu JXLEZ1H2JTnl/lqpokuMlyIDpxshb5tFWm4sF3cvRXnfsTcM1zbEBfGkR23w41J6Bp6S EwvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=xO4/ERMIN9nZq44yFlvMqRszu/PsYtiiSWLF6dQbDKM=; b=lJhFUBd5TPGePOwO0yHFF9YJhUK+YhCb69wZ7JXJomsdDMx+apCnXmnaSiGn1aItu2 EXhJ0YxJrGryj26gwLcE+7jeJogTCrO35cYIF/ZkFDg4dKkEW+Bn5WF0Pgr1O0fd6Od+ eB5OKxL6uhK3C5UXLWQJN6M75UZY+uMwq15eacWRHEm+FsBHvWfTomlAkRJtP3bPBKnL IwsE+hfTZ//HH+B/x4cZgSyLrdOtBAQVms7jZqsnNzxHvhwCGu/MU/ktu/Xv0A3Xmk1A b+fTZfEqwIcEHf1FNsH6d/X21umZduEo4nUu2EJI8cGKsJfjpt4MQ8HEz4wCW6NfZ0HT 46lQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=emEK43fX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q16-20020a056a00089000b0056e2b0193bdsi8662129pfj.141.2022.12.11.13.50.17; Sun, 11 Dec 2022 13:50:47 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=emEK43fX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S230359AbiLKVbd (ORCPT + 99 others); Sun, 11 Dec 2022 16:31:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43650 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230319AbiLKVb1 (ORCPT ); Sun, 11 Dec 2022 16:31:27 -0500 Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B896FBC99; Sun, 11 Dec 2022 13:31:22 -0800 (PST) Received: by mail-wm1-x32f.google.com with SMTP id ja4-20020a05600c556400b003cf6e77f89cso8565765wmb.0; Sun, 11 Dec 2022 13:31:22 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=xO4/ERMIN9nZq44yFlvMqRszu/PsYtiiSWLF6dQbDKM=; b=emEK43fXCYtt0QOkugug9uHbdapiTHrNAxtcEWvYoNQGWhuSZnEd4TR7z2ITdOAAud Gp8SA8r1M/CdoknWxd8+Lg7X09IuWtpT8hAGrciRbkX6aZIYQv6jxfnzZvf8CyMs3jPP pv12GmWfDJAbFJGJI34m9YlswEd5KdiIP29RF8eMF+nlC7Ziu38S2dSPQ1eqAsKMXSYC R5IqTgCQeEHK3rxG5uvgDmwUP0n/5p6TMurISJH8nrtipeXwflu6L4Ab3/Js/R7W63mm xIgPsgwtmSBzMMfkxKdbTg/qdPLIswK7E9A7CSb9oeLT2uMQlftNPSt5GNSfo/9Kqlf7 sQjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xO4/ERMIN9nZq44yFlvMqRszu/PsYtiiSWLF6dQbDKM=; b=GZjzYd50+9W8wPoUnC+ncOLFose53WTiDGuf/KltJZRL90CxcplU7LQy8XG4VMWQ8A TEvqMRNVjPoMZCvkmbdYWcN8yWWAsdI3qiKfZGHlNOPc9N2LCkhgWV9lH5qENjM/dW8S MRfNS8s2bQ5humz8yL2y7ia67j31+y4GJcCJRnbZiPTtTDZusLnOa3CggEpzFxX3HowX U0AjcPL7aGAfHZvsBUPtpfWiTVQOrQEzSHjHFb3o2ITlQzYtisrdg975BU7N8mxba3gT q39cJq80/BMfGQv828x1ZPGyxF/cSe9po85y4NcJmaUQD3v/AbAWAHMXda/a2VxQ/Vh4 OEtw== X-Gm-Message-State: ANoB5pkxwcH2ZxLTr8HvIs8vxzWfacvJlZADgI+I5m4AfFvFsE0l/vlc HI5swqNMvp6DjptiDvianHwA5iVgBPs= X-Received: by 2002:a05:600c:a54:b0:3cf:894f:964b with SMTP id c20-20020a05600c0a5400b003cf894f964bmr10646599wmq.16.1670794281261; Sun, 11 Dec 2022 13:31:21 -0800 (PST) Received: from localhost.localdomain (host-95-247-100-134.retail.telecomitalia.it. [95.247.100.134]) by smtp.gmail.com with ESMTPSA id m127-20020a1c2685000000b003d1d5a83b2esm6866350wmm.35.2022.12.11.13.31.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Dec 2022 13:31:20 -0800 (PST) From: "Fabio M. De Francesco" To: Evgeniy Dushistov , Al Viro , Ira Weiny , linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: "Fabio M. De Francesco" Subject: [PATCH 2/3] fs/ufs: Change the signature of ufs_get_page() Date: Sun, 11 Dec 2022 22:31:10 +0100 Message-Id: <20221211213111.30085-3-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221211213111.30085-1-fmdefrancesco@gmail.com> References: <20221211213111.30085-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1751956006452199583?= X-GMAIL-MSGID: =?utf-8?q?1751956006452199583?= Change the signature of ufs_get_page() in order to prepare this function to the conversion to the use of kmap_local_page(). Change also those call sites which are required to conform its invocations to the new signature. Cc: Ira Weiny Suggested-by: Al Viro Signed-off-by: Fabio M. De Francesco --- fs/ufs/dir.c | 58 ++++++++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 69f78583c9c1..bb6b29ce1d3a 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -185,21 +185,21 @@ static bool ufs_check_page(struct page *page) return false; } -static struct page *ufs_get_page(struct inode *dir, unsigned long n) +static void *ufs_get_page(struct inode *dir, unsigned long n, struct page **page) { struct address_space *mapping = dir->i_mapping; - struct page *page = read_mapping_page(mapping, n, NULL); - if (!IS_ERR(page)) { - kmap(page); - if (unlikely(!PageChecked(page))) { - if (!ufs_check_page(page)) + *page = read_mapping_page(mapping, n, NULL); + if (!IS_ERR(*page)) { + kmap(*page); + if (unlikely(!PageChecked(*page))) { + if (!ufs_check_page(*page)) goto fail; } } return page; fail: - ufs_put_page(page); + ufs_put_page(*page); return ERR_PTR(-EIO); } @@ -227,15 +227,12 @@ ufs_next_entry(struct super_block *sb, struct ufs_dir_entry *p) struct ufs_dir_entry *ufs_dotdot(struct inode *dir, struct page **p) { - struct page *page = ufs_get_page(dir, 0); - struct ufs_dir_entry *de = NULL; + struct ufs_dir_entry *de = ufs_get_page(dir, 0, p); - if (!IS_ERR(page)) { - de = ufs_next_entry(dir->i_sb, - (struct ufs_dir_entry *)page_address(page)); - *p = page; - } - return de; + if (!IS_ERR(de)) + return ufs_next_entry(dir->i_sb, de); + else + return NULL; } /* @@ -273,11 +270,10 @@ struct ufs_dir_entry *ufs_find_entry(struct inode *dir, const struct qstr *qstr, start = 0; n = start; do { - char *kaddr; - page = ufs_get_page(dir, n); - if (!IS_ERR(page)) { - kaddr = page_address(page); - de = (struct ufs_dir_entry *) kaddr; + char *kaddr = ufs_get_page(dir, n, &page); + + if (!IS_ERR(kaddr)) { + de = (struct ufs_dir_entry *)kaddr; kaddr += ufs_last_byte(dir, n) - reclen; while ((char *) de <= kaddr) { if (ufs_match(sb, namelen, name, de)) @@ -328,12 +324,10 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) for (n = 0; n <= npages; n++) { char *dir_end; - page = ufs_get_page(dir, n); - err = PTR_ERR(page); - if (IS_ERR(page)) - goto out; + kaddr = ufs_get_page(dir, n, &page); + if (IS_ERR(kaddr)) + return PTR_ERR(kaddr); lock_page(page); - kaddr = page_address(page); dir_end = kaddr + ufs_last_byte(dir, n); de = (struct ufs_dir_entry *)kaddr; kaddr += PAGE_SIZE - reclen; @@ -395,8 +389,6 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) /* OFFSET_CACHE */ out_put: ufs_put_page(page); -out: - return err; out_unlock: unlock_page(page); goto out_put; @@ -429,6 +421,7 @@ ufs_readdir(struct file *file, struct dir_context *ctx) unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); bool need_revalidate = !inode_eq_iversion(inode, file->f_version); unsigned flags = UFS_SB(sb)->s_flags; + struct page *page; UFSD("BEGIN\n"); @@ -439,16 +432,14 @@ ufs_readdir(struct file *file, struct dir_context *ctx) char *kaddr, *limit; struct ufs_dir_entry *de; - struct page *page = ufs_get_page(inode, n); - - if (IS_ERR(page)) { + kaddr = ufs_get_page(inode, n, &page); + if (IS_ERR(kaddr)) { ufs_error(sb, __func__, "bad page in #%lu", inode->i_ino); ctx->pos += PAGE_SIZE - offset; return -EIO; } - kaddr = page_address(page); if (unlikely(need_revalidate)) { if (offset) { offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask); @@ -595,12 +586,11 @@ int ufs_empty_dir(struct inode * inode) for (i = 0; i < npages; i++) { char *kaddr; struct ufs_dir_entry *de; - page = ufs_get_page(inode, i); - if (IS_ERR(page)) + kaddr = ufs_get_page(inode, i, &page); + if (IS_ERR(kaddr)) continue; - kaddr = page_address(page); de = (struct ufs_dir_entry *)kaddr; kaddr += ufs_last_byte(inode, i) - UFS_DIR_REC_LEN(1); From patchwork Sun Dec 11 21:31:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Fabio M. De Francesco" X-Patchwork-Id: 32205 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp1928155wrr; Sun, 11 Dec 2022 13:51:55 -0800 (PST) X-Google-Smtp-Source: AA0mqf5j0dZNOnL5fVW72o3PR60DJvlVxQNAiNyho4IFfh+vyrUK9AODYhW+8QHbF6syHfmGm4YL X-Received: by 2002:a17:903:2ca:b0:189:8329:dba8 with SMTP id s10-20020a17090302ca00b001898329dba8mr16746671plk.39.1670795515176; Sun, 11 Dec 2022 13:51:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670795515; cv=none; d=google.com; s=arc-20160816; b=cMB+u3HzukS8SGb2hGAVYDKHS+OLSBnnrxrNpvyCYm+zi4mYB8W/wzhKst1b3teI48 kMWZD4rFscc8v8goR6m1f1i3P7t97466O8pllzmG2v7ZElhAyh5ttolqVeOh2gxY4fU/ Y3P5KJ3nX72ieyn9TIidYsLMTKMqKm/0Gjkxngo1M/wpI7r97Pq3litYo4mkMC1hA48P 1xfZuiJLi/kVglwV92M1k5E7HAUNR4BOJ8/pV28otjSMuEsPRHWVNsceon3H4pFAW+SO wd0Skx0Vv7/4QNenDOThNC5J2hBVBj9VGIa7D+xujxylVbYOZRQFuIU8hehwpWGbGPE8 382A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=S9NaCB1+LPqNsix+2hPyELV0iHtgpI56qHji3/1RqRM=; b=u2nbbKcG9pAqTl+LDhUNntt1OEOfZtTm9SoAt/MnXDZ5xRC0x/thcWzqvhVdQqVQRb SqbzG5E2r44qY3o/pdASl/JCXjS6zbm4ixqrEf2xF19F3mqkul5hNrRX8sMA63nrxp4x TOxedffGT7N1YmesSnr3B7tNG78/DzNAFqAKVCCPdeJSv4egUdjqHm8kHxpXGkgdm+nV mG4wMf+Jfea+XoODxeTfVmAS9HRn1xKOtPvi3aLo98ieGqtm5MdWKdD9relIkY0yZptq bcFGAK2jF4pb42c+9R0EfkbkA3MsYWMTfa5x3YZta3vApFI9rhVpzK231WVHmfJ5MWAP ugaA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=WKFzfFjI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id l15-20020a170903244f00b001868ef35f09si8530325pls.258.2022.12.11.13.51.41; Sun, 11 Dec 2022 13:51:55 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=WKFzfFjI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 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 S230376AbiLKVbi (ORCPT + 99 others); Sun, 11 Dec 2022 16:31:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43656 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230320AbiLKVb1 (ORCPT ); Sun, 11 Dec 2022 16:31:27 -0500 Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51C50DEA2; Sun, 11 Dec 2022 13:31:24 -0800 (PST) Received: by mail-wm1-x32a.google.com with SMTP id m19so3780958wms.5; Sun, 11 Dec 2022 13:31:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=S9NaCB1+LPqNsix+2hPyELV0iHtgpI56qHji3/1RqRM=; b=WKFzfFjIfS4bD8xVQv/I+r9OQPxLZVqjchxKNYOgbJ7MEjZdPSa7CFmS8j7LHDQWJh aNAzuAYswdrvksLjYbmpnmvUeO6RKcfujWg9RcFGL48TUI8rvkS6aQ4JWBLAkoZzS6al mM6hTbbtRsCFmoQqaG+K4eGY6vQotjpRdTOlxREx4N9RhPZsGafUW15jfUf0UqyD8XgC CGwyK2m45uNexjhG1GWJQtf+lCDw/FKi8arepg9eXigBgqpWo4xnpfsvDDvz++x9ghq9 13iZmDO/nPR8b9mqY7H+mL/+IWYf3jh7EVaOUmC4eeHhTgpGXcV3EpdNBuPcvYiC165f 6G1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S9NaCB1+LPqNsix+2hPyELV0iHtgpI56qHji3/1RqRM=; b=ROau/Ram+ESNrsnfOSrCFR2eYiepyKKoFhPcAa4Ief8q6zOTgGKL8YLkbbjzCAF35z tXcDInKybsgkjMEvNTX6cAvR9CuVp9vs1Ezq66idE4Dzp6rod1Exbr8kEsy+ELaOy7W0 gNGIW6t+nPgzTKYSL/173AxQ3Phpw+e9jtrhdrkRykW3b3Ok/fp+Ak/DWbOpunyuXlKq 7r49uuFmgyTHhhM/VuDWNnp68FEi1V3kzvMh8ZGOMagtnnn2+uUGmGmvfOFC7ak7GIje 3ZFv+7Pv/bKx0143x81DtT/JRB6342L4gXQWm8s79krc3YygutSO2dcrwKcf4H4A53B/ 4JpQ== X-Gm-Message-State: ANoB5pl5NjCO3FuregUvs2QlqIy2XA1IQfTJuHTeVVcskGh3u/+zB+92 TjdaR3SNjNI4wxNbkqquVnxLR8Ettek= X-Received: by 2002:a05:600c:6888:b0:3d1:d746:7bca with SMTP id fn8-20020a05600c688800b003d1d7467bcamr10645853wmb.4.1670794282727; Sun, 11 Dec 2022 13:31:22 -0800 (PST) Received: from localhost.localdomain (host-95-247-100-134.retail.telecomitalia.it. [95.247.100.134]) by smtp.gmail.com with ESMTPSA id m127-20020a1c2685000000b003d1d5a83b2esm6866350wmm.35.2022.12.11.13.31.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 11 Dec 2022 13:31:22 -0800 (PST) From: "Fabio M. De Francesco" To: Evgeniy Dushistov , Al Viro , Ira Weiny , linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: "Fabio M. De Francesco" Subject: [PATCH 3/3] fs/ufs: Replace kmap() with kmap_local_page() Date: Sun, 11 Dec 2022 22:31:11 +0100 Message-Id: <20221211213111.30085-4-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221211213111.30085-1-fmdefrancesco@gmail.com> References: <20221211213111.30085-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1751956078135202170?= X-GMAIL-MSGID: =?utf-8?q?1751956078135202170?= kmap() is being deprecated in favor of kmap_local_page(). There are two main problems with kmap(): (1) It comes with an overhead as the mapping space is restricted and protected by a global lock for synchronization and (2) it also requires global TLB invalidation when the kmap’s pool wraps and it might block when the mapping space is fully utilized until a slot becomes available. With kmap_local_page() the mappings are per thread, CPU local, can take page faults, and can be called from any context (including interrupts). It is faster than kmap() in kernels with HIGHMEM enabled. Furthermore, the tasks can be preempted and, when they are scheduled to run again, the kernel virtual addresses are restored and still valid. Since its use in fs/ufs is safe everywhere, it should be preferred. Therefore, replace kmap() with kmap_local_page() in fs/ufs. kunmap_local() requires the mapping address, so return that address from ufs_get_page() to be used in ufs_put_page(). Suggested-by: Al Viro Suggested-by: Ira Weiny Signed-off-by: Fabio M. De Francesco --- fs/ufs/dir.c | 76 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 47 insertions(+), 29 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index bb6b29ce1d3a..fd57d8171c88 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -61,9 +61,9 @@ static int ufs_commit_chunk(struct page *page, loff_t pos, unsigned len) return err; } -static inline void ufs_put_page(struct page *page) +static inline void ufs_put_page(struct page *page, void *page_addr) { - kunmap(page); + kunmap((void *)((unsigned long)page_addr & PAGE_MASK)); put_page(page); } @@ -76,7 +76,7 @@ ino_t ufs_inode_by_name(struct inode *dir, const struct qstr *qstr) de = ufs_find_entry(dir, qstr, &page); if (de) { res = fs32_to_cpu(dir->i_sb, de->d_ino); - ufs_put_page(page); + ufs_put_page(page, de); } return res; } @@ -99,18 +99,17 @@ void ufs_set_link(struct inode *dir, struct ufs_dir_entry *de, ufs_set_de_type(dir->i_sb, de, inode->i_mode); err = ufs_commit_chunk(page, pos, len); - ufs_put_page(page); + ufs_put_page(page, de); if (update_times) dir->i_mtime = dir->i_ctime = current_time(dir); mark_inode_dirty(dir); } -static bool ufs_check_page(struct page *page) +static bool ufs_check_page(struct page *page, char *kaddr) { struct inode *dir = page->mapping->host; struct super_block *sb = dir->i_sb; - char *kaddr = page_address(page); unsigned offs, rec_len; unsigned limit = PAGE_SIZE; const unsigned chunk_mask = UFS_SB(sb)->s_uspi->s_dirblksize - 1; @@ -185,21 +184,30 @@ static bool ufs_check_page(struct page *page) return false; } +/* + * Calls to ufs_get_page()/ufs_put_page() must be nested according to the + * rules documented in kmap_local_page()/kunmap_local(). + * + * NOTE: ufs_find_entry() and ufs_dotdot() act as calls to ufs_get_page() + * and must be treated accordingly for nesting purposes. + */ static void *ufs_get_page(struct inode *dir, unsigned long n, struct page **page) { + char *kaddr; + struct address_space *mapping = dir->i_mapping; *page = read_mapping_page(mapping, n, NULL); if (!IS_ERR(*page)) { - kmap(*page); + kmap_local_page(*page); if (unlikely(!PageChecked(*page))) { - if (!ufs_check_page(*page)) + if (!ufs_check_page(*page, kaddr)) goto fail; } } - return page; + return *page; fail: - ufs_put_page(*page); + ufs_put_page(*page, kaddr); return ERR_PTR(-EIO); } @@ -225,6 +233,13 @@ ufs_next_entry(struct super_block *sb, struct ufs_dir_entry *p) fs16_to_cpu(sb, p->d_reclen)); } +/* + * Calls to ufs_get_page()/ufs_put_page() must be nested according to the + * rules documented in kmap_local_page()/kunmap_local(). + * + * ufs_dotdot() acts as a call to ufs_get_page() and must be treated + * accordingly for nesting purposes. + */ struct ufs_dir_entry *ufs_dotdot(struct inode *dir, struct page **p) { struct ufs_dir_entry *de = ufs_get_page(dir, 0, p); @@ -236,12 +251,15 @@ struct ufs_dir_entry *ufs_dotdot(struct inode *dir, struct page **p) } /* - * ufs_find_entry() + * Finds an entry in the specified directory with the wanted name. It returns a + * pointer to the directory's entry. The page in which the entry was found is + * in the res_page out parameter. The page is returned mapped and unlocked. + * The entry is guaranteed to be valid. + * + * On Success ufs_put_page() should be called on *res_page. * - * finds an entry in the specified directory with the wanted name. It - * returns the page in which the entry was found, and the entry itself - * (as a parameter - res_dir). Page is returned mapped and unlocked. - * Entry is guaranteed to be valid. + * ufs_find_entry() acts as a call to ufs_get_page() and must be treated + * accordingly for nesting purposes. */ struct ufs_dir_entry *ufs_find_entry(struct inode *dir, const struct qstr *qstr, struct page **res_page) @@ -280,7 +298,7 @@ struct ufs_dir_entry *ufs_find_entry(struct inode *dir, const struct qstr *qstr, goto found; de = ufs_next_entry(sb, de); } - ufs_put_page(page); + ufs_put_page(page, kaddr); } if (++n >= npages) n = 0; @@ -358,7 +376,7 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) de = (struct ufs_dir_entry *) ((char *) de + rec_len); } unlock_page(page); - ufs_put_page(page); + ufs_put_page(page, kaddr); } BUG(); return -EINVAL; @@ -388,7 +406,8 @@ int ufs_add_link(struct dentry *dentry, struct inode *inode) mark_inode_dirty(dir); /* OFFSET_CACHE */ out_put: - ufs_put_page(page); + ufs_put_page(page, kaddr); + return 0; out_unlock: unlock_page(page); goto out_put; @@ -465,13 +484,13 @@ ufs_readdir(struct file *file, struct dir_context *ctx) ufs_get_de_namlen(sb, de), fs32_to_cpu(sb, de->d_ino), d_type)) { - ufs_put_page(page); + ufs_put_page(page, kaddr); return 0; } } ctx->pos += fs16_to_cpu(sb, de->d_reclen); } - ufs_put_page(page); + ufs_put_page(page, kaddr); } return 0; } @@ -482,10 +501,10 @@ ufs_readdir(struct file *file, struct dir_context *ctx) * previous entry. */ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, - struct page * page) + struct page *page) { struct super_block *sb = inode->i_sb; - char *kaddr = page_address(page); + char *kaddr = (char *)((unsigned long)dir & PAGE_MASK); unsigned int from = offset_in_page(dir) & ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1); unsigned int to = offset_in_page(dir) + fs16_to_cpu(sb, dir->d_reclen); loff_t pos; @@ -524,7 +543,7 @@ int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir, inode->i_ctime = inode->i_mtime = current_time(inode); mark_inode_dirty(inode); out: - ufs_put_page(page); + ufs_put_page(page, kaddr); UFSD("EXIT\n"); return err; } @@ -548,8 +567,7 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) goto fail; } - kmap(page); - base = (char*)page_address(page); + base = kmap_local_page(page); memset(base, 0, PAGE_SIZE); de = (struct ufs_dir_entry *) base; @@ -566,7 +584,7 @@ int ufs_make_empty(struct inode * inode, struct inode *dir) de->d_reclen = cpu_to_fs16(sb, chunk_size - UFS_DIR_REC_LEN(1)); ufs_set_de_namlen(sb, de, 2); strcpy (de->d_name, ".."); - kunmap(page); + kunmap_local(base); err = ufs_commit_chunk(page, 0, chunk_size); fail: @@ -582,9 +600,9 @@ int ufs_empty_dir(struct inode * inode) struct super_block *sb = inode->i_sb; struct page *page = NULL; unsigned long i, npages = dir_pages(inode); + char *kaddr; for (i = 0; i < npages; i++) { - char *kaddr; struct ufs_dir_entry *de; kaddr = ufs_get_page(inode, i, &page); @@ -617,12 +635,12 @@ int ufs_empty_dir(struct inode * inode) } de = ufs_next_entry(sb, de); } - ufs_put_page(page); + ufs_put_page(page, kaddr); } return 1; not_empty: - ufs_put_page(page); + ufs_put_page(page, kaddr); return 0; }