From patchwork Sat Dec 17 18:47:47 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: 34235 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp1636163wrn; Sat, 17 Dec 2022 10:57:46 -0800 (PST) X-Google-Smtp-Source: AA0mqf7GoCPF83lI3V8qrQOvzrzHz8XhEdn83VUEOr4p3L8ju3eqZQABDoHwDIWnsHRM2dekQOHs X-Received: by 2002:a17:906:2993:b0:7c0:f7b0:95d3 with SMTP id x19-20020a170906299300b007c0f7b095d3mr28721378eje.36.1671303465903; Sat, 17 Dec 2022 10:57:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671303465; cv=none; d=google.com; s=arc-20160816; b=XnmfDP2MtniHN4DlKkmgkSK9Ln+WU9VsgdF32f2hkYDYzFI651zYs1aYU6qpCQFYKc imWGTP/roJ8Rif6ve+0KGcz2amKUOwjcwtiks+jzvpraJvVCDjabRPPDjl8m/xXGkR0a JPTPIRApb5ugdaU1+jgohZPfVgmyDu+JhzDNKlznm4vuc+H1pmWUd6erXCOLrLCiLi5+ 0Oe4Udv/+AE9rml7/tPP5/wXa8KQs7SrENxSYOnTc5Gl1k+nBgIaEsfdEYJoxyEgdo8Q H1NEoQZvPtUg4LLm2zY3B1YYzUdtmNDVdpQYhfzynVqPxgVlXWhsMbd37rECt/s1eQri Gokw== 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=5jghot3JZGfw4NoEk9T1OvZadmJ48FJEB71fkAQxUvE=; b=fkY1eSPGgu1BXduIPUqFWiRQT6fOsaibbiR+gn5sJCkgAeckJmfCNktelD8BX4DF2C ceKsRUnCSn7w65atSTQ9dqYAni6dumPs75jYT0QNQbJWQR7mZH0D7whGBywoE3x5PXSx 81AWlYp/EqTQsMHTFO231tK13CYJ4FCpejI0btXMZTErU1v+dLLsdYRKzzpNI6ukp+bV HyIKyyUeLVvGzGig0BV+Q1QlI5d+Om1LVTX1wciix2SR2Ss1fZMfdttTc01GLTjbHX+X r1HrwsozpOQviy4JBGsZVr+iEU0cJczfFCxjEzGGaHGi5tVdcV+wuhWGEcYA+/aex2Vh Sg7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=WE0WzPGk; 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 vp4-20020a170907a48400b007a7f207a1b9si4501485ejc.664.2022.12.17.10.57.23; Sat, 17 Dec 2022 10:57:45 -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=WE0WzPGk; 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 S229978AbiLQSsN (ORCPT + 99 others); Sat, 17 Dec 2022 13:48:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229783AbiLQSsH (ORCPT ); Sat, 17 Dec 2022 13:48:07 -0500 Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EA22BDFB4; Sat, 17 Dec 2022 10:48:05 -0800 (PST) Received: by mail-wm1-x333.google.com with SMTP id v124-20020a1cac82000000b003cf7a4ea2caso6206369wme.5; Sat, 17 Dec 2022 10:48:05 -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=5jghot3JZGfw4NoEk9T1OvZadmJ48FJEB71fkAQxUvE=; b=WE0WzPGkqsj6zyGeajdPvYaf/k3hmevTcSGMxGArvTW9v5lOZPAr8Ozs1l+g2F8Zq7 /oZUmvpwC33JlKpraDe+0S9fVTOOUA1E+G3z55lzjwcvvA45Kgd+BqUBlPCGmf8Uto6X O5E0YpjaBlecDdg6iVx8CN49OxG/tvWDzbBOkjrzAOB7YukX7rs3W8RQk5QRbRii/Q41 Vs2Ph+qQEurOTUoN6Ky7VXrxVK0hyquoRvyAX/Fh+PCP/0H4E/3RcJ4Rl4zDR0x/Fk8/ wmZcin4livQl5IPm1NTCtMscYHA2uN6NiSoHn33Z0GQixJFrpx3JwGv5YsTGhoxz3AbM GeTA== 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=5jghot3JZGfw4NoEk9T1OvZadmJ48FJEB71fkAQxUvE=; b=RQBz+Fzuxzqt9yT03PpxDq1RFAc4AacUoggpEZoxcGvv3yB72FLFK1G2ol8RsWJAiV M08DnnRrKA0sySST4rcrgq2HhG7DHVXDbGskh0RYGbQ39Ner5OX1JcOYvo27SifTEaUn 2YGD4fOywTZksK7naB2JPK7MZf9xZzpNopPnPfdetDcnLr82GRxOM1yiHQBmUP1wwmZf ylYykROMADhQ40OmbuX7rmbwHSamVE1fG6UXQHTt34KXp064X7ldp7TjqMj8AIm1fTmB 0uPQnHDbYG+9SpnXakdcnNa7JuixR+OJe8VzBdk88CPjmjgjm4qqmpHwaPl7/QG+JjbF sc8A== X-Gm-Message-State: ANoB5pmwv2wQafi851MUu6GXsHb5mWWoiC8BUOKC8JbyvROvP7R79M2f vExd3yisP0PJ7VA5SiHWq+6SxJ+RWfI= X-Received: by 2002:a05:600c:4e0e:b0:3cf:b73f:c061 with SMTP id b14-20020a05600c4e0e00b003cfb73fc061mr27304881wmq.16.1671302884427; Sat, 17 Dec 2022 10:48:04 -0800 (PST) Received: from localhost.localdomain (host-79-17-30-229.retail.telecomitalia.it. [79.17.30.229]) by smtp.gmail.com with ESMTPSA id 8-20020a05600c020800b003b4935f04a4sm7726062wmi.5.2022.12.17.10.48.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 17 Dec 2022 10:48:03 -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 v3 1/3] fs/ufs: Use the offset_in_page() helper Date: Sat, 17 Dec 2022 19:47:47 +0100 Message-Id: <20221217184749.968-2-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221217184749.968-1-fmdefrancesco@gmail.com> References: <20221217184749.968-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?1752488703110091352?= X-GMAIL-MSGID: =?utf-8?q?1752488703110091352?= 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 Sat Dec 17 18:47:48 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: 34223 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp1635827wrn; Sat, 17 Dec 2022 10:56:20 -0800 (PST) X-Google-Smtp-Source: AMrXdXtk6HB01OFQrD7cXlmT8hoMDIYermgjTxFpi0xHCzmD84xLWrwkbtF12V2aq4QPM0xZjSt+ X-Received: by 2002:aa7:c046:0:b0:476:50e8:93a2 with SMTP id k6-20020aa7c046000000b0047650e893a2mr5211683edo.37.1671303380213; Sat, 17 Dec 2022 10:56:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671303380; cv=none; d=google.com; s=arc-20160816; b=bpr/q/tfwuesAOyh+tRFH6SOQPHrnP4XJ+kw9fObEC64gQFEmebTOHAuk5pZZZ2lsi +KI49HtusMZB1n4eb8nvj73BTj2Q71A2Ho8mZxbqufUGAxoOC+ISO8LpyYYLfh/zuV8l 7iovx3s26M1MVqRFbgbwu4bYttRUCaS8b9CY0LhHlN12sM9WAeEtzwoa8bDTyBN+K/TP McK843QTrKQAzj0cglXmyFvFOaKzFH9FmQ/ucp5qi4WdwH8t0CtUBaFYYgsf2hNyF44g VTYNc/ux4JP1jBKGu+SFHm0MCAS1XJgdIzS83Z3kJ13JZyHuSx5fjVajIyAJ3LoRKlO5 3mHA== 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=FcnhtLxGH6tMzfQBTTollTof8QECLCvQEKU1dU8eYaM=; b=rD+7JrIwMJKBIum0YZRUKuXLRUatMmrAaKn1ISdDgb7kwi6nA1hVemmA3Hh0TvFis4 626CEtiEEdUAOEREGeh+NuBNdx7gGQD+3hef1vLXpgquJhJrQryFtNryN3jbYj47FhXQ 70djE1hwtdrmW1+uDn0X5H7FaYGGN+2AlCY8ypspUmg4v8OTWR+F8fezvnFBEv9o4txN CnIK2DqUqSu6CN/FWw2CaqpMqXUR+LRccWsHX2bZZgJW30k3b+y3z4NVpjBGh1xjmit4 ynJU15NpgPiuEQOiVVdrbTBW/qFvQlT46RhCw9t7xCByzjphKACxrC0SetVFA/YR5/jq 9p2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=KQzTZcGy; 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 c13-20020a50d64d000000b0046d57bba913si5419231edj.520.2022.12.17.10.55.57; Sat, 17 Dec 2022 10:56:20 -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=KQzTZcGy; 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 S229989AbiLQSsR (ORCPT + 99 others); Sat, 17 Dec 2022 13:48:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38626 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229951AbiLQSsJ (ORCPT ); Sat, 17 Dec 2022 13:48:09 -0500 Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5940A21B9; Sat, 17 Dec 2022 10:48:07 -0800 (PST) Received: by mail-wm1-x329.google.com with SMTP id o5-20020a05600c510500b003d21f02fbaaso6213324wms.4; Sat, 17 Dec 2022 10:48:07 -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=FcnhtLxGH6tMzfQBTTollTof8QECLCvQEKU1dU8eYaM=; b=KQzTZcGydWn32a4K64Xd1ZqvlcBiYEeu3HqrcdNPSSGzOly0ieFVYVo361b47M33VI D4Yc72UbGkYdoz8+GPTnoVg/yWy5Yc6ewh1P9x8v7tJpGZSiAuwQGS3jpzrblC9RV8Vh Wg/US4me+X2T4YxGPINjlK4DEMNpxxNSRE9WZb/iepFXEDcRtIn4GVGPHrvRM1ddBM+v qzeWum/jYz0xQ2xqIIDJuFM2ixorENL3BYsqJHrh9dZZXqLsRLah+GjBtnf7rovOz+qf /Z6WpS988t4T+F3kLXc2wZ2JO05p+U20lyQZ3aSeK7gxSYTdHJaVQaoE9HVY1B4Wvqmu OGfg== 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=FcnhtLxGH6tMzfQBTTollTof8QECLCvQEKU1dU8eYaM=; b=co4fvdS4+e50nSWeIY0LTltSDv0AYYHzD9xcqgo/6nZEvaV4YOKlfYQT1/5tEw5tSc B54AiC8mOH8GYgImNTAwjbGljKl9oW7LvkFwLoU15pjyDgD0t20i2Z2NNhLzFu98kcGx Vpn21GmTVUZxkdSqamok891/0KBqhF0M1OoVF7RyEAyq24XQW0EFGKrm4SGDeWWvynW7 I2RoG4/S6JQNonAPkt/Q8f45gD2ko8bFdzT8Sn0B+kCgozGiqK9HktF+CgR4NegLbNyF /Y6jeVmAX9xLX9MslraFAkihNZTkhBn4bL/bTqoWSXvs4EhOs0xb+t3vAxP4vVXOD+Jy 415w== X-Gm-Message-State: ANoB5plP6ipB9C1VwPYCHWu9aDKVQFrLLod3mqtrcUlEr1cawDpRVm0P j5Ts3LmqLsluvTncnxzsv14A1CA0Wis= X-Received: by 2002:a05:600c:1c0d:b0:3d2:3d7b:6115 with SMTP id j13-20020a05600c1c0d00b003d23d7b6115mr10671826wms.7.1671302885808; Sat, 17 Dec 2022 10:48:05 -0800 (PST) Received: from localhost.localdomain (host-79-17-30-229.retail.telecomitalia.it. [79.17.30.229]) by smtp.gmail.com with ESMTPSA id 8-20020a05600c020800b003b4935f04a4sm7726062wmi.5.2022.12.17.10.48.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 17 Dec 2022 10:48:05 -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 v3 2/3] fs/ufs: Change the signature of ufs_get_page() Date: Sat, 17 Dec 2022 19:47:48 +0100 Message-Id: <20221217184749.968-3-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221217184749.968-1-fmdefrancesco@gmail.com> References: <20221217184749.968-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?1752488613455527807?= X-GMAIL-MSGID: =?utf-8?q?1752488613455527807?= 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 | 49 +++++++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 69f78583c9c1..9fa86614d2d1 100644 --- a/fs/ufs/dir.c +++ b/fs/ufs/dir.c @@ -185,7 +185,7 @@ 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 **p) { struct address_space *mapping = dir->i_mapping; struct page *page = read_mapping_page(mapping, n, NULL); @@ -195,8 +195,10 @@ static struct page *ufs_get_page(struct inode *dir, unsigned long n) if (!ufs_check_page(page)) goto fail; } + *p = page; + return page_address(page); } - return page; + return ERR_CAST(page); fail: ufs_put_page(page); @@ -227,15 +229,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 +272,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 +326,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,7 +391,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); @@ -429,6 +424,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 +435,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 +589,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 Sat Dec 17 18:47:49 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: 34222 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:e747:0:0:0:0:0 with SMTP id c7csp1635778wrn; Sat, 17 Dec 2022 10:56:08 -0800 (PST) X-Google-Smtp-Source: AA0mqf7ERYgtgGZYyUHIgrVxXoBJ4wn9WOIRPSmtIIovHPX5+5tJgPLo7KEWMNJkUtUBLmGS8tyV X-Received: by 2002:a05:6402:3710:b0:45c:835b:8fb3 with SMTP id ek16-20020a056402371000b0045c835b8fb3mr29168002edb.30.1671303368061; Sat, 17 Dec 2022 10:56:08 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1671303368; cv=none; d=google.com; s=arc-20160816; b=MCBZo+AfDfoja7D6nkkbbl0ffOn9u84FEk3xTAWUa6Y9k3SQLaTpQ+DEov0u3c/h5J JJ2iyyH/BQAUz0eGYEarEhNs7ckhpLfE6vYQgecGlhY5gq2PY+3DqhvEDOT0QrGuLjHd G839Qb1hwm2yTkApvHwcpMR0V4onHrnQbvGwtpc8uU5WMCvtfudkaOjl/pUlR0kxwEgq vyeBM7t1KQ1UX4y6Fi4dBVNbDad0D6Ozu8yUTJbn4ZL4g8ecv6KWEW6cYw2sWe9kXjV9 i/6MPpohL2U5rGZAy3Bu2HbmyibTX7Q088s8zAgXiBWFZ6rGfWVigTUVmgIfGf+OcUR3 GhuA== 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=Ff3j5au/gpQ72wWKY1ty9HHyftxGy5cfKV/c2Zaa72A=; b=pB76Aw35X03mR7e+6dAsgG15KD8jQ/xaxX/vJwqo//fskpwJp9uqBkRxUVQItE8/Id r6y5qHYkUHASj5GMeB9BYLy1qPdxcl+JV7s76S9hQq1rphblALt3yWJ1Ej7JRyKhMGJk w8cNQijvTPMdvprEofaZnKsU5kjr+pzy2T5cr6ePK+LkuhipSVv5d8Jjqg92xBQy2WpB sy3r2B8f5sae/4V7ADI/UAUNHEQSkCVAwoPXpT7lRtEada4rJ7/awrUc++ClwXw70xk4 95b3McRFFySmLm/6GbpNpx75g2Xw3E9TlfWMQqXyzYEgQbxYMjkHYo6jxFvgbs5/zCT7 XP0w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=aNQD1P1S; 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 t6-20020a50ab46000000b0046b13a6c40fsi4983656edc.54.2022.12.17.10.55.45; Sat, 17 Dec 2022 10:56:08 -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=aNQD1P1S; 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 S230018AbiLQSs0 (ORCPT + 99 others); Sat, 17 Dec 2022 13:48:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38630 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229710AbiLQSsK (ORCPT ); Sat, 17 Dec 2022 13:48:10 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ACF3FDFB4; Sat, 17 Dec 2022 10:48:08 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id m5-20020a7bca45000000b003d2fbab35c6so3852103wml.4; Sat, 17 Dec 2022 10:48:08 -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=Ff3j5au/gpQ72wWKY1ty9HHyftxGy5cfKV/c2Zaa72A=; b=aNQD1P1SKnaojV1E7zxWra/NYDEgudyiYLzSJ13k5WcuAofqwSqfDptWC+6GqrUcEE xbh8fynZ1FC7xERi5zaqOsvsyH7P6cfg7vkce48AyJdnNqin30ZYmgOd++jGrZQ7bDlp 84ygIxTrczGwVGIMIO5R2d0rKiI9nUofGv7r9wjRgIbai4qpdxqdJ2OL+jitNwNFFKkq HF68J+ttwfvPUoltI/ssLCrrNfzh0Vc3KkNglmRVDXMq0FIxfKTFQPIF7/IRiuPr4yN0 pvApyhXJ7x0ZYJ7q58dgcUuiQ94qs6KsZvGUZghtEw1bXY4MDBAipszt7Ww+TEEm8s3V f+aQ== 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=Ff3j5au/gpQ72wWKY1ty9HHyftxGy5cfKV/c2Zaa72A=; b=Uty1ZZfTtR7E2dPiAm+aRDYgGvLR38PnB8nVTTfQS/fXhxGCayb23YMCpHae2jIS4l XD3FR312P3XVfpCyPLYEQyMKtYfuLdeyicYQcJDcDLltHERGwEgXnr9UDnJVkKSwLiUm EcqQGAHm5Qgp3q8KiK5Q2J+Cz/TTrrHIfKdfW7oLO7joqrv5QOqV3ITmlifVbetprBLd RETmlqZC3WPNn+RGevxy+8WUTJ22mbEkpQfLrVjDc7ZPS2QiHpIe7nmQ0oXBAlZBosdT rQZrDsLsuskvxf8PT3Tv2Eg627tg/y9YiVoP+n8luqsKzwfYXOoWPGIazGuyRX8BSlNZ 3tPQ== X-Gm-Message-State: ANoB5pmQtW3SEibmKku71fkQHV3H/BjC+QleIRpphx/XWQGiviVNHWTh hSJYxRH/AH1+jrJ+UZCAb3o= X-Received: by 2002:a05:600c:384e:b0:3cf:ae53:b1e0 with SMTP id s14-20020a05600c384e00b003cfae53b1e0mr28393402wmr.9.1671302887211; Sat, 17 Dec 2022 10:48:07 -0800 (PST) Received: from localhost.localdomain (host-79-17-30-229.retail.telecomitalia.it. [79.17.30.229]) by smtp.gmail.com with ESMTPSA id 8-20020a05600c020800b003b4935f04a4sm7726062wmi.5.2022.12.17.10.48.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 17 Dec 2022 10:48:06 -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 v3 3/3] fs/ufs: Replace kmap() with kmap_local_page() Date: Sat, 17 Dec 2022 19:47:49 +0100 Message-Id: <20221217184749.968-4-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20221217184749.968-1-fmdefrancesco@gmail.com> References: <20221217184749.968-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?1752488600138726126?= X-GMAIL-MSGID: =?utf-8?q?1752488600138726126?= 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 | 75 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 9fa86614d2d1..a9dd5023b604 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,23 +184,32 @@ 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 **p) { + char *kaddr; + struct address_space *mapping = dir->i_mapping; struct page *page = read_mapping_page(mapping, n, NULL); if (!IS_ERR(page)) { - kmap(page); + kaddr = kmap_local_page(page); if (unlikely(!PageChecked(page))) { - if (!ufs_check_page(page)) + if (!ufs_check_page(page, kaddr)) goto fail; } *p = page; - return page_address(page); + return kaddr; } return ERR_CAST(page); fail: - ufs_put_page(page); + ufs_put_page(page, kaddr); return ERR_PTR(-EIO); } @@ -227,6 +235,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); @@ -238,12 +253,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. * - * 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. + * On Success ufs_put_page() should be called on *res_page. + * + * 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) @@ -282,7 +300,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; @@ -360,7 +378,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; @@ -390,7 +408,7 @@ 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 err; out_unlock: unlock_page(page); @@ -468,13 +486,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; } @@ -485,10 +503,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; @@ -527,7 +545,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; } @@ -551,8 +569,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; @@ -569,7 +586,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: @@ -585,9 +602,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); @@ -620,12 +637,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; }