All of lore.kernel.org
 help / color / mirror / Atom feed
From: Amir Goldstein <amir73il@gmail.com>
To: Jan Kara <jack@suse.cz>
Cc: Matthew Bobrowski <repnop@google.com>, linux-fsdevel@vger.kernel.org
Subject: [PATCH v4 09/16] nfsd: use fsnotify group lock helpers
Date: Fri, 22 Apr 2022 15:03:20 +0300	[thread overview]
Message-ID: <20220422120327.3459282-10-amir73il@gmail.com> (raw)
In-Reply-To: <20220422120327.3459282-1-amir73il@gmail.com>

Before commit 9542e6a643fc6 ("nfsd: Containerise filecache laundrette")
nfsd would close open files in direct reclaim context and that could
cause a deadlock when fsnotify mark allocation went into direct reclaim
and nfsd shrinker tried to free existing fsnotify marks.

To avoid issues like this in future code, set the FSNOTIFY_GROUP_NOFS
flag on nfsd fsnotify group to prevent going into direct reclaim from
fsnotify_add_inode_mark().

Suggested-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20220321112310.vpr7oxro2xkz5llh@quack3.lan/
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
 fs/nfsd/filecache.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/fs/nfsd/filecache.c b/fs/nfsd/filecache.c
index 74ddb828fd75..489c9c1d8f31 100644
--- a/fs/nfsd/filecache.c
+++ b/fs/nfsd/filecache.c
@@ -119,14 +119,14 @@ nfsd_file_mark_find_or_create(struct nfsd_file *nf)
 	struct inode *inode = nf->nf_inode;
 
 	do {
-		mutex_lock(&nfsd_file_fsnotify_group->mark_mutex);
+		fsnotify_group_lock(nfsd_file_fsnotify_group);
 		mark = fsnotify_find_mark(&inode->i_fsnotify_marks,
-				nfsd_file_fsnotify_group);
+					  nfsd_file_fsnotify_group);
 		if (mark) {
 			nfm = nfsd_file_mark_get(container_of(mark,
 						 struct nfsd_file_mark,
 						 nfm_mark));
-			mutex_unlock(&nfsd_file_fsnotify_group->mark_mutex);
+			fsnotify_group_unlock(nfsd_file_fsnotify_group);
 			if (nfm) {
 				fsnotify_put_mark(mark);
 				break;
@@ -134,8 +134,9 @@ nfsd_file_mark_find_or_create(struct nfsd_file *nf)
 			/* Avoid soft lockup race with nfsd_file_mark_put() */
 			fsnotify_destroy_mark(mark, nfsd_file_fsnotify_group);
 			fsnotify_put_mark(mark);
-		} else
-			mutex_unlock(&nfsd_file_fsnotify_group->mark_mutex);
+		} else {
+			fsnotify_group_unlock(nfsd_file_fsnotify_group);
+		}
 
 		/* allocate a new nfm */
 		new = kmem_cache_alloc(nfsd_file_mark_slab, GFP_KERNEL);
@@ -679,7 +680,7 @@ nfsd_file_cache_init(void)
 	}
 
 	nfsd_file_fsnotify_group = fsnotify_alloc_group(&nfsd_file_fsnotify_ops,
-							0);
+							FSNOTIFY_GROUP_NOFS);
 	if (IS_ERR(nfsd_file_fsnotify_group)) {
 		pr_err("nfsd: unable to create fsnotify group: %ld\n",
 			PTR_ERR(nfsd_file_fsnotify_group));
-- 
2.35.1


  parent reply	other threads:[~2022-04-22 12:05 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-22 12:03 [PATCH v4 00/16] Evictable fanotify marks Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 01/16] inotify: show inotify mask flags in proc fdinfo Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 02/16] inotify: move control flags from mask to mark flags Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 03/16] fsnotify: fix wrong lockdep annotations Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 04/16] fsnotify: pass flags argument to fsnotify_alloc_group() Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 05/16] fsnotify: make allow_dups a property of the group Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 06/16] fsnotify: create helpers for group mark_mutex lock Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 07/16] inotify: use fsnotify group lock helpers Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 08/16] audit: " Amir Goldstein
2022-04-22 12:03 ` Amir Goldstein [this message]
2022-04-22 12:03 ` [PATCH v4 10/16] dnotify: " Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 11/16] fsnotify: allow adding an inode mark without pinning inode Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 12/16] fanotify: create helper fanotify_mark_user_flags() Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 13/16] fanotify: factor out helper fanotify_mark_update_flags() Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 14/16] fanotify: implement "evictable" inode marks Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 15/16] fanotify: use fsnotify group lock helpers Amir Goldstein
2022-04-22 12:03 ` [PATCH v4 16/16] fanotify: enable "evictable" inode marks Amir Goldstein
2022-04-25 12:59 ` [PATCH v4 00/16] Evictable fanotify marks Jan Kara
2022-04-25 13:32   ` Amir Goldstein

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220422120327.3459282-10-amir73il@gmail.com \
    --to=amir73il@gmail.com \
    --cc=jack@suse.cz \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=repnop@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.