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: 40998 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp2271097wrt; Mon, 9 Jan 2023 09:09:27 -0800 (PST) X-Google-Smtp-Source: AMrXdXtmcy0Y45MLlvoah1cZBaDipx62Fq3KFAOXZGdV2bABUKri6ILdTN9ehHHrBcxTDe+5thD0 X-Received: by 2002:a17:902:f80c:b0:185:441e:90dd with SMTP id ix12-20020a170902f80c00b00185441e90ddmr73174384plb.67.1673284166884; Mon, 09 Jan 2023 09:09:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673284166; cv=none; d=google.com; s=arc-20160816; b=whpL5N1qDB5Il17X8NGezBYIxvo+RPTwYJptAKuN7FmNokjjCdZmJ6hzAERiDixG6R f1LQgXC4KR2DFg/Y/dpL6beIlzx7FblxXhOopt4/ncRIXY6Jtdx80fm5AXOsYjvBy7wC 1duD7tOf5c2XjFGITr2HhSSMZwx3IsZC6j50w8lE+Z8Ulx4OKbju1u0HGwYXhAYvV7lU xa0QAzo007N44dweubpW2x+8jQcSJBeb9EHRsvlay9QuvPFOYzc1ERJytFtFxVAAFdYM 4tnu2lgZnwqAGguHwFIFflI0qKBIiIDvzpvUmzpKfwlr96vJ3ajHYzcZOqmheZ47GUkU 8OIw== 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=gCW9hGwXYkgWMlftGJTpxYD0tpe8j+WfiIQir4l86co=; b=bou/Qpmwu5dCFNcP0JCOStpZYe1s0T5ScyisePYxiEeoItuEWyJZZoUm7eEWKuELkU 2Sooo9v4hPJE+uf9K0kssCeex4N8w4GzzVlK07Ts02uJjivSZMFosML6Zcc4GgCFrA3v wXT1Rjq6GeLYy5NxmCeHjr/cyZwchnw5KSgatiq9cw/F7KHvQ5IEaE0gz4y496mlKGqN /k4rf2YEIxplT12pOSr1b7i25GMLycg7UzE6uSaBiglqOrWcvnzikKql3gZhgwWmu15k 3/xnYeiy4l5ZGbwfW2jef241q3NCWuPCWYE6PRCNZGdlQmeB5KFIyXhzoTKOlC93ig3R 553Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=H9k0NCEK; 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 x3-20020a170902b40300b00189c8b6e603si8700817plr.583.2023.01.09.09.09.13; Mon, 09 Jan 2023 09:09:26 -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=H9k0NCEK; 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 S237142AbjAIRIN (ORCPT + 99 others); Mon, 9 Jan 2023 12:08:13 -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-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 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?1754565618667665873?= X-GMAIL-MSGID: =?utf-8?q?1754565618667665873?= 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: 41000 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp2274647wrt; Mon, 9 Jan 2023 09:16:11 -0800 (PST) X-Google-Smtp-Source: AMrXdXt9R/LxDfqlA4RteBsDU57TnPJh1EOP85/cRhphh+5ZC2nFhs0JEOEzwF+c2foUhlCbaTy2 X-Received: by 2002:a17:907:1246:b0:7c0:b6ec:3ff3 with SMTP id wc6-20020a170907124600b007c0b6ec3ff3mr47319234ejb.65.1673284571279; Mon, 09 Jan 2023 09:16:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673284571; cv=none; d=google.com; s=arc-20160816; b=cFgLGeNpRTwCM94Epn1ibSXdVEn8Vy4cjlj4kqEzLgVCLoJN46iarTLc1HzQPStHOE 0tn9knhZCcWJSM/SHbGQl4rdRj3/lGAaF25K8dV26EKLRQqOuDX/j5FWoONavFjAX9Qf 2E+92TubpogoHOgtSy8Ba8hQQ4DnwYou9JEUTHivXyuJPCANQBI1NOMapak/YpjIn+vM Ig+JhKCwahJqp5acdg+1pacZyh9+opferp6HJ/5J2pj8n90/EsyhL+pA56vfenkvETc9 +JPRC370jJhQEdJ/cTQ8lRcDpl9GwEkAWlzoI0PVq5ZQhypnTDWsUvKrNSZTHvKn9gKa tnXg== 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=wPkTBe5nXBDQeS7sbYnJgmbxzogLVWQKfGg5it5w+j0=; b=P2tAGL2lLgviJGC5Q/9vry5b9wWqX/4EeqMOuunt92VBrdU4T836QRMPv+Zel5ghLU Iw11GiSe9X0aQq8pnIqj/gcKLAuXnJxICp6Yx8n1by4FJYO9+rbrLMQkEQtQo7k/ucJf ATJ8TEe5XHsHvYOludxmB4UWtznpTpE+QmAeYTbeYrCTTuc1jsL4Tccb+mHUAXhMN1tM i3Mc2RFMVHBMlRwCCoxcQqKcnOiI6axpAZsOUYknGyVyApi0Ieb2Q4ttETWx8w7+qSse Ccv2b+ChUIQyAcwPCtRd3w2rd67nhhCyqiyPntdlh5rJA492jCC2Uxb+5WIsa9qg+XVK CGbQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Nya5FjSn; 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 ji1-20020a170907980100b007c189b2939fsi10058139ejc.482.2023.01.09.09.15.46; Mon, 09 Jan 2023 09:16:11 -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=Nya5FjSn; 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 S237233AbjAIRIV (ORCPT + 99 others); Mon, 9 Jan 2023 12:08:21 -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-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 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?1754566042776303986?= X-GMAIL-MSGID: =?utf-8?q?1754566042776303986?= 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: 41001 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp2274690wrt; Mon, 9 Jan 2023 09:16:15 -0800 (PST) X-Google-Smtp-Source: AMrXdXtaPTzfc8IezqUt/l/drEVhLNyAN5NsNW51AiKgnMYJUDLGVrtLjzT6aggnPPgDZ+IlbJNk X-Received: by 2002:aa7:d513:0:b0:462:9baa:7507 with SMTP id y19-20020aa7d513000000b004629baa7507mr56054329edq.8.1673284574865; Mon, 09 Jan 2023 09:16:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673284574; cv=none; d=google.com; s=arc-20160816; b=XMg5SN6LcLb2MhNbIWz3YUuJ4AgojfDfVw0vFp+BC6gZUfWjak+cMyQhZIewPULD3X t0onzfwzZxTzEG+VXVEAC3jTIu24tKKDvnD/b8pbq3Q/AoJQDsHtI1Xq3DSerH6blhxn ozYselBnmn882zfMaHT+AlxbW6Y3MTEQAd2Dy67H/HwS3lIrq07onFxaJiaXxVAHzmVK nf2S03oovlZFLXn9MpE0OoPqs5FCNESxJ5+af0ZI6WWgaUMZJ6GK8DIjAsN2W+4wNXxF xi5eo0N6eSeAoJkQALKA4Q7X8LxovCV8a2GIwZ+MHvE2nL1tc0FkokCTJkGxRt9VfO2C 3rxg== 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=EUTGNtTWUZq9Xoje3nsOop87o5Mba7F27fOFrJfe2eQ=; b=KXpRACtHI4K1FRytfiNX8HXjjZgHvMDPicxt7aedQXMdh4vPTdachDTymiLIAMJu8w 2lkxHy6eOBQA4qPoJDbmfyq5omLlAF597nrJ+oLl3o9pNQh5gkfrG8Mx/gYoeSOU9Ne5 cuHuysf/Zj9FoQyKyhKqlkhmjkF4hZoXsNw3FsPeKBGil3QZDaak6KtNxJrW4A4vGVjm 30nT3evPE39J5L+qcxiHXKEgEub+TzvintokeaUaygkgr88YxcG4loDgD+u4KEdy/2XE uVJ0K+APL0p+UKvvyhaCdk1m0DLaCg9qMKfFeWquDcBJKmfVGPyzYmvASmFJ62kbXJst Rbbw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=HgfVbMkc; 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 i23-20020a50fc17000000b00486d50b7550si8844638edr.311.2023.01.09.09.15.51; Mon, 09 Jan 2023 09:16:14 -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=HgfVbMkc; 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 S237362AbjAIRI3 (ORCPT + 99 others); Mon, 9 Jan 2023 12:08:29 -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-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 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?1754566046507737688?= X-GMAIL-MSGID: =?utf-8?q?1754566046507737688?= 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: 40999 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:4e01:0:0:0:0:0 with SMTP id p1csp2272473wrt; Mon, 9 Jan 2023 09:12:00 -0800 (PST) X-Google-Smtp-Source: AMrXdXvT+1A8X1Lh9f70byG3tiIT2ravzL/NE1qXbpXaKyfN/voT5iPjwWyQuD8i1wp5M4T6nrgU X-Received: by 2002:a05:6a20:7d95:b0:b0:1051:2a96 with SMTP id v21-20020a056a207d9500b000b010512a96mr98987411pzj.57.1673284319628; Mon, 09 Jan 2023 09:11:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1673284319; cv=none; d=google.com; s=arc-20160816; b=Yybot9avWcv+hh1mdeVjZzvhrp5FrfHvl0A0jk0QoNW+KnjKF65EWHYapkvzHpwPaA gEaNN+TozDjtch4VYZ25qUl1tFzN67T/B05x+h0kIyU1KI+XMw8Z+Gq3eMoANN+mI3L7 lyA8v/MLt9nfnP2zZg98a8hmImlUKABWOaCeh8prdqsjnzLNxh2LuUziEbM7iOW0YTQl ukt+8jClf4O2HTGKxIFaPkP2UiwBNLOnDF+xh1utKImMM83AH3ox6fkzXY9+en9Cufy/ 1JHUs50EkLOxzMaIfpy2BCaizLfuKbSdeC/jlLqTKJaDx/zLZSpSZ5wIAZp85l1pjQEu OMow== 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=xVOWfeV8XAusRFbQDF4pruLZCgXugYaujYQ4ITxrwOI=; b=YubiWGkJaGU7auUmWgSBDIUbWx2LpmInJGdWYtV94T6gJl/b3fRZgSg1W9mBIA+Mr3 V1bxaNSaTEE8pVbWqtluP1+5fmgfam7yUkV1tQqLk2CUsUugBywISuP7lmPTSD40CoV6 fEGPJnpHSoZMGobZ6xG+iQnAjWQAhVKxy/OoJL/PUJcPebFwQse46iPFthRjPr4IxI34 uz29SZm2F+D/vF4p7Dj+XIagWuPmie1jL4cn/dIRedXxxfGhqCuaHhRXaUv64CzBU33x q79KKbP/Dw8VNWCqiwpBmaG/XoGCz5ceyTtwUb/nNd1UfZFd2S/txoQ83c35tCu5Mb3P iaWg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="FOFDBc/Q"; 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 q11-20020a65494b000000b00478e7f82dd3si10070502pgs.543.2023.01.09.09.11.46; Mon, 09 Jan 2023 09:11:59 -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="FOFDBc/Q"; 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 S233170AbjAIRJS (ORCPT + 99 others); Mon, 9 Jan 2023 12:09:18 -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-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 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?1754565623874809355?= X-GMAIL-MSGID: =?utf-8?q?1754565778665120197?= 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 *);