From patchwork Thu Jan 19 15:32:29 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: 45832 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp398375wrn; Thu, 19 Jan 2023 07:43:40 -0800 (PST) X-Google-Smtp-Source: AMrXdXvtCTx3D9QCFDhT0agWktpCKO+ryj32jBcR30aa67KXPym5vCsbZRiWd8QU2z7E58gvC+HG X-Received: by 2002:a17:90b:f8d:b0:229:4197:631e with SMTP id ft13-20020a17090b0f8d00b002294197631emr11112066pjb.37.1674143020392; Thu, 19 Jan 2023 07:43:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674143020; cv=none; d=google.com; s=arc-20160816; b=g//+DpWLBNb4bh81ghBzXmCMwcU2cTxNlqclgFyJiJyvjqCPsyGlQPc1y4WP5gUHS0 JLjd/yQ97ezLyZ8/bSIPdmGef84aqYCheUI8xATAs3cWU/g3+Icf3BhWmz0xNqAUgu00 xNUB5Qm94qciTflDnbiXE6JAP/fiMn1GhX/0+aedBGnCiAhTmpxBmLQiwwa7PPAQYV9J Y9sjhDp1ro4f4adezE5DB+bvLZl+K35vY7B9eGfLTD3vD1hQ8UsYjPzW3rDClUUEPms9 Ye1ed834brAk2PCZta+CO8i60r4+IyMrKF56NXqNKUHgWeDpjLRA2AJzibN0yt3fm9PJ 0DRQ== 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=t4IpF0CMnhbBf7H7iLN0nfh/18GS/Ps3ATwtaps4Vp8=; b=ckmm7+PkR8ZSEHsaA4jZOUDzpwAgPbHq4JF+ExItFFUdX/GT3lHFV4KZfAKdPvugyw YRCvjlDszj+5yhbTbiVbVhZ6hsBgxTeOOXNbTyMrNmHPovzfW2MQzOcHG7Fw/D0Yr7Vj gVNkPSomo6Eyay/MGxdULm0zWggBpUahgf7FzmQXc9fbEJjTdvMc4CB8+6vC5S9oEPBt woVPabAq4u0MEy2y8Skt9+8p6RTMoF2ng0pqKNzBQSWlPWC1pBrJFQ+FwjPErNWIpxI6 dYycgdJxwJ5S9Eg9v1B1i41w3UCjBrF4mkyCnw/yZ3pXw8Q3/lJK0Us0q1CTJRF5rg7i +0xg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Z3RzMKM2; 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 h3-20020a17090ac38300b0022939a02263si5153881pjt.45.2023.01.19.07.43.27; Thu, 19 Jan 2023 07:43:40 -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=Z3RzMKM2; 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 S230306AbjASPcs (ORCPT + 99 others); Thu, 19 Jan 2023 10:32:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36250 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231130AbjASPcm (ORCPT ); Thu, 19 Jan 2023 10:32:42 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E3ADD40BE4; Thu, 19 Jan 2023 07:32:39 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id d4-20020a05600c3ac400b003db1de2aef0so1540644wms.2; Thu, 19 Jan 2023 07:32:39 -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=t4IpF0CMnhbBf7H7iLN0nfh/18GS/Ps3ATwtaps4Vp8=; b=Z3RzMKM2PeGPS/g6yCgIuivIMD1cD+w6CLOObE5w4jVExMsj5qYi5WIfgNlz+SjDCO LTW2cnLatJ5ybfa3z6GSBsbbFSgzlcTReqJlOmGJnVrPfZSUm5kWxMxZM6l+d+mZTnhr mgBX7ABHfnQ0H7GhOvyIQyw5yFHnYIbg5Db5XFgOL+DHv+bmZGNRNPpexIn/51GN7P9Z JjqLCVHFyfKLt3Y+WB1E6wV/Sh8+kgzVV/NOrVpgPFMeN9tJXKppYR+Ww4LGjs+rKTIZ qwcJ9ZeCaQ8UHpBeT4THst9TSlHUh3bP1BKfSy+tSRDQWnTSYZW4Ki8TuMVGc2+4qRnH Lj2Q== 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=t4IpF0CMnhbBf7H7iLN0nfh/18GS/Ps3ATwtaps4Vp8=; b=eQsn3prTZmhxGmIm9/s4w5MrgXOfbT/MsSRic1no/fYn2IMt41DIiTGrOcaAYlPOBF 5gNJ1x+t760yCvBSGi7UFX3+ACfHKbyk4a3xpOYrb/Ds7zTaScUbv4uZaXSESe+2vMV1 X1fSTXF6Fpht7pQ4MqN4er5q0U6lKq8RKXQ5ou/OqmTb+haAq4qzRWqwkxPlh728XQX2 KnoWa8OcrmQ1UZLrZLrWFDFu/Bvjgoiz/pe57gH/aywLHmAaxsyFb1CI1Eubk48WeeNq jeqKsHrd2VaAsfvGBsaHukMG2QQaQ32WE+EQrlK2JGTAaozW2iiftrnrQZnxoNWUVZOi V5eQ== X-Gm-Message-State: AFqh2koylKZu85SCXq/1lphTAdfLjy5ZS50rN4iHZNLDR+WuxF7eFmrS DqHyFlB4W7JukZy5WHfjIyQC9m+f5YM= X-Received: by 2002:a05:600c:4928:b0:3da:909f:1f6b with SMTP id f40-20020a05600c492800b003da909f1f6bmr11044750wmp.1.1674142358283; Thu, 19 Jan 2023 07:32:38 -0800 (PST) Received: from localhost.localdomain (host-82-55-106-56.retail.telecomitalia.it. [82.55.106.56]) by smtp.gmail.com with ESMTPSA id k34-20020a05600c1ca200b003cfd4e6400csm5827815wms.19.2023.01.19.07.32.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Jan 2023 07:32:37 -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 v3 1/4] fs/sysv: Use the offset_in_page() helper Date: Thu, 19 Jan 2023 16:32:29 +0100 Message-Id: <20230119153232.29750-2-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230119153232.29750-1-fmdefrancesco@gmail.com> References: <20230119153232.29750-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?1755466191547913793?= X-GMAIL-MSGID: =?utf-8?q?1755466191547913793?= 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/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 Thu Jan 19 15:32:30 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: 45833 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp399273wrn; Thu, 19 Jan 2023 07:45:27 -0800 (PST) X-Google-Smtp-Source: AMrXdXuG5OlwOs8GLDhRuCMkv2CDtcMtzl7gJewsO2ZNRorz9UBvtD6ZvCLtz9sY7mhnTsGGDlKV X-Received: by 2002:a17:906:6819:b0:872:23b8:d6f1 with SMTP id k25-20020a170906681900b0087223b8d6f1mr12690954ejr.14.1674143127827; Thu, 19 Jan 2023 07:45:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674143127; cv=none; d=google.com; s=arc-20160816; b=Lxmp3dTZwuzUqkWyMRmplyAXn9GWC7efGAOh4DR5GPE4O7Us7DJvyGNUkvV0ryrlwu 9YACEPatILC8MOh1NegnFVbMoH5PP5F59dTB6/Vr0uHBogHEaSagPvlCheSI8ZWvP2VS kSkjPR+T+RbPwik05qFrV6Qox0yq3BU8+Lsu3hJ5uynIuLaL2DM24du8pPk9tx9Wdu1i 8s8YZ/66dKmN5dqIvojF1LYxgV540c3uAZMr52hUxZjgISCYPKGAyuuD04Dheh0KKwDk J7++bTbCHi9i+kxnNepIOLR04U8JJ8IiE/CrAn4d405nC+kqCGRQYB3Uk3j51Q+0SGxY iXXw== 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=Ds3dXezsU4NdrKaDu6LJLSqsqIanylkO6E6ANlGew+I=; b=eqmEXH/RWWBOPsEdaHAdbdDWPr6ISNpNEFQGOGKeQXUNW0STHMd+KfNDd9qGWHA5a2 PntjuPbbC4PbgQ1GfJRNjWKtD4Mzjg7IhZNCAFvCTjyXfJz8qK2p1NNFVFJpHgd73Biu vSWc+bQ0Qzn6Mw8KlOegBPf2ZVJjMJtNly3tffI9Sxb8e13DmpESGPRl/X4KaPkFydcF 6dHqrvH8blm/iHIhwn5PnxFIap0CrcAdsC34YzrCMRNLA4bm7JwHamjAdYxdk2pnRg8r EBJKrA7UEsFHA713+qGFDawdoMMjndlekvPDvIfxD4u2Bix5DhZtG7bQNkYXO9WumeGR 8Q2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b="ZX8I6/Z2"; 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 g9-20020a170906198900b00873139373f8si6824054ejd.67.2023.01.19.07.45.03; Thu, 19 Jan 2023 07:45:27 -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="ZX8I6/Z2"; 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 S231231AbjASPdE (ORCPT + 99 others); Thu, 19 Jan 2023 10:33:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36254 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230525AbjASPcp (ORCPT ); Thu, 19 Jan 2023 10:32:45 -0500 Received: from mail-wm1-x331.google.com (mail-wm1-x331.google.com [IPv6:2a00:1450:4864:20::331]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1BB2C829A1; Thu, 19 Jan 2023 07:32:41 -0800 (PST) Received: by mail-wm1-x331.google.com with SMTP id iv8-20020a05600c548800b003db04a0a46bso3205583wmb.0; Thu, 19 Jan 2023 07:32:41 -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=Ds3dXezsU4NdrKaDu6LJLSqsqIanylkO6E6ANlGew+I=; b=ZX8I6/Z2f1xnY11MtiRDdVud2RqfcdW/Pj+UAvb8a+RcNn5tHXITZPYi3a2FijsR5g dfFBMp2oQrMOLlhw+QFnmTlMT4REdgRdgNNrbmcs7ro/EyDTdGSdm8BdDf+Hjxa/Aqee xgUhL7oj5tQxoT4aZH/HnxMIBulLrBXMect4UeduGmssN2e0W0L44lLiSfCqbxtICMLK gdfDFkuBvnNkEtDLhI6QUU47rToHg+HBsTLS6aWwHwSgnaARKKXCFr1ilnmnLh2g70xj /p9elxWwdv4nzdHyjYe2JxVLOQGpbooDUHL4bAW6KH5sqhPbmLPOpXDzOpjbJktYCh62 aynA== 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=Ds3dXezsU4NdrKaDu6LJLSqsqIanylkO6E6ANlGew+I=; b=vjUmQB19Y9FJwFGyIxPd5w//P3Olfj9ExCxKViAFLD2mTUV2rcoCpnKnQW1E237R2G /D0MwGl0hBf/9PKzriLaBvwoG7WZ2fZOsEjlziDzZRgxXtSg8q3D9zIhusjgpEJaTJXU 2dWOKNBBAsczx/Ke3nPpQN0IMJLhX7zBZRKaL+MEO8AovfeeoNQrEds9ut8DA3ENQUGD 0vWrzprmqmRuQJC3C4FESdX1UQTXrPHs80CQj0CcmisoFqmIZnFX5KIe4T4i+xDaZw/I 2IXO7m9DoXY3784wVPtcP7xAhs6azFfunWGcn/gmv1C8nRl6CQiqxHmfGK5kM8r00U/q ZdWg== X-Gm-Message-State: AFqh2kpCOVpeqVCLou+jglkqxFVJ7L+kl0AOviBtwjx21+xtCjyknIU5 m2x4Owdr27gEB36JZNi1I7A= X-Received: by 2002:a05:600c:982:b0:3da:f5b5:13ec with SMTP id w2-20020a05600c098200b003daf5b513ecmr10259172wmp.34.1674142359679; Thu, 19 Jan 2023 07:32:39 -0800 (PST) Received: from localhost.localdomain (host-82-55-106-56.retail.telecomitalia.it. [82.55.106.56]) by smtp.gmail.com with ESMTPSA id k34-20020a05600c1ca200b003cfd4e6400csm5827815wms.19.2023.01.19.07.32.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Jan 2023 07:32:39 -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 v3 2/4] fs/sysv: Change the signature of dir_get_page() Date: Thu, 19 Jan 2023 16:32:30 +0100 Message-Id: <20230119153232.29750-3-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230119153232.29750-1-fmdefrancesco@gmail.com> References: <20230119153232.29750-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?1755466304379148487?= X-GMAIL-MSGID: =?utf-8?q?1755466304379148487?= Change the signature of dir_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 adjust to the new signature. Cc: Ira Weiny Suggested-by: Al Viro Signed-off-by: Fabio M. De Francesco --- fs/sysv/dir.c | 53 +++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 29 deletions(-) diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index 685379bc9d64..8d14c6c02476 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,14 @@ 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 sysv_dir_entry *de = dir_get_page(dir, 0, p); - if (!IS_ERR(page)) { - de = (struct sysv_dir_entry*) page_address(page) + 1; - *p = page; - } - return de; + if (IS_ERR(de)) + return NULL; + /* ".." is the second directory entry */ + return de + 1; } ino_t sysv_inode_by_name(struct dentry *dentry) From patchwork Thu Jan 19 15:32:31 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: 45834 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp399682wrn; Thu, 19 Jan 2023 07:46:11 -0800 (PST) X-Google-Smtp-Source: AMrXdXuwwzXpUZW2FlIpYb2ZJ2e7P7YfQFeec9X6UTTqo0/vU+Ndv1D2qbargTSCjjvNzM0eSR0e X-Received: by 2002:a17:907:a708:b0:86d:e1ce:5c9c with SMTP id vw8-20020a170907a70800b0086de1ce5c9cmr12230794ejc.76.1674143171553; Thu, 19 Jan 2023 07:46:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674143171; cv=none; d=google.com; s=arc-20160816; b=Wgkr4gdWIDyYTL3BgVuwhXIQbdAfLb6jCK7xgAR3KIG+Y8KnAqcsPmSWgfWrxFralD jREhCxANY+qZZJcZGXjthjbgrLqdXx7i07QJQxQvBK8O1/1yjqHXEktIr1v8MbvCJmg1 pT2u82502Ez6tgkrLXq4NoWzhw22Kd1ivH/DYeM6ZLiiLiued51Ed03uFwKS1TFT8bXZ qBKXFDtKGiKzn9M/+7I70eb3szxtlSoQ1bS38BsJ/MjezBuKHyMVlvYAZAJMG7OqjWUv 4pgjVmEofZ5yWMy/WNSU+UHYHoGTaesMMirt68X8ITA+6/7eMj5FJmOoJU7hxQpMyHmf R1cA== 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=ZBbyUyezGmLPHORAlrPKLDLc/sGr6JdTGOI5HCWdOJI=; b=yOZ5P75BmG7s4BEMJTKGVhNY17syEq5E8GL9JYeRQFAO3GmywcbWyM+/vmIi+dabpk JlmB+Vl+wj9vv84EoOoCiZHE6kcItPDH90x7TWtVR4UzoFyIMQ7kzxdy1fmUeNMajmsT Xz8sVsS3nwm4GbsacHTiYSHXkXpD6miDk+uvJFWTJlG6Wt4HkEagzse1ruTAOfXFASsH p54wNTuOag9n6UsuWrbT3O7JZhFXva0WHilGYFAkAbZjoozif3m2gJvyEKpawt2KOX1u jSTDA1Jm5d5elPFYeEnMxxE6nCTmXsxyIIQRhCiyhl/EcEiwBZNFdJeHzQopsKQmf/CF 65QQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=Zb4W1DR0; 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 xb13-20020a170907070d00b0078d3b940ec5si44233324ejb.373.2023.01.19.07.45.24; Thu, 19 Jan 2023 07:46: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=Zb4W1DR0; 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 S229615AbjASPdR (ORCPT + 99 others); Thu, 19 Jan 2023 10:33:17 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36308 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231151AbjASPcq (ORCPT ); Thu, 19 Jan 2023 10:32:46 -0500 Received: from mail-wm1-x329.google.com (mail-wm1-x329.google.com [IPv6:2a00:1450:4864:20::329]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D42D5829A2; Thu, 19 Jan 2023 07:32:42 -0800 (PST) Received: by mail-wm1-x329.google.com with SMTP id o17-20020a05600c511100b003db021ef437so1530522wms.4; Thu, 19 Jan 2023 07:32:42 -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=ZBbyUyezGmLPHORAlrPKLDLc/sGr6JdTGOI5HCWdOJI=; b=Zb4W1DR0WbGbQaQFmXiwmCKgvqi+27mlbiyT9j0pPjUba1LC5ofQ9Zp+rj0MfYujmg qUzVIEnz/BW9G+Nri0LPa+70ypVEweExCJaMleEhyjuEl0TR5XzvNwnbYouQ2mgu0aFy gm7jnUlgw9pPMdfI1whxla15dgw3yvITz19ehjGhyWb9f1l3prafBHCAUR8M7khjZJ/8 h7Ffi7dfljxThwoYCAql8ZZG72eGwXwvZV6/o75EP/EElO0qeOwQX+Fijwvgpupvmb2A TcT8iglRPveJzh4p6BOGWrZiGqd3FyG3Xerm9pVdRX62Zu1X6p2e4rnSwoCScToFXosf 8rWw== 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=ZBbyUyezGmLPHORAlrPKLDLc/sGr6JdTGOI5HCWdOJI=; b=awsX0iYCQB5b2Ei3jYs2SSulCNogcbdG7/thWEKCRj7OwakdD9321IeqrBGNAvWigh LWr/QhB9qK50hywV8c5W7xZ2mWPsi9CB6KrDueAUYSh9MeJCvqjIjFU8WYLEnyUVoNbu UKEVyFELwL1qc+w0aOeSYVcuXdwzEjnngHT9+cUsPL4ryFc/bMXn0q8hwM83UnR7ztZx UYXgkwXSmvk2N04TyhmUg2f0W9VdrsRGaIfVx7f5TSbxtXL8d9TJoKp1R2hbYZrRRHau X6p0en3+DnTSsUAK2lVbe+p3qcoCGsv+Papl/eLqU7GcOxnuwLe8wMlqel4c5pQg4oql hSmg== X-Gm-Message-State: AFqh2kqQVgNlCKMHyNmdCDllXCtw7pSBj8A3bVDLS/lce2pr4pmEHKoW YXftyOzfkGQMlryad7dLNm0= X-Received: by 2002:a05:600c:511f:b0:3d0:bd9:edd4 with SMTP id o31-20020a05600c511f00b003d00bd9edd4mr10683912wms.0.1674142361117; Thu, 19 Jan 2023 07:32:41 -0800 (PST) Received: from localhost.localdomain (host-82-55-106-56.retail.telecomitalia.it. [82.55.106.56]) by smtp.gmail.com with ESMTPSA id k34-20020a05600c1ca200b003cfd4e6400csm5827815wms.19.2023.01.19.07.32.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Jan 2023 07:32:40 -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 v3 3/4] fs/sysv: Use dir_put_page() in sysv_rename() Date: Thu, 19 Jan 2023 16:32:31 +0100 Message-Id: <20230119153232.29750-4-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230119153232.29750-1-fmdefrancesco@gmail.com> References: <20230119153232.29750-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?1755466349922085817?= X-GMAIL-MSGID: =?utf-8?q?1755466349922085817?= 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 --- 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 8d14c6c02476..2e35b95d3efb 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 Thu Jan 19 15:32:32 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: 45835 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp399683wrn; Thu, 19 Jan 2023 07:46:11 -0800 (PST) X-Google-Smtp-Source: AMrXdXv3VHw4Ft8cK3G1IV4GoutTwHZwXKbPiJaRsaB/3FUNL44v3LHJ5RtRm54ZiaDTQcouSaja X-Received: by 2002:a17:907:20db:b0:7c1:7226:c936 with SMTP id qq27-20020a17090720db00b007c17226c936mr11232909ejb.64.1674143171551; Thu, 19 Jan 2023 07:46:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1674143171; cv=none; d=google.com; s=arc-20160816; b=HhbPU2BVncW3AoUxtsc/uGDAczdb/7daJBdj59QNUKOgGwU4BvXoxdqtB0LP16rzvx a5aIC3IjsortpzuzuU2xgxdyZEFHzSkU2X4/5tZIYzPXnnHb+fOfo4cLpauLadlYkAbL 3KR2sF9//PehhcPRrD/phVH2VVB8gVY4VfwHjUdrZxnEFNZR+nwr8fl5CVauwBalRs9b RBp1atS7DNLZaV2v/Iw1x1mdJJjsjQIw7OutGijfSR27dh0jOHKGqVxBQldtmyuQJAmB 1zl+wI/eGred1N+a7mLbNfYrQrTc0L/OM/GDVKDQEORXKhL9mX/11bfCSJrmmG93rwt6 gSZw== 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=PeQOnDIxishoqUV4xglLQiul2G5rA5E2GtpDLgQ/xtI=; b=ZdMYPUQC190Es+KtBKfptFNXbL0x/o+3hBP7an1XhS3e+aIEak7h0LtZnoudAI/xgd m9H2z2H+Nu+886sdpLmQ544K7Vblh8Xc+F7A86AwS5VrOv3Tx7LoNBZsgaDFJXJYF3sM kAIzzllIdbrBVtv7IJ/CBnojIUODQGf3SvikpS1Ux8lmugFlxTcuKEgV86pBJbOaA2f0 Ivr5mbTqSZ2LpQAisNgiWwb1zisK2UT6X3L5QxVMWjJDhGFGg7mmhGQ/hppH4HpfsO58 z535LMAKt+j5TbeKRsTvA2iMV0P6OTD9K9xxjm3QiiTW5I/SZQl8OkCs1p9TX6H+elhs H5MA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=hZCyTB3t; 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 wz8-20020a170906fe4800b007be1d7d1c3csi18222512ejb.386.2023.01.19.07.45.48; Thu, 19 Jan 2023 07:46: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=hZCyTB3t; 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 S231232AbjASPd1 (ORCPT + 99 others); Thu, 19 Jan 2023 10:33:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36354 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231161AbjASPcr (ORCPT ); Thu, 19 Jan 2023 10:32:47 -0500 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1477C4860E; Thu, 19 Jan 2023 07:32:44 -0800 (PST) Received: by mail-wm1-x32b.google.com with SMTP id d4-20020a05600c3ac400b003db1de2aef0so1540802wms.2; Thu, 19 Jan 2023 07:32:44 -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=PeQOnDIxishoqUV4xglLQiul2G5rA5E2GtpDLgQ/xtI=; b=hZCyTB3tpMJD3NpXlMKptkshlqv03DD7UjDhH1qJOE5ooZjATD0MnP+boQDSJUGpAO avHNPHhG4IT3ap5Vr9Og+s0XJq7aPpX569rRKeYY0uIh7O+FbAQrsmDaut0h9N3drl+X hTtQI/7egycruLQFLrKSdYCqcBx81YGPBCh1xKsT57LuZhAy4a0q+hJuJoofSzM9wbae 2/ayrVm3IKx/3s99RCl1CgCGSJfPqEQINoh7jPu69+ip1tQsq5yKPRgQhzwoSoZnXZ8D ZeVlySVVjbakzrGR1JRrjLniXGihLpnU6iXybvtuUsFz1+T2DgyDA34es4RQYY0qLspd Mn0Q== 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=PeQOnDIxishoqUV4xglLQiul2G5rA5E2GtpDLgQ/xtI=; b=Y+vmRQcVXdTgZBWYTiwOnbELp8FgFRNUs/tkEwl2jBA7R5LwDBJO5BRCLU+D6d37WI bMZ9y1cN2sIaVkHMWmcW6p/XuC31TWceFCtiuGzW13rkEWF4M0qReLRGgyawyNu3MXoI FhFYS7ly2IhS1tf9Z35ZPRKo8Ed909tBxLN8Nu0HWv67geWnjacPBh0rY8mg3FaZjLYb NLPJOcfV53b/G+vV+fSEmyuFQ8VD5ImpCINzWaR6hiPTlNlSB3augZUJLaZ3X1ZR2/7h SGHm372WstoQngKUj13z2xaE1p75EiSro3loHuMhAvEL0nu68uwLokj0mHxJbLE26sSU vQqA== X-Gm-Message-State: AFqh2krhk5y12CRAKB6JWvLJBtqtWiXgwt+GGQMQt9YLoch9ynssd6w/ kTFgxNxWSTBdm7wVJaeNb60= X-Received: by 2002:a05:600c:1e1d:b0:3cf:674a:aefe with SMTP id ay29-20020a05600c1e1d00b003cf674aaefemr10731038wmb.22.1674142362579; Thu, 19 Jan 2023 07:32:42 -0800 (PST) Received: from localhost.localdomain (host-82-55-106-56.retail.telecomitalia.it. [82.55.106.56]) by smtp.gmail.com with ESMTPSA id k34-20020a05600c1ca200b003cfd4e6400csm5827815wms.19.2023.01.19.07.32.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Jan 2023 07:32:41 -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 v3 4/4] fs/sysv: Replace kmap() with kmap_local_page() Date: Thu, 19 Jan 2023 16:32:32 +0100 Message-Id: <20230119153232.29750-5-fmdefrancesco@gmail.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230119153232.29750-1-fmdefrancesco@gmail.com> References: <20230119153232.29750-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?1755466059579610851?= X-GMAIL-MSGID: =?utf-8?q?1755466349753383048?= 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 --- fs/sysv/dir.c | 62 +++++++++++++++++++++++++++++++++---------------- fs/sysv/namei.c | 4 ++-- fs/sysv/sysv.h | 2 +- 3 files changed, 45 insertions(+), 23 deletions(-) diff --git a/fs/sysv/dir.c b/fs/sysv/dir.c index 2e35b95d3efb..0a83a01862f3 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 sysv_dir_entry *de = dir_get_page(dir, 0, p); @@ -354,7 +376,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 *);