From patchwork Mon Jan 9 17:06:36 2023 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: 13093878 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 16F8BC54EBD for ; Mon, 9 Jan 2023 17:08:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234229AbjAIRIK (ORCPT ); Mon, 9 Jan 2023 12:08:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33748 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237154AbjAIRHj (ORCPT ); Mon, 9 Jan 2023 12:07:39 -0500 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D2F2C3FA32; Mon, 9 Jan 2023 09:06:47 -0800 (PST) Received: by mail-wr1-x435.google.com with SMTP id m7so8875972wrn.10; Mon, 09 Jan 2023 09:06:47 -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=gCW9hGwXYkgWMlftGJTpxYD0tpe8j+WfiIQir4l86co=; b=H9k0NCEKDeLmIFuil7aYpf60LDUgsnUVBOLLoaNJ21ah+wWWV2hFJVeakPLokoZ5Yx m6LIOG6Resh3isUjn1ToryFtTe7VB08C5+rTVU9Fax2p1a0PsEEbI5VX74JzWouTcurK TdrrNyMOyZp7VRoIU14Lv3rZvpvceTJrs+Zi3EMhSnnC+rPBdfVA2DnrnnEyhrKJcUze w1Fbz6A5u+xzSuop9r2Jt2DfJwSX/2fRurS7PTghwuFY1TW4SsvUUVuHII3B4nhR/Ncp BD4dRUjleM8hEQ3FnPSwbrNhaoGUju0gM7I/fYtG6VGPC/YlmLpLnmqH3r0rzF0k6cN4 ibTw== 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=gCW9hGwXYkgWMlftGJTpxYD0tpe8j+WfiIQir4l86co=; b=Lu9RZ/2KX/9m8UhmROyaM0OmTwSQuMXdCl3sEXa4VQNDYe3vvFqzn/0IOg56+R21Uh MFI6tmvkOjFi1s+i6miJxzX3YxTzEyUbxLl2QGaOWXV21/9epcGNCIYPB5wNmrxalklJ Z/niwx5pM4ygb4DKwg94X8tp125tt3U1Qr+FpdfuzYdJSeALS38GMQG3em/pXkKULXy1 rBWl7omk7cvadLWmeMDab7jp0Y+FbQ62ITMpQkzHMOGcpQgsdrqK5DIugDy9PW58uZuR eptqyWc00j8Eo+fSktcqQwjrq0p/xsCDTjmnl2AZJud36W4XpBo5TvhGhWTP72S0QEf+ eRjw== X-Gm-Message-State: AFqh2kpoyuC/ANg94GsPGP1FvbUSRSsyG+ulTsDeLMWoZVlQU+o+TTxa nyCDocCk2WTKM6LXSCMXRZvTdUG9M+c= X-Google-Smtp-Source: AMrXdXu5BSPvAB5e/ZwoDfluSG7dU+KPKdwuQwSPOAO9sr2BLgggyL5bW6C2rusTF3Fwc7mp2vjhOQ== X-Received: by 2002:a5d:4402:0:b0:2bb:f46f:c136 with SMTP id z2-20020a5d4402000000b002bbf46fc136mr3283198wrq.23.1673284006435; Mon, 09 Jan 2023 09:06:46 -0800 (PST) Received: from localhost.localdomain (host-79-13-98-249.retail.telecomitalia.it. [79.13.98.249]) by smtp.gmail.com with ESMTPSA id n10-20020a5d6b8a000000b002425787c5easm8954527wrx.96.2023.01.09.09.06.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Jan 2023 09:06:45 -0800 (PST) From: "Fabio M. De Francesco" To: Christoph Hellwig , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Al Viro , Ira Weiny Cc: "Fabio M. De Francesco" Subject: [PATCH v2 1/4] fs/sysv: Use the offset_in_page() helper Date: Mon, 9 Jan 2023 18:06:36 +0100 Message-Id: <20230109170639.19757-2-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230109170639.19757-1-fmdefrancesco@gmail.com> References: <20230109170639.19757-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org 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 --- No changes from v1. fs/sysv/dir.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index 88e38cd8f5c9..685379bc9d64 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -206,8 +206,7 @@ int sysv_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); lock_page(page); err = sysv_prepare_chunk(page, pos, SYSV_DIRSIZE); if (err) @@ -230,8 +229,7 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode) int sysv_delete_entry(struct sysv_dir_entry *de, struct page *page) { struct inode *inode = page->mapping->host; - char *kaddr = (char*)page_address(page); - loff_t pos = page_offset(page) + (char *)de - kaddr; + loff_t pos = page_offset(page) + offset_in_page(de); int err; lock_page(page); @@ -328,8 +326,7 @@ void sysv_set_link(struct sysv_dir_entry *de, struct page *page, struct inode *inode) { struct inode *dir = page->mapping->host; - loff_t pos = page_offset(page) + - (char *)de-(char*)page_address(page); + loff_t pos = page_offset(page) + offset_in_page(de); int err; lock_page(page); From patchwork Mon Jan 9 17:06:37 2023 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: 13093880 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12562C5479D for ; Mon, 9 Jan 2023 17:08:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237154AbjAIRIP (ORCPT ); Mon, 9 Jan 2023 12:08:15 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33796 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237187AbjAIRHl (ORCPT ); Mon, 9 Jan 2023 12:07:41 -0500 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B0C88395D2; Mon, 9 Jan 2023 09:06:49 -0800 (PST) Received: by mail-wr1-x42a.google.com with SMTP id m7so8876036wrn.10; Mon, 09 Jan 2023 09:06:49 -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=wPkTBe5nXBDQeS7sbYnJgmbxzogLVWQKfGg5it5w+j0=; b=Nya5FjSn4JCeFq2y0CmErxCxp7pYyK5bShmb/W4CYDzyNPPor57EiUDicwRfHL1bMW c0o9I+UQeayca1x467qnNOCf3rYaPQiasR1B+cKTt0sWFeD21XkvUHDwAxleG/daZxCn FS/z+tzzl55TnWhUEJjgCVvykcif5Usnehjbp1yq8LklJJBkPFGANUDZ5TDqNHCNXUz5 X1M49jI2sbMl6TfNJ4Yod33ZxBbqmkGOv6IXPscdFLNcrE+/yxoxF1k0n+zvI1eEKre3 O50lCk2QYSPzGTvkSHJ045ppjFJ0oaeSmHVG7m/Gs1DBLYKs7FPetnmqBS0vPH37q/gc Fg8w== 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=wPkTBe5nXBDQeS7sbYnJgmbxzogLVWQKfGg5it5w+j0=; b=1gVmTeA6GnrPOqzOHEf4JHz9NgNPIb3tSGdYrVdrOW/ZhcVMv5wTRqPEfcTNPIzRD6 nCOHZt86g76k5cPguiNGyyNIj2bCKRrWShv1cclpCc05uqzB47LUe7bN3OTctqtXwJwF 6WX6hwHsUWXgb5Ck1g+RBtnK1Q8QDuROVyatxNYD7W8q7x9Px6YX4P0KOPAE2cIE+X/J ScBF3VD16fynlCZ790dll3I1CWgwvBKMxrv9X02GUL5yxbDPrfl21cK4e6W9pW6gSSVR fbHawbucxUIvk6Hz4Bc1KTLf3HDuqgckcn532d0cNBOdz/B99botEfBb6p8mY33ORq1b 3KQw== X-Gm-Message-State: AFqh2kqQyuYZi0An5Mims0eO2U0IBIwsd8ky0a7azjp8fArqvMxK9Nd6 ZnYVJDuaKWVuHKTzloWeaOk= X-Google-Smtp-Source: AMrXdXsuYL8GEoCzIHG9q3L6sLS/1ci5pp6PdIM383SbhlMinw2ASPReqF5L41QsgT1W9Rube+5GjA== X-Received: by 2002:a5d:6f0e:0:b0:2ba:73e3:f4f2 with SMTP id ay14-20020a5d6f0e000000b002ba73e3f4f2mr10072993wrb.2.1673284007856; Mon, 09 Jan 2023 09:06:47 -0800 (PST) Received: from localhost.localdomain (host-79-13-98-249.retail.telecomitalia.it. [79.13.98.249]) by smtp.gmail.com with ESMTPSA id n10-20020a5d6b8a000000b002425787c5easm8954527wrx.96.2023.01.09.09.06.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Jan 2023 09:06:47 -0800 (PST) From: "Fabio M. De Francesco" To: Christoph Hellwig , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Al Viro , Ira Weiny Cc: "Fabio M. De Francesco" , Dan Carpenter Subject: [PATCH v2 2/4] fs/sysv: Change the signature of dir_get_page() Date: Mon, 9 Jan 2023 18:06:37 +0100 Message-Id: <20230109170639.19757-3-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230109170639.19757-1-fmdefrancesco@gmail.com> References: <20230109170639.19757-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org 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 to the new signature. Cc: Ira Weiny Suggested-by: Al Viro Signed-off-by: Fabio M. De Francesco --- Delete an unnecessary assignment from v1 (thanks to Dan). Reported-by: Dan Carpenter fs/sysv/dir.c | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index 685379bc9d64..f953e6b9251e 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -52,13 +52,15 @@ static int dir_commit_chunk(struct page *page, loff_t pos, unsigned len) return err; } -static struct page * dir_get_page(struct inode *dir, unsigned long n) +static void *dir_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); - if (!IS_ERR(page)) - kmap(page); - return page; + if (IS_ERR(page)) + return ERR_CAST(page); + kmap(page); + *p = page; + return page_address(page); } static int sysv_readdir(struct file *file, struct dir_context *ctx) @@ -80,11 +82,11 @@ static int sysv_readdir(struct file *file, struct dir_context *ctx) for ( ; n < npages; n++, offset = 0) { char *kaddr, *limit; struct sysv_dir_entry *de; - struct page *page = dir_get_page(inode, n); + struct page *page; - if (IS_ERR(page)) + kaddr = dir_get_page(inode, n, &page); + if (IS_ERR(kaddr)) continue; - kaddr = (char *)page_address(page); de = (struct sysv_dir_entry *)(kaddr+offset); limit = kaddr + PAGE_SIZE - SYSV_DIRSIZE; for ( ;(char*)de <= limit; de++, ctx->pos += sizeof(*de)) { @@ -142,11 +144,10 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_ n = start; do { - char *kaddr; - page = dir_get_page(dir, n); - if (!IS_ERR(page)) { - kaddr = (char*)page_address(page); - de = (struct sysv_dir_entry *) kaddr; + char *kaddr = dir_get_page(dir, n, &page); + + if (!IS_ERR(kaddr)) { + de = (struct sysv_dir_entry *)kaddr; kaddr += PAGE_SIZE - SYSV_DIRSIZE; for ( ; (char *) de <= kaddr ; de++) { if (!de->inode) @@ -185,11 +186,9 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode) /* We take care of directory expansion in the same loop */ for (n = 0; n <= npages; n++) { - page = dir_get_page(dir, n); - err = PTR_ERR(page); - if (IS_ERR(page)) - goto out; - kaddr = (char*)page_address(page); + kaddr = dir_get_page(dir, n, &page); + if (IS_ERR(kaddr)) + return PTR_ERR(kaddr); de = (struct sysv_dir_entry *)kaddr; kaddr += PAGE_SIZE - SYSV_DIRSIZE; while ((char *)de <= kaddr) { @@ -219,7 +218,6 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode) mark_inode_dirty(dir); out_page: dir_put_page(page); -out: return err; out_unlock: unlock_page(page); @@ -288,12 +286,11 @@ int sysv_empty_dir(struct inode * inode) for (i = 0; i < npages; i++) { char *kaddr; struct sysv_dir_entry * de; - page = dir_get_page(inode, i); - if (IS_ERR(page)) + kaddr = dir_get_page(inode, i, &page); + if (IS_ERR(kaddr)) continue; - kaddr = (char *)page_address(page); de = (struct sysv_dir_entry *)kaddr; kaddr += PAGE_SIZE-SYSV_DIRSIZE; @@ -339,16 +336,16 @@ void sysv_set_link(struct sysv_dir_entry *de, struct page *page, mark_inode_dirty(dir); } -struct sysv_dir_entry * sysv_dotdot (struct inode *dir, struct page **p) +struct sysv_dir_entry *sysv_dotdot(struct inode *dir, struct page **p) { - struct page *page = dir_get_page(dir, 0); - struct sysv_dir_entry *de = NULL; + struct page *page = NULL; + struct sysv_dir_entry *de = dir_get_page(dir, 0, &page); - if (!IS_ERR(page)) { - de = (struct sysv_dir_entry*) page_address(page) + 1; + if (!IS_ERR(de)) { *p = page; + return (struct sysv_dir_entry *)page_address(page) + 1; } - return de; + return NULL; } ino_t sysv_inode_by_name(struct dentry *dentry) From patchwork Mon Jan 9 17:06:38 2023 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: 13093881 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D6D42C5479D for ; Mon, 9 Jan 2023 17:09:13 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237238AbjAIRI2 (ORCPT ); Mon, 9 Jan 2023 12:08:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237305AbjAIRHn (ORCPT ); Mon, 9 Jan 2023 12:07:43 -0500 Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C80863D9C6; Mon, 9 Jan 2023 09:06:50 -0800 (PST) Received: by mail-wr1-x432.google.com with SMTP id bs20so8890887wrb.3; Mon, 09 Jan 2023 09:06:50 -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=EUTGNtTWUZq9Xoje3nsOop87o5Mba7F27fOFrJfe2eQ=; b=HgfVbMkcCLZZu6XmhqgrMXw7DD0yrq+R391qfVS+t+ETVWXmmZ9iLYRmGdMsbq99Ah p3viZaylRYsq8TKpGrgb23TS6CW8xAjn/h81Fouvbv5WtFs8g60SnpB2ZHXyPSJVLn89 wGRFrru0Oes6WH3vK3e5SjbQ/B5tbvFt479w0TjtcP1NPMngBoH+uAQO57rt66Mh5qVr FN8oMZNj//gUfyoBhvQQ+pMnNDMf90gGGQ0io6FCakFsCsZ3u6fDStV5BdQyWEKy8kCH 9xEJX9sUWyTceOd672p3F8aEL97iVSmqL7DVluCwpQkxAe2kS9yX76FhCx7vmr2sgIxx NoVQ== 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=EUTGNtTWUZq9Xoje3nsOop87o5Mba7F27fOFrJfe2eQ=; b=kikS1tit/Flo0ZLLb9+hyNuSHLzI62dRwzAUwcxlBf7SDcAU2OVRPi3XnX5RF8r84+ Ptw/yxj+SByzpS75X2ZUxNtJVuZIr5E5Fgu6WefT7zxJvwNNPmGEoFwMAf04c/rB6nEw tVB7cAo9IFQ5FoyDnUjaCaZMRf8lP99XPtc/Iwkb85fl2/Xe6x0JFo/itx82KBRdQ+B2 RP1tYCuM2F+qTyMYTel8dVHr0Q2E0J++CA6Ukl2YduXF5NhDkBrv8tku7lp2YFwqS+9a 83IqtQE3Db+up/UvCS/16ytOT4YGD+U+7LVedkMrKAvT/Lqzcpo7u8P58u35TNLaANIY s3AA== X-Gm-Message-State: AFqh2koyVtqhn1rMSxEM4fwkHziYMg6PDV0iVvfQwwqTouUyw6hHKJ4g rJ5tkwDxtbtHHYTmtemJxnw= X-Google-Smtp-Source: AMrXdXsUUu0vIw1r83K+4bQJ8Gxca23zAEBovS/WFacuZRUWtWBEIgPdXpM1DTACrYshvgQ/ilpOBA== X-Received: by 2002:adf:ed02:0:b0:2bc:841d:b831 with SMTP id a2-20020adfed02000000b002bc841db831mr490804wro.55.1673284009240; Mon, 09 Jan 2023 09:06:49 -0800 (PST) Received: from localhost.localdomain (host-79-13-98-249.retail.telecomitalia.it. [79.13.98.249]) by smtp.gmail.com with ESMTPSA id n10-20020a5d6b8a000000b002425787c5easm8954527wrx.96.2023.01.09.09.06.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Jan 2023 09:06:48 -0800 (PST) From: "Fabio M. De Francesco" To: Christoph Hellwig , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Al Viro , Ira Weiny Cc: "Fabio M. De Francesco" Subject: [PATCH v2 3/4] fs/sysv: Use dir_put_page() in sysv_rename() Date: Mon, 9 Jan 2023 18:06:38 +0100 Message-Id: <20230109170639.19757-4-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230109170639.19757-1-fmdefrancesco@gmail.com> References: <20230109170639.19757-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org Use the dir_put_page() helper in sysv_rename() instead of open-coding two kunmap() + put_page(). Cc: Al Viro Suggested-by: Ira Weiny Signed-off-by: Fabio M. De Francesco --- No changes from v1. fs/sysv/dir.c | 2 +- fs/sysv/namei.c | 9 +++------ fs/sysv/sysv.h | 1 + 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index f953e6b9251e..ee38dc5a3010 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -28,7 +28,7 @@ const struct file_operations sysv_dir_operations = { .fsync = generic_file_fsync, }; -static inline void dir_put_page(struct page *page) +inline void dir_put_page(struct page *page) { kunmap(page); put_page(page); diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index b2e6abc06a2d..981c1d76f342 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c @@ -250,13 +250,10 @@ static int sysv_rename(struct user_namespace *mnt_userns, struct inode *old_dir, return 0; out_dir: - if (dir_de) { - kunmap(dir_page); - put_page(dir_page); - } + if (dir_de) + dir_put_page(dir_page); out_old: - kunmap(old_page); - put_page(old_page); + dir_put_page(old_page); out: return err; } diff --git a/fs/sysv/sysv.h b/fs/sysv/sysv.h index 99ddf033da4f..b250ac1dd348 100644 --- a/fs/sysv/sysv.h +++ b/fs/sysv/sysv.h @@ -148,6 +148,7 @@ extern void sysv_destroy_icache(void); /* dir.c */ +extern void dir_put_page(struct page *page); extern struct sysv_dir_entry *sysv_find_entry(struct dentry *, struct page **); extern int sysv_add_link(struct dentry *, struct inode *); extern int sysv_delete_entry(struct sysv_dir_entry *, struct page *); From patchwork Mon Jan 9 17:06:39 2023 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: 13093882 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 045BEC54EBD for ; Mon, 9 Jan 2023 17:09:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237388AbjAIRIa (ORCPT ); Mon, 9 Jan 2023 12:08:30 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237311AbjAIRHv (ORCPT ); Mon, 9 Jan 2023 12:07:51 -0500 Received: from mail-wr1-x435.google.com (mail-wr1-x435.google.com [IPv6:2a00:1450:4864:20::435]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 26D1C3DBD6; Mon, 9 Jan 2023 09:06:52 -0800 (PST) Received: by mail-wr1-x435.google.com with SMTP id s9so8878880wru.13; Mon, 09 Jan 2023 09:06:52 -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=xVOWfeV8XAusRFbQDF4pruLZCgXugYaujYQ4ITxrwOI=; b=FOFDBc/QbOf8IDAwa/61C8INGWFoZsWMgIZ4VM4s9/2EOINa8XCucYv0wYr3mzAr22 Cip/gMElBCOYNtNXgWiR4SApnC8S1c7SU2o15DBqrHzPFpjwDsgZ6aiRBIq+KPIualHu 8JOV2zQ+MdCWMdrLI72wiXYsHJcl7w6OqMFJf+BmrU1m4jfkRPXtHE8uIQQSmi6ZHMGj bran+mSNEGO48QOqesVf+tghGONGJQFzYCmIjc9OHiMsUsUl+nRB+J8Uz1pK5k3oM3bX SfUPnRnRXYKxIOqdYvcYUOTuvnCHxwCiE/1zWp0TribW22wV+onqeC9W0uNc/7cl/a+C v3hA== 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=xVOWfeV8XAusRFbQDF4pruLZCgXugYaujYQ4ITxrwOI=; b=gU0QKEbxH6bFn+hespU0gyJVNbrCtuNHDQQWAhlAn8qU4JQiZLhqlV3oC2j2QMG9jv SqXSmr6p7N/SGmNjwUotei42zPsa86GLAP/uNC5JzNVfje2kA+dKWsr9MNJwVmz8Zc3d unX6oCPUTTYL//WCrWpJ4rY1Mi1ALzj0qly3kgiiWDRtyZHuvSCE+rjfty/mEL6j4pkA cmnGixFeJG2DptgRi95z6zv8JF2WLGaMbnHJuF7R5VFY1mF2vTuZaawDDoKq9wYZtU3y Qfh3yhUbCYmlolBWR68VXAdLrpPc+Q2IbIf0nbyLDwiDHknqKaLEeLhxv5EGm6Dz7129 K0aA== X-Gm-Message-State: AFqh2koT93FOyHJ6QaWRtDRE/LF/Zogpx+Z3S9UefvgCz8YysorzU3kV JKHhAL8qIeDc/Y4dC61kbP0= X-Google-Smtp-Source: AMrXdXu1ZHtF51FzYNnMwsAyGvAAgZwv5KrXd/dc1uNsTPT+oAE6jiTLfj7mQAPAkSSkUD9RudbHtA== X-Received: by 2002:a05:6000:910:b0:242:733b:af28 with SMTP id bz16-20020a056000091000b00242733baf28mr55981006wrb.5.1673284010639; Mon, 09 Jan 2023 09:06:50 -0800 (PST) Received: from localhost.localdomain (host-79-13-98-249.retail.telecomitalia.it. [79.13.98.249]) by smtp.gmail.com with ESMTPSA id n10-20020a5d6b8a000000b002425787c5easm8954527wrx.96.2023.01.09.09.06.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Jan 2023 09:06:50 -0800 (PST) From: "Fabio M. De Francesco" To: Christoph Hellwig , linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Al Viro , Ira Weiny Cc: "Fabio M. De Francesco" Subject: [PATCH v2 4/4] fs/sysv: Replace kmap() with kmap_local_page() Date: Mon, 9 Jan 2023 18:06:39 +0100 Message-Id: <20230109170639.19757-5-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230109170639.19757-1-fmdefrancesco@gmail.com> References: <20230109170639.19757-1-fmdefrancesco@gmail.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org 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 kmap_local_page() would not break the strict rules of local mappings (i.e., the thread locality and the stack based nesting), this function can be easily and safely replace the deprecated API. Therefore, replace kmap() with kmap_local_page() in fs/sysv. kunmap_local() requires the mapping address, so return that address from dir_get_page() to be used in dir_put_page(). Suggested-by: Al Viro Suggested-by: Ira Weiny Signed-off-by: Fabio M. De Francesco --- No changes from v1. fs/sysv/dir.c | 64 +++++++++++++++++++++++++++++++++---------------- fs/sysv/namei.c | 4 ++-- fs/sysv/sysv.h | 2 +- 3 files changed, 46 insertions(+), 24 deletions(-) diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index ee38dc5a3010..db5c483a9b68 100644 --- a/fs/sysv/dir.c +++ b/fs/sysv/dir.c @@ -28,9 +28,9 @@ const struct file_operations sysv_dir_operations = { .fsync = generic_file_fsync, }; -inline void dir_put_page(struct page *page) +inline void dir_put_page(struct page *page, void *page_addr) { - kunmap(page); + kunmap_local(page_addr); put_page(page); } @@ -52,15 +52,21 @@ static int dir_commit_chunk(struct page *page, loff_t pos, unsigned len) return err; } +/* + * Calls to dir_get_page()/dir_put_page() must be nested according to the + * rules documented in mm/highmem.rst. + * + * NOTE: sysv_find_entry() and sysv_dotdot() act as calls to dir_get_page() + * and must be treated accordingly for nesting purposes. + */ static void *dir_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); if (IS_ERR(page)) return ERR_CAST(page); - kmap(page); *p = page; - return page_address(page); + return kmap_local_page(page); } static int sysv_readdir(struct file *file, struct dir_context *ctx) @@ -98,11 +104,11 @@ static int sysv_readdir(struct file *file, struct dir_context *ctx) if (!dir_emit(ctx, name, strnlen(name,SYSV_NAMELEN), fs16_to_cpu(SYSV_SB(sb), de->inode), DT_UNKNOWN)) { - dir_put_page(page); + dir_put_page(page, kaddr); return 0; } } - dir_put_page(page); + dir_put_page(page, kaddr); } return 0; } @@ -125,6 +131,11 @@ static inline int namecompare(int len, int maxlen, * returns the cache buffer in which the entry was found, and the entry * itself (as a parameter - res_dir). It does NOT read the inode of the * entry - you'll have to do that yourself if you want to. + * + * On Success dir_put_page() should be called on *res_page. + * + * sysv_find_entry() acts as a call to dir_get_page() and must be treated + * accordingly for nesting purposes. */ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_page) { @@ -156,7 +167,7 @@ struct sysv_dir_entry *sysv_find_entry(struct dentry *dentry, struct page **res_ name, de->name)) goto found; } - dir_put_page(page); + dir_put_page(page, kaddr); } if (++n >= npages) @@ -199,7 +210,7 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode) goto out_page; de++; } - dir_put_page(page); + dir_put_page(page, kaddr); } BUG(); return -EINVAL; @@ -217,7 +228,7 @@ int sysv_add_link(struct dentry *dentry, struct inode *inode) dir->i_mtime = dir->i_ctime = current_time(dir); mark_inode_dirty(dir); out_page: - dir_put_page(page); + dir_put_page(page, kaddr); return err; out_unlock: unlock_page(page); @@ -228,6 +239,12 @@ int sysv_delete_entry(struct sysv_dir_entry *de, struct page *page) { struct inode *inode = page->mapping->host; loff_t pos = page_offset(page) + offset_in_page(de); + /* + * The "de" dentry points somewhere in the same page whose we need the + * address of; therefore, we can simply get the base address "kaddr" by + * masking the previous with PAGE_MASK. + */ + char *kaddr = (char *)((unsigned long)de & PAGE_MASK); int err; lock_page(page); @@ -235,7 +252,7 @@ int sysv_delete_entry(struct sysv_dir_entry *de, struct page *page) BUG_ON(err); de->inode = 0; err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); - dir_put_page(page); + dir_put_page(page, kaddr); inode->i_ctime = inode->i_mtime = current_time(inode); mark_inode_dirty(inode); return err; @@ -255,9 +272,7 @@ int sysv_make_empty(struct inode *inode, struct inode *dir) unlock_page(page); goto fail; } - kmap(page); - - base = (char*)page_address(page); + base = kmap_local_page(page); memset(base, 0, PAGE_SIZE); de = (struct sysv_dir_entry *) base; @@ -267,7 +282,7 @@ int sysv_make_empty(struct inode *inode, struct inode *dir) de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), dir->i_ino); strcpy(de->name,".."); - kunmap(page); + kunmap_local(base); err = dir_commit_chunk(page, 0, 2 * SYSV_DIRSIZE); fail: put_page(page); @@ -282,10 +297,10 @@ int sysv_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 sysv_dir_entry * de; + struct sysv_dir_entry *de; kaddr = dir_get_page(inode, i, &page); if (IS_ERR(kaddr)) @@ -309,12 +324,12 @@ int sysv_empty_dir(struct inode * inode) if (de->name[1] != '.' || de->name[2]) goto not_empty; } - dir_put_page(page); + dir_put_page(page, kaddr); } return 1; not_empty: - dir_put_page(page); + dir_put_page(page, kaddr); return 0; } @@ -331,11 +346,18 @@ void sysv_set_link(struct sysv_dir_entry *de, struct page *page, BUG_ON(err); de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); - dir_put_page(page); + dir_put_page(page, de); dir->i_mtime = dir->i_ctime = current_time(dir); mark_inode_dirty(dir); } +/* + * Calls to dir_get_page()/dir_put_page() must be nested according to the + * rules documented in mm/highmem.rst. + * + * sysv_dotdot() acts as a call to dir_get_page() and must be treated + * accordingly for nesting purposes. + */ struct sysv_dir_entry *sysv_dotdot(struct inode *dir, struct page **p) { struct page *page = NULL; @@ -343,7 +365,7 @@ struct sysv_dir_entry *sysv_dotdot(struct inode *dir, struct page **p) if (!IS_ERR(de)) { *p = page; - return (struct sysv_dir_entry *)page_address(page) + 1; + return (struct sysv_dir_entry *)de + 1; } return NULL; } @@ -356,7 +378,7 @@ ino_t sysv_inode_by_name(struct dentry *dentry) if (de) { res = fs16_to_cpu(SYSV_SB(dentry->d_sb), de->inode); - dir_put_page(page); + dir_put_page(page, de); } return res; } diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index 981c1d76f342..371cf9012052 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c @@ -251,9 +251,9 @@ static int sysv_rename(struct user_namespace *mnt_userns, struct inode *old_dir, out_dir: if (dir_de) - dir_put_page(dir_page); + dir_put_page(dir_page, dir_de); out_old: - dir_put_page(old_page); + dir_put_page(old_page, old_de); out: return err; } diff --git a/fs/sysv/sysv.h b/fs/sysv/sysv.h index b250ac1dd348..50f19bfd8d10 100644 --- a/fs/sysv/sysv.h +++ b/fs/sysv/sysv.h @@ -148,7 +148,7 @@ extern void sysv_destroy_icache(void); /* dir.c */ -extern void dir_put_page(struct page *page); +extern void dir_put_page(struct page *page, void *vaddr); extern struct sysv_dir_entry *sysv_find_entry(struct dentry *, struct page **); extern int sysv_add_link(struct dentry *, struct inode *); extern int sysv_delete_entry(struct sysv_dir_entry *, struct page *);