From patchwork Mon Dec 12 23:19:04 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: 32557 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp2523076wrr; Mon, 12 Dec 2022 15:24:46 -0800 (PST) X-Google-Smtp-Source: AA0mqf7tSqOJHdBrWP7QU3pzfeIY8lkAqThNgc8vJwpHPRGzUMtue6u/y3pHtIyjmc7U45JgZUe4 X-Received: by 2002:a05:6a20:a028:b0:9d:efbe:52b2 with SMTP id p40-20020a056a20a02800b0009defbe52b2mr27030166pzj.34.1670887486370; Mon, 12 Dec 2022 15:24:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670887486; cv=none; d=google.com; s=arc-20160816; b=vq4890k+30imG5RNXMdYbcF6t6BIFYv2ED2yqxmMheLYZzyHshV8c0EbYKC6zY4clB SxRjWSPevD7j7Kj6sTkcmAN2247JMXqNS2yyJVbE1mUmoz/aXm10fFKgZebiIRffHWTa XACu3oUt82tTVaU928VEcuE1qmfWmmAlQYvXH481sPFRnM2U63+2iwFYqQypZM6K2ik4 MoydmZlXfDMg8g5c04uvkzsMrCPQsWUIuaFjscCsMMWmcQEUeZgH/qoKVixrzK9982Fe jNPtaNvHgTD+to9PttBijCH8fa20FQzjyVXBA9/Ae7aj6z40sMdg6/uwYAL3FZeaedOc tyYQ== 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=duG2aQ9GbASYCtwUOyqucxNKElZkHkWooBaN8yuz0NE8QkM0WTMjdBzGGHIwEMNOWB ++Ms+7trI2ZV2eqIyAoI+plix4UMtKAxr/C8IrnvJZYdVnwLXuDGSk2Mszdt62/XCE1l l0O03GoLtShjDtUxmGWsKLH2gxuh8bgZNzrKzxahPU0a/1qO0Gc63eagzLWzVqwvJRvb Hbow3YGR0LUiKjvSwmKDIe4nOYQ3LgfockQMx8hAlD9lRJfnc7RQpLQZc41+ZH20MSzP rfugn5oPVXBXT8T90Vg/bKuVDfP3daWwUzH6uT5ygkMoubm+ZQV5cSk7VxiLs2iybt+4 Eq0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=cUahQ40R; 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 l17-20020a656811000000b0046f9f498732si10635303pgt.303.2022.12.12.15.24.33; Mon, 12 Dec 2022 15:24:46 -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=cUahQ40R; 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 S233799AbiLLXTZ (ORCPT + 99 others); Mon, 12 Dec 2022 18:19:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39360 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233721AbiLLXTR (ORCPT ); Mon, 12 Dec 2022 18:19:17 -0500 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1AA6A1C427 for ; Mon, 12 Dec 2022 15:19:16 -0800 (PST) Received: by mail-wr1-x434.google.com with SMTP id bx10so13950058wrb.0 for ; Mon, 12 Dec 2022 15:19:16 -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=cUahQ40RcUDkGUzRGkxzHyHQU7mw0Dw/6lFS2ZdFZshj40n6//A1f7WpfMrYcEg8io qsVU3XNft8MalTR85qKf178Mn8jLwJATYgo3PfF4ir4BX5DLEpBsG1XwvpNsgZj3KW8B 8zRTZLdvyYWmqNgOjqXfoXhIiG5sO9HSFsOxRur4kl41LxyIJAqG47zTpP/cOtK6KBzK Y2lHkzVBk+E8T7u1sRMQK4YYLd7hfdEfzEl4l1NWdLs8F2MbShL8WrdkyrOHIh6+LLx+ vjXQwKAriwqXC7Sg+PscaDXfAkkqS8w2HsXC6KqMo8OdD67AbR6J3i1+EOo7mqbeJX7f jZCQ== 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=ILFzFmzOI9K/Ra5c0TyEbELTafef5jnSnSrDy3Ox2zx51TgnkbQxfXGpKIJUebJ6lj P+UUpsHko/mlGKpyQy1K4TvotZn1obYYcdeFIvDSXFxY3SV6jBZ7p8p4hP3yAlxdh3q/ 4fgN6NkO7mARW+aKGGdIetEGETdD8ItD4m4KM+BMo+7OplKAv9tfJOd86oEx/ElEO2wN REn9tlXB/Yza4NcDle5TIguP8Lee7ZksPAChPibOdRCfWVLV2J3IXAfHFy/iASXkXiXQ 2U/Tvm2u+2b9LsDicfYUhNzfD9z8cHu4kMvKOR39pnTAiYAlSYfIc0Jpwk1KmO5L/Zrf sDpw== X-Gm-Message-State: ANoB5plIc92gDzB44+6CiSB5uuh3B7PdwR79PYV1I4Xa3ptTkDSI9Src s4JvQTUdrb5qPOM3LygKAtY= X-Received: by 2002:a5d:5a8b:0:b0:250:90fa:3da with SMTP id bp11-20020a5d5a8b000000b0025090fa03damr2318521wrb.29.1670887154645; Mon, 12 Dec 2022 15:19:14 -0800 (PST) Received: from localhost.localdomain (host-79-41-27-125.retail.telecomitalia.it. [79.41.27.125]) by smtp.gmail.com with ESMTPSA id v3-20020a5d6103000000b002423edd7e50sm9964304wrt.32.2022.12.12.15.19.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Dec 2022 15:19:13 -0800 (PST) From: "Fabio M. De Francesco" To: Evgeniy Dushistov , Al Viro , Ira Weiny , linux-kernel@vger.kernel.org Cc: "Fabio M. De Francesco" Subject: [PATCH v2 1/3] fs/ufs: Use the offset_in_page() helper Date: Tue, 13 Dec 2022 00:19:04 +0100 Message-Id: <20221212231906.19424-2-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221212231906.19424-1-fmdefrancesco@gmail.com> References: <20221212231906.19424-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?1752052516796557836?= X-GMAIL-MSGID: =?utf-8?q?1752052516796557836?= 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 Mon Dec 12 23:19:05 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: 32558 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp2525587wrr; Mon, 12 Dec 2022 15:31:43 -0800 (PST) X-Google-Smtp-Source: AA0mqf4v5SIt5XlZtT8aPPExPa9HyXSdhF+QyspraApXc6jcSbn032PSaysx2h6qhsUH/xe+IZug X-Received: by 2002:a17:902:9349:b0:189:b0ff:e318 with SMTP id g9-20020a170902934900b00189b0ffe318mr18174633plp.1.1670887903567; Mon, 12 Dec 2022 15:31:43 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670887903; cv=none; d=google.com; s=arc-20160816; b=OsyyO2GVfe8SmGOrD4Wcd2yIqvFkPan/6G6nJZIlBNpYPUHqRu+1Oik/lppvKqpEkD q14kWMxWPNTKNGH19X5doJec1V0SuTbErCRZbQLYo0ZHIjGF0GML1mEK7vjCrlAYZKI4 i74kINP/M0gU+rNVsSeMlFGHwltN3bjjtKKrFAtb6YeN1e7pg0Clu3l1EEGaawNaj1k/ MnFpfFEFutqakTjCaV9I3JhTDJMkFeZNQYChHbjX2VLjU3flGVUgP4eyQUNYi9lR4KSO hfbVV82MGwxV/XjuxnHGP6O4x94kgP/rBzzuf4efsPnOVaD5SsHmgrqDL+ZhyzVIKvFy mHIg== 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=lG+oyDWBfjBlSXbH84d4Jf+JAXSY+Hr7j0N14fdKo+g=; b=sr0cdrKgwPVp9VO3MkSyE4QQlRfB7q4WC/L7XUEIMh70O/aa/NeVknrERilP60bfj4 FZhPjehFhmBxLxMJmmTRlmsmhrtN298T9l1Iz7x46mV7PnHaiznIPk2+8M+r9axU+Fqt /KmeoTIiB+nry8WePTp+2dKCFVV+ISM0nlkR1xgxRlgIj5GVgWil18EguJlVxarQErwE Nq/NvcNH+afmK+qxGAHFUw69rqcfOKAV7kIG6JiMOazpLY4lpjx/uk2IAUD19r/XEZFW Ejq95V8BTYjyf8HE0mbD6/MXnFHq9+ozK4hz37ZXznLI8xUNPQc2fZ2kAGaqzi7o3Fdk DxeQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=e+MD86YQ; 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 f2-20020a170902ce8200b001897276ce03si12072367plg.489.2022.12.12.15.31.28; Mon, 12 Dec 2022 15:31:43 -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=e+MD86YQ; 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 S233892AbiLLXTa (ORCPT + 99 others); Mon, 12 Dec 2022 18:19:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233883AbiLLXTU (ORCPT ); Mon, 12 Dec 2022 18:19:20 -0500 Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BA3B41C133 for ; Mon, 12 Dec 2022 15:19:17 -0800 (PST) Received: by mail-wr1-x434.google.com with SMTP id h10so13919250wrx.3 for ; Mon, 12 Dec 2022 15:19:17 -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=lG+oyDWBfjBlSXbH84d4Jf+JAXSY+Hr7j0N14fdKo+g=; b=e+MD86YQuM8Lk6UJbsdDPz1d5Rf/6PBFLcmc2eGAVhnQa10tgKt1NE1vCGHLCTzb2n xs/3FOdH5Wh6yueT4DcW7zDssK2ICryJP4/gm4uX6+07vebyimHVuZGXGUublS2Nlzwu 5orTsaL9F2m/c2nj0G25Cbcd4Cw0BJ9XXqtMZ7LxodjNdDaNU7xnqDpbNSm9tUR/M9UK DPTv+BsF1gFLfubj5ihk+xgzuoydbTAqu2GPRieJxw4zZd65lmMGA7/JjgvlncUNmvev TUw+WGeOlXlwa53FYxhlnjpOJYenp4AUSu/a13hIgwv84LtJKJ/OI8hgK8+n/2haOsZL 5j0Q== 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=lG+oyDWBfjBlSXbH84d4Jf+JAXSY+Hr7j0N14fdKo+g=; b=N6YpnWXaw2Z1f5rxrXsMuprmiDDZLh/8VHiwCN2dYAHb8Ymwa63LDxVBsnAtpa+Wom 2H7aPi9zaNc6Jvj5XpZBQDfu6DJQDfcjv6E+pzIlCSQbyufCi3YxUb8tJlejLZLLIBbJ 83TsU0nWTnZ55MGtvKiSOr0x2W6XjePecmeMOokHu3GtpIgeQHFyX3jxQV71wKLpdnPY aWAXKJhPfRHkt7YXQB+TLCspozAOX/hTeN5CyFlOTXxA+/S6TeyBzwXhA/p21oiowB/u w5BKPyO7B3jSEYFNyQOVFhkyB5zjyN/iHOOl94CPW90+XEKAPVpcJq9KQYFq98UldQNr Ndgw== X-Gm-Message-State: ANoB5pmgVLHLygNJg8NHWN03Gv8VdlOwyLOxEB776NE+4+MI33RFTAQq 3/UB412eEc81PRXp8c5h8rw= X-Received: by 2002:adf:e44a:0:b0:242:763:34a5 with SMTP id t10-20020adfe44a000000b00242076334a5mr11288838wrm.2.1670887156249; Mon, 12 Dec 2022 15:19:16 -0800 (PST) Received: from localhost.localdomain (host-79-41-27-125.retail.telecomitalia.it. [79.41.27.125]) by smtp.gmail.com with ESMTPSA id v3-20020a5d6103000000b002423edd7e50sm9964304wrt.32.2022.12.12.15.19.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Dec 2022 15:19:15 -0800 (PST) From: "Fabio M. De Francesco" To: Evgeniy Dushistov , Al Viro , Ira Weiny , linux-kernel@vger.kernel.org Cc: "Fabio M. De Francesco" Subject: [PATCH v2 2/3] fs/ufs: Change the signature of ufs_get_page() Date: Tue, 13 Dec 2022 00:19:05 +0100 Message-Id: <20221212231906.19424-3-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221212231906.19424-1-fmdefrancesco@gmail.com> References: <20221212231906.19424-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?1752052954250246180?= X-GMAIL-MSGID: =?utf-8?q?1752052954250246180?= 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 | 59 ++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 34 deletions(-) diff --git a/fs/ufs/dir.c b/fs/ufs/dir.c index 69f78583c9c1..d1cbb48e5d52 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; + return page_address(*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,7 +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); @@ -429,6 +422,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 +433,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 +587,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 Mon Dec 12 23:19:06 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: 32559 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp2525860wrr; Mon, 12 Dec 2022 15:32:19 -0800 (PST) X-Google-Smtp-Source: AA0mqf4OoBYj2kQfyyYUR5cCHcIPPsLEZ8MXPP5DMmEiJPpg9prdjc7QTk0ypQrjI5mc0RPUZZpJ X-Received: by 2002:a05:6a20:d903:b0:9d:efbf:785e with SMTP id jd3-20020a056a20d90300b0009defbf785emr21395693pzb.19.1670887939519; Mon, 12 Dec 2022 15:32:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1670887939; cv=none; d=google.com; s=arc-20160816; b=yYFX0lR9ZoGzuWqqLud1inXgKR8p2b65PE1PpNDBvQ/VoFCNaG5SAYIyRFImMWFGlh wzJ0eHcpuuesdHmgOi2Igwm7EnkdGCFYXnA6ELGQ0OBDx7GB1VNILJ1yK/P2+5pIa7Re /mzK9+udcUb631iAUhKk5t9VtKA5i4NhjDOFhD5ly5jQerLaCJIDgr3oDNxGYjqpjte4 /ImHiHOk6jwWoZE33oJXLat6LFE/L76IwJjjH1Gludz4tBo39k+xT7a04/gobPm75hEm NAmYTxNHRR10+/Va4kTe0J5EZtz5RZBJwLWadis8wfWFVExJGxc+eJc/oDHkcAh5krzp vGOA== 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=bvkJAcgJd+O1FIUzh+r0Wnbdw1Lb08jZRkvuJ8XN8TY=; b=d/POoNMsAHyCllsajzhZdb5cLZFBJ8jDEr2eK+xm44RIqCBVr8v3c0I8gfv30DBM64 TKRCtKMoJn+TtSNkCLBwsYYDffUxMsA4B2P3/xH8sl8qb6sa7ih+4ecsTr7qgCtHOrz/ JRTGVmRoZmdo8+JAqGkMXJoLi6hkC2H755nwocBcN71HgQUiCTleQW6/s2WsOROGnN2C npxNtdZZ7topW16VtTOwugGG17kcOrL76PVqcnha1VO5SuwquzcES+GYK+WO1G4HJu6a ll6Y7pCM+8tjcjsMUYl0+Xs8hg35YovuXLb84ex94+6c8/6JcWeQ8a3nV89teUiHMvvF N/Xw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=JGnYa8+7; 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 8-20020a630308000000b00477d099bfadsi10741779pgd.129.2022.12.12.15.32.05; Mon, 12 Dec 2022 15:32:19 -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=JGnYa8+7; 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 S233770AbiLLXTe (ORCPT + 99 others); Mon, 12 Dec 2022 18:19:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233935AbiLLXTV (ORCPT ); Mon, 12 Dec 2022 18:19:21 -0500 Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7D00E1C415 for ; Mon, 12 Dec 2022 15:19:19 -0800 (PST) Received: by mail-wr1-x430.google.com with SMTP id h7so13918660wrs.6 for ; Mon, 12 Dec 2022 15:19:19 -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=bvkJAcgJd+O1FIUzh+r0Wnbdw1Lb08jZRkvuJ8XN8TY=; b=JGnYa8+7d/o82h3CkSTwWBNT2WOmN5Bse7D6Nl0iJvbPtBOTZ9DnMYdlYnv8TgmH1S MbkRKhHcE3mV6Nu8KQNtd11TPdgKJARXkE4+wXaEnRqjcljlY/zlGD8lxgxSQrHjrMye WPpN7PS+TQvS8Xq0XGe504hZ/UAPIgSGB9M567NN5jRHiyCoUd0kHisZD3hDAydYCXhJ rXnicHOKaR38fl41vXXK4tQVeA90QIGC9k4QAhBcPvmkj3568B/VB+9BVAfOifTXkkzx 28pfXdi6P3POo6y8AQF5UdeIIBowuSQwJyWEK3qUKmT+ZJmXM+p5kUqLwsto8jIuzj0x YB7g== 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=bvkJAcgJd+O1FIUzh+r0Wnbdw1Lb08jZRkvuJ8XN8TY=; b=aLsqeNQqNOTYqtRXGeZh0pIeK6ARDek+6hUg3hILWoNXHUaKaBKvq1+D58MdTmGWU5 1eLpYi7HsjjH6p0U+Jf7XfJ3VSlh/9O6OSNlB7D483QJmbzVIrDfoZOJqHT97nOArO7c U5wb5VV7wbTmInrPrOqHaqMLa2vwxWtym5VhPlSG10i3dIbseepl5ZaKv24WZqVY30r1 o3+537Je4Blcd3rjEhSAoQXBMj7877B2dEQMaRAX16Wl7Cs2jJow+DzrwwS0CtWEPEah djNwxG81uip/7EQwrYEbJ/776n5+kDN3dFkldHx+o4flo9pO2822E+eHW84AtTGlLz1i dhqA== X-Gm-Message-State: ANoB5plJkb2ANG+fXSHtKrlAeRnjAWuwWTaHfUS5/QJPLIFj6G0paGgp FIHQg+QG/BRxPK4lh8hobpk= X-Received: by 2002:a5d:44c7:0:b0:242:187f:ed44 with SMTP id z7-20020a5d44c7000000b00242187fed44mr11112478wrr.68.1670887157912; Mon, 12 Dec 2022 15:19:17 -0800 (PST) Received: from localhost.localdomain (host-79-41-27-125.retail.telecomitalia.it. [79.41.27.125]) by smtp.gmail.com with ESMTPSA id v3-20020a5d6103000000b002423edd7e50sm9964304wrt.32.2022.12.12.15.19.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 Dec 2022 15:19:17 -0800 (PST) From: "Fabio M. De Francesco" To: Evgeniy Dushistov , Al Viro , Ira Weiny , linux-kernel@vger.kernel.org Cc: "Fabio M. De Francesco" Subject: [PATCH v2 3/3] fs/ufs: Replace kmap() with kmap_local_page() Date: Tue, 13 Dec 2022 00:19:06 +0100 Message-Id: <20221212231906.19424-4-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221212231906.19424-1-fmdefrancesco@gmail.com> References: <20221212231906.19424-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?1752052991704375976?= X-GMAIL-MSGID: =?utf-8?q?1752052991704375976?= 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 d1cbb48e5d52..f83071a74bef 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); + kaddr = kmap_local_page(*page); if (unlikely(!PageChecked(*page))) { - if (!ufs_check_page(*page)) + if (!ufs_check_page(*page, kaddr)) goto fail; } } - return page_address(*page); + return kaddr; 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. * - * 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) @@ -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,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); @@ -466,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; } @@ -483,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; @@ -525,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; } @@ -549,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; @@ -567,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: @@ -583,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); @@ -618,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; }