From patchwork Tue Aug 27 06:15:43 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Hocko X-Patchwork-Id: 13778885 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id EB9FDC52D6F for ; Tue, 27 Aug 2024 06:15:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6DA4C6B0082; Tue, 27 Aug 2024 02:15:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 663496B0083; Tue, 27 Aug 2024 02:15:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 5040C6B0085; Tue, 27 Aug 2024 02:15:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 2CBAE6B0082 for ; Tue, 27 Aug 2024 02:15:56 -0400 (EDT) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id CAA20C15C8 for ; Tue, 27 Aug 2024 06:15:55 +0000 (UTC) X-FDA: 82497014670.13.BAE367A Received: from mail-ed1-f41.google.com (mail-ed1-f41.google.com [209.85.208.41]) by imf30.hostedemail.com (Postfix) with ESMTP id D6EC88000B for ; Tue, 27 Aug 2024 06:15:53 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=none; spf=pass (imf30.hostedemail.com: domain of mstsxfx@gmail.com designates 209.85.208.41 as permitted sender) smtp.mailfrom=mstsxfx@gmail.com; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=kernel.org (policy=quarantine) ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1724739310; a=rsa-sha256; cv=none; b=ua+r15SUvlil1e1fwrM69TLNsaVeIAJtbo8Rt3y+Nkg1vlh0fdYDSSUSwHY00jTyNMXXzq A2dYXv8Qz8jvVDbIQRZaV5istLMDFT/zn3LHyKZMfeNPIsU85+9zntian9xOe9FmbWJdPT zx1J6hkSy1714bf2oOz/j5FBsma1D2M= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=none; spf=pass (imf30.hostedemail.com: domain of mstsxfx@gmail.com designates 209.85.208.41 as permitted sender) smtp.mailfrom=mstsxfx@gmail.com; dmarc=fail reason="SPF not aligned (relaxed), No valid DKIM" header.from=kernel.org (policy=quarantine) ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1724739310; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=DvNljt96kZpU7jSZrl60PVpp8KZA3Kt6uHD/i6ntmJg=; b=kwkmeSDqgP5lCuuv6LGKa+l3oU9bkGDHDVIZLtZCA0OtMn+wJhgvGynFQpAsmjMe2TpohO y9IXWE7doJOBcJYlu8x2qSc/C1/XvL5qrrcxy5iQkIpj7hXi+Lj3GFAgCj3XI9NjkEhtT1 9AjZRLxI0K6jiZ3ZyHqbpPhZl+m6tsg= Received: by mail-ed1-f41.google.com with SMTP id 4fb4d7f45d1cf-5bed05c0a2fso6294636a12.3 for ; Mon, 26 Aug 2024 23:15:53 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1724739352; x=1725344152; 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=DvNljt96kZpU7jSZrl60PVpp8KZA3Kt6uHD/i6ntmJg=; b=FLeVHzA2/AgyJHklAe9YjGtodsbvQY9CAPoJg99XwMlKyJdOaS2uy6PnbuTlQGe+lf u+d2HpAETwXn4Y+Dx3FOJFr7iNvMNXGeMvN/xmX6JX5me4hqmFNbuK5VwVOR1ugFUtCG Z2Z8kk5gdO6Kph1vbBmWYm30NG8fqLLV/TN8moBZyIKtUNDz7/zAeVkjpMZfzTRKPzzt 9pxRItC0JXsHEF7sQH4FuERJtQ4ceX3qZ+zDv4AxRUxWraA+VhMfN/ABKmEEpJZrz+vX 8l0vk6IGIJGkApt6NstPgUBQrBpMey0Rwl/4HIaAFcPtjoEAvugDfXbNPBzrzXb1JpYT H5dg== X-Forwarded-Encrypted: i=1; AJvYcCWXEuSuBEV/GdiS8Cm7SBBWhH6yeEziQ0DkOBLagB15hDoaC6ko19vW9t4gxRE6fHBe/hVO90Ic+w==@kvack.org X-Gm-Message-State: AOJu0Yxj9M1iDVnxX+XcvMmn/2BDuB+/8YmrSLby/n+sAWphDrpNEJxS uHrSrCyloWjalBCod5XdSR1DXy9KeECi13pb8UTRHIt9KwKwQ/rN X-Google-Smtp-Source: AGHT+IG0Rtb9/QsxoHCkBplulCWks1HbTKU1zgRP3AjIMFphREd2tQE088Sm/ynw7mJupNashM/zQQ== X-Received: by 2002:a17:907:6e91:b0:a86:3c01:cf08 with SMTP id a640c23a62f3a-a86a548822fmr1013189966b.47.1724739351769; Mon, 26 Aug 2024 23:15:51 -0700 (PDT) Received: from localhost.localdomain (109-81-92-122.rct.o2.cz. [109.81.92.122]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a86e582d8a3sm66834366b.136.2024.08.26.23.15.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Aug 2024 23:15:51 -0700 (PDT) From: Michal Hocko To: Andrew Morton Cc: Christoph Hellwig , Yafang Shao , Kent Overstreet , jack@suse.cz, Christian Brauner , Alexander Viro , Paul Moore , James Morris , "Serge E. Hallyn" , linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, linux-bcachefs@vger.kernel.org, linux-security-module@vger.kernel.org, linux-kernel@vger.kernel.org, Michal Hocko Subject: [PATCH 1/2 v2] bcachefs: do not use PF_MEMALLOC_NORECLAIM Date: Tue, 27 Aug 2024 08:15:43 +0200 Message-ID: <20240827061543.1235703-1-mhocko@kernel.org> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240826085347.1152675-2-mhocko@kernel.org> References: <20240826085347.1152675-2-mhocko@kernel.org> MIME-Version: 1.0 X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: D6EC88000B X-Stat-Signature: cw1q4y7drt6qdhwennojxyyz9mrnc7yh X-Rspam-User: X-Rspamd-Pre-Result: action=add header; module=dmarc; Action set by DMARC X-Rspam: Yes X-HE-Tag: 1724739353-493891 X-HE-Meta: U2FsdGVkX18gWzPvf2EP3ynBf7P85I5uTRR3S7gcVR+RcHrWCapaHBcovRQxvddM9NJyYIaiHWRadtz5BlHel7q7fCdo2v0xKVHNr15nyPFmlLzTW0o+zQPpRdxRo/MFEAHSiURMZUkCjYgWeCl0fv+fHvMh/IMBZvKRnnd/6dmKXBM7hm6i4yAANEeiE8t3/UNvjz1s6NMaT1R8htzI+XfkQOswxkeGhrZNIvYZ+Aa/td8OIgetB7JhM84eQBIqvPfbIingSbjHpa7rCtVwRbn34mOD3gum1mH8zWSHzqDx9hwczxEbL4zZ+OfuvjkrG8lIvRpjgrKCu6tjX9zh5PpY3G2qT3FlxhR3M9MQwl7y1exBMYfmNoM5Wd/XsGCrCi4z75EuF8LyWD7ZGY+JnFkHkQR4Q5x5a9NfmZ2w3teXzBSKjW2pUleQdO97Mx9ree0s5m6nx71mG7PTRrNhRZplK1ynKmgFUiriW1a7E8jFlMdz24D1h4LQdld1441V25N88fmHE0bDhC/8zMaS8fVUPJXzyVyfRYf6hCM0R3HUWqw6QPQm8EmoC4VV2A8sZD0/qTLj2WKPAFrZ3udHygMYgLZf93UAyy59ZlLbOA4eEaCukvlSSH0vu5ALdVbnl98ZsvDkfPfufAcSpnAk0PEov5+Rft8YqGd9DW7MOaR9Qokvffgwehfgxxv8eOpfxPqa+jtA8ydlsBn89MXLRKy14xfr5786QF1zrZ4VW7hA62icJ9BR9aK4cUiM2bvNbHPA7uKJdIrqlbBu7vnnWKhnQmvGBqmYY/cwS44/RgpBqaauWtOJVOxGjVas9hCyEqzXh37mtrGXTvmJR0shoDlFnYtVQEViIqrDtpXtpUv0ZlgHB8J8Y4x62otNbn618Kdyl1Yh74AHWLJR8M2DsdRZS7dNpzpNpIwf3KeUCEz2YkwLtVYsrduk5vNPVZKySVol4ijwFt0gZYuhlO8 u1igmhRe Q1CdN4++sBdn84+aiGniBXOHxChDWuy8XmCUysck6ZSbRMYScfI0C4u6aCjz77SHCqoJBTq4YrE+ldFqg4LxPwSNAqP+xoxlYS47MfDiRLCR0YAmkgU6Qv7X8/KAX6Vb/lri3+Gxchnzdh5GUzlW0L/Etv3qeKv+gYvAnSRTlzeBK521Zx1nXCBavLyJXTAxjyTKKwSVEzWhGWtlW5Bbg7knWDIj6iLeN4hUNKvxJJqA8v/m41rwnetYND+ZvX7Q+/EvgtjoEcchVTVObwPwX5ekwZ+c4oz3KTAlNaS65a+bbU0T5uALalEcrG3lNtnBDT9wc7hEUBMQ8V/pR1Rxf6fgya+zoZP3cI+x+umo8PEhWOHP9YmApJ42HZh9QrTFKzJYcc61wnxavxEMxvGdOAa+GsSmoNsDeGFmLOZOz2GkdncBjLkom7DsIj9gr+Dm9XlVRQOUH5MBWCe3SE9T6dzEtnXvXgm0okJ98GtfLA7xNFtIm+3BLigRV+s2VezQIGiI8AwoTivny4wFHXZ03oGvGIaqlmFJ3WiNm X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: From: Michal Hocko bch2_new_inode relies on PF_MEMALLOC_NORECLAIM to try to allocate a new inode to achieve GFP_NOWAIT semantic while holding locks. If this allocation fails it will drop locks and use GFP_NOFS allocation context. We would like to drop PF_MEMALLOC_NORECLAIM because it is really dangerous to use if the caller doesn't control the full call chain with this flag set. E.g. if any of the function down the chain needed GFP_NOFAIL request the PF_MEMALLOC_NORECLAIM would override this and cause unexpected failure. While this is not the case in this particular case using the scoped gfp semantic is not really needed bacause we can easily pus the allocation context down the chain without too much clutter. Acked-by: Christoph Hellwig Signed-off-by: Michal Hocko Reviewed-by: Christoph Hellwig Reviewed-by: Dave Chinner --- fs/bcachefs/fs.c | 14 ++++++-------- fs/inode.c | 6 +++--- include/linux/fs.h | 7 ++++++- include/linux/lsm_hooks.h | 2 +- include/linux/security.h | 4 ++-- security/security.c | 8 ++++---- 6 files changed, 22 insertions(+), 19 deletions(-) Chancges since v1 - compile errors fixed - dropped GFP_NOWARN as it is part of GFP_NOWAIT now diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c index 15fc41e63b6c..d151a2f28d12 100644 --- a/fs/bcachefs/fs.c +++ b/fs/bcachefs/fs.c @@ -231,9 +231,9 @@ static struct inode *bch2_alloc_inode(struct super_block *sb) BUG(); } -static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c) +static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c, gfp_t gfp) { - struct bch_inode_info *inode = kmem_cache_alloc(bch2_inode_cache, GFP_NOFS); + struct bch_inode_info *inode = kmem_cache_alloc(bch2_inode_cache, gfp); if (!inode) return NULL; @@ -245,7 +245,7 @@ static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c) mutex_init(&inode->ei_quota_lock); memset(&inode->ei_devs_need_flush, 0, sizeof(inode->ei_devs_need_flush)); - if (unlikely(inode_init_always(c->vfs_sb, &inode->v))) { + if (unlikely(inode_init_always_gfp(c->vfs_sb, &inode->v, gfp))) { kmem_cache_free(bch2_inode_cache, inode); return NULL; } @@ -258,12 +258,10 @@ static struct bch_inode_info *__bch2_new_inode(struct bch_fs *c) */ static struct bch_inode_info *bch2_new_inode(struct btree_trans *trans) { - struct bch_inode_info *inode = - memalloc_flags_do(PF_MEMALLOC_NORECLAIM|PF_MEMALLOC_NOWARN, - __bch2_new_inode(trans->c)); + struct bch_inode_info *inode = __bch2_new_inode(trans->c, GFP_NOWAIT); if (unlikely(!inode)) { - int ret = drop_locks_do(trans, (inode = __bch2_new_inode(trans->c)) ? 0 : -ENOMEM); + int ret = drop_locks_do(trans, (inode = __bch2_new_inode(trans->c, GFP_NOFS)) ? 0 : -ENOMEM); if (ret && inode) { __destroy_inode(&inode->v); kmem_cache_free(bch2_inode_cache, inode); @@ -328,7 +326,7 @@ __bch2_create(struct mnt_idmap *idmap, if (ret) return ERR_PTR(ret); #endif - inode = __bch2_new_inode(c); + inode = __bch2_new_inode(c, GFP_NOFS); if (unlikely(!inode)) { inode = ERR_PTR(-ENOMEM); goto err; diff --git a/fs/inode.c b/fs/inode.c index 86670941884b..a2aabbcffbe4 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -153,7 +153,7 @@ static int no_open(struct inode *inode, struct file *file) * These are initializations that need to be done on every inode * allocation as the fields are not initialised by slab allocation. */ -int inode_init_always(struct super_block *sb, struct inode *inode) +int inode_init_always_gfp(struct super_block *sb, struct inode *inode, gfp_t gfp) { static const struct inode_operations empty_iops; static const struct file_operations no_open_fops = {.open = no_open}; @@ -230,14 +230,14 @@ int inode_init_always(struct super_block *sb, struct inode *inode) #endif inode->i_flctx = NULL; - if (unlikely(security_inode_alloc(inode))) + if (unlikely(security_inode_alloc(inode, gfp))) return -ENOMEM; this_cpu_inc(nr_inodes); return 0; } -EXPORT_SYMBOL(inode_init_always); +EXPORT_SYMBOL(inode_init_always_gfp); void free_inode_nonrcu(struct inode *inode) { diff --git a/include/linux/fs.h b/include/linux/fs.h index fd34b5755c0b..d46ca71a7855 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -3027,7 +3027,12 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int whence); extern loff_t vfs_llseek(struct file *file, loff_t offset, int whence); -extern int inode_init_always(struct super_block *, struct inode *); +extern int inode_init_always_gfp(struct super_block *, struct inode *, gfp_t); +static inline int inode_init_always(struct super_block *sb, struct inode *inode) +{ + return inode_init_always_gfp(sb, inode, GFP_NOFS); +} + extern void inode_init_once(struct inode *); extern void address_space_init_once(struct address_space *mapping); extern struct inode * igrab(struct inode *); diff --git a/include/linux/lsm_hooks.h b/include/linux/lsm_hooks.h index a2ade0ffe9e7..b08472d64765 100644 --- a/include/linux/lsm_hooks.h +++ b/include/linux/lsm_hooks.h @@ -150,6 +150,6 @@ extern struct lsm_info __start_early_lsm_info[], __end_early_lsm_info[]; __used __section(".early_lsm_info.init") \ __aligned(sizeof(unsigned long)) -extern int lsm_inode_alloc(struct inode *inode); +extern int lsm_inode_alloc(struct inode *inode, gfp_t gfp); #endif /* ! __LINUX_LSM_HOOKS_H */ diff --git a/include/linux/security.h b/include/linux/security.h index 1390f1efb4f0..7c6b9b038a0d 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -336,7 +336,7 @@ int security_dentry_create_files_as(struct dentry *dentry, int mode, struct cred *new); int security_path_notify(const struct path *path, u64 mask, unsigned int obj_type); -int security_inode_alloc(struct inode *inode); +int security_inode_alloc(struct inode *inode, gfp_t gfp); void security_inode_free(struct inode *inode); int security_inode_init_security(struct inode *inode, struct inode *dir, const struct qstr *qstr, @@ -769,7 +769,7 @@ static inline int security_path_notify(const struct path *path, u64 mask, return 0; } -static inline int security_inode_alloc(struct inode *inode) +static inline int security_inode_alloc(struct inode *inode, gfp_t gfp) { return 0; } diff --git a/security/security.c b/security/security.c index 8cee5b6c6e6d..3581262da5ee 100644 --- a/security/security.c +++ b/security/security.c @@ -660,14 +660,14 @@ static int lsm_file_alloc(struct file *file) * * Returns 0, or -ENOMEM if memory can't be allocated. */ -int lsm_inode_alloc(struct inode *inode) +int lsm_inode_alloc(struct inode *inode, gfp_t gfp) { if (!lsm_inode_cache) { inode->i_security = NULL; return 0; } - inode->i_security = kmem_cache_zalloc(lsm_inode_cache, GFP_NOFS); + inode->i_security = kmem_cache_zalloc(lsm_inode_cache, gfp); if (inode->i_security == NULL) return -ENOMEM; return 0; @@ -1582,9 +1582,9 @@ int security_path_notify(const struct path *path, u64 mask, * * Return: Return 0 if operation was successful. */ -int security_inode_alloc(struct inode *inode) +int security_inode_alloc(struct inode *inode, gfp_t gfp) { - int rc = lsm_inode_alloc(inode); + int rc = lsm_inode_alloc(inode, gfp); if (unlikely(rc)) return rc;