Skip to content

Commit 5148946

Browse files
author
Ian Kent
committed
kernfs: change kernfs_rename_lock into a read-write lock
JIRA: https://issues.redhat.com/browse/RHEL-52956 Upstream status: Linus commit 06fb473 Author: Imran Khan <imran.f.khan@oracle.com> Date: Thu Mar 9 22:09:32 2023 +1100 kernfs: change kernfs_rename_lock into a read-write lock. kernfs_rename_lock protects a node's ->parent and thus kernfs topology. Thus it can be used in cases that rely on a stable kernfs topology. Change it to a read-write lock for better scalability. Suggested by: Al Viro <viro@zeniv.linux.org.uk> Reviewed-by: Matthew Wilcox (Oracle) <willy@infradead.org> Signed-off-by: Imran Khan <imran.f.khan@oracle.com> Link: https://lore.kernel.org/r/20230309110932.2889010-4-imran.f.khan@oracle.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Ian Kent <ikent@redhat.com>
1 parent af84d28 commit 5148946

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

fs/kernfs/dir.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
#include "kernfs-internal.h"
1919

20-
static DEFINE_SPINLOCK(kernfs_rename_lock); /* kn->parent and ->name */
20+
static DEFINE_RWLOCK(kernfs_rename_lock); /* kn->parent and ->name */
2121
/*
2222
* Don't use rename_lock to piggy back on pr_cont_buf. We don't want to
2323
* call pr_cont() while holding rename_lock. Because sometimes pr_cont()
@@ -197,9 +197,9 @@ int kernfs_name(struct kernfs_node *kn, char *buf, size_t buflen)
197197
unsigned long flags;
198198
int ret;
199199

200-
spin_lock_irqsave(&kernfs_rename_lock, flags);
200+
read_lock_irqsave(&kernfs_rename_lock, flags);
201201
ret = kernfs_name_locked(kn, buf, buflen);
202-
spin_unlock_irqrestore(&kernfs_rename_lock, flags);
202+
read_unlock_irqrestore(&kernfs_rename_lock, flags);
203203
return ret;
204204
}
205205

@@ -225,9 +225,9 @@ int kernfs_path_from_node(struct kernfs_node *to, struct kernfs_node *from,
225225
unsigned long flags;
226226
int ret;
227227

228-
spin_lock_irqsave(&kernfs_rename_lock, flags);
228+
read_lock_irqsave(&kernfs_rename_lock, flags);
229229
ret = kernfs_path_from_node_locked(to, from, buf, buflen);
230-
spin_unlock_irqrestore(&kernfs_rename_lock, flags);
230+
read_unlock_irqrestore(&kernfs_rename_lock, flags);
231231
return ret;
232232
}
233233
EXPORT_SYMBOL_GPL(kernfs_path_from_node);
@@ -293,10 +293,10 @@ struct kernfs_node *kernfs_get_parent(struct kernfs_node *kn)
293293
struct kernfs_node *parent;
294294
unsigned long flags;
295295

296-
spin_lock_irqsave(&kernfs_rename_lock, flags);
296+
read_lock_irqsave(&kernfs_rename_lock, flags);
297297
parent = kn->parent;
298298
kernfs_get(parent);
299-
spin_unlock_irqrestore(&kernfs_rename_lock, flags);
299+
read_unlock_irqrestore(&kernfs_rename_lock, flags);
300300

301301
return parent;
302302
}
@@ -1720,7 +1720,7 @@ int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
17201720
kernfs_get(new_parent);
17211721

17221722
/* rename_lock protects ->parent and ->name accessors */
1723-
spin_lock_irq(&kernfs_rename_lock);
1723+
write_lock_irq(&kernfs_rename_lock);
17241724

17251725
old_parent = kn->parent;
17261726
kn->parent = new_parent;
@@ -1731,7 +1731,7 @@ int kernfs_rename_ns(struct kernfs_node *kn, struct kernfs_node *new_parent,
17311731
kn->name = new_name;
17321732
}
17331733

1734-
spin_unlock_irq(&kernfs_rename_lock);
1734+
write_unlock_irq(&kernfs_rename_lock);
17351735

17361736
kn->hash = kernfs_name_hash(kn->name, kn->ns);
17371737
kernfs_link_sibling(kn);

0 commit comments

Comments
 (0)