summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-06 01:02:38 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-06 01:02:38 +0000
commit08b74a000942a380fe028845f92cd3a0dee827d5 (patch)
treeaa78b4e12607c3e1fcce8d5cc42df4330792f118 /debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch
parentAdding upstream version 4.19.249. (diff)
downloadlinux-debian.tar.xz
linux-debian.zip
Adding debian version 4.19.249-2.debian/4.19.249-2debian
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch')
-rw-r--r--debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch151
1 files changed, 151 insertions, 0 deletions
diff --git a/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch b/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch
new file mode 100644
index 000000000..4ff90ed43
--- /dev/null
+++ b/debian/patches-rt/0128-fs-nfs-turn-rmdir_sem-into-a-semaphore.patch
@@ -0,0 +1,151 @@
+From dbfda01f7e6e30541e35b49f6972022917fd685a Mon Sep 17 00:00:00 2001
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Thu, 15 Sep 2016 10:51:27 +0200
+Subject: [PATCH 128/347] fs/nfs: turn rmdir_sem into a semaphore
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.246-rt110.tar.xz
+
+The RW semaphore had a reader side which used the _non_owner version
+because it most likely took the reader lock in one thread and released it
+in another which would cause lockdep to complain if the "regular"
+version was used.
+On -RT we need the owner because the rw lock is turned into a rtmutex.
+The semaphores on the hand are "plain simple" and should work as
+expected. We can't have multiple readers but on -RT we don't allow
+multiple readers anyway so that is not a loss.
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ fs/nfs/dir.c | 8 ++++++++
+ fs/nfs/inode.c | 4 ++++
+ fs/nfs/unlink.c | 31 +++++++++++++++++++++++++++----
+ include/linux/nfs_fs.h | 4 ++++
+ 4 files changed, 43 insertions(+), 4 deletions(-)
+
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index 10bc04af2882..4999bd148491 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -1857,7 +1857,11 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry)
+
+ trace_nfs_rmdir_enter(dir, dentry);
+ if (d_really_is_positive(dentry)) {
++#ifdef CONFIG_PREEMPT_RT_BASE
++ down(&NFS_I(d_inode(dentry))->rmdir_sem);
++#else
+ down_write(&NFS_I(d_inode(dentry))->rmdir_sem);
++#endif
+ error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
+ /* Ensure the VFS deletes this inode */
+ switch (error) {
+@@ -1867,7 +1871,11 @@ int nfs_rmdir(struct inode *dir, struct dentry *dentry)
+ case -ENOENT:
+ nfs_dentry_handle_enoent(dentry);
+ }
++#ifdef CONFIG_PREEMPT_RT_BASE
++ up(&NFS_I(d_inode(dentry))->rmdir_sem);
++#else
+ up_write(&NFS_I(d_inode(dentry))->rmdir_sem);
++#endif
+ } else
+ error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name);
+ trace_nfs_rmdir_exit(dir, dentry, error);
+diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
+index 592b95ab378b..4fc14fb50068 100644
+--- a/fs/nfs/inode.c
++++ b/fs/nfs/inode.c
+@@ -2105,7 +2105,11 @@ static void init_once(void *foo)
+ atomic_long_set(&nfsi->nrequests, 0);
+ atomic_long_set(&nfsi->commit_info.ncommit, 0);
+ atomic_set(&nfsi->commit_info.rpcs_out, 0);
++#ifdef CONFIG_PREEMPT_RT_BASE
++ sema_init(&nfsi->rmdir_sem, 1);
++#else
+ init_rwsem(&nfsi->rmdir_sem);
++#endif
+ mutex_init(&nfsi->commit_mutex);
+ nfs4_init_once(nfsi);
+ }
+diff --git a/fs/nfs/unlink.c b/fs/nfs/unlink.c
+index fd61bf0fce63..ce9100b5604d 100644
+--- a/fs/nfs/unlink.c
++++ b/fs/nfs/unlink.c
+@@ -52,6 +52,29 @@ static void nfs_async_unlink_done(struct rpc_task *task, void *calldata)
+ rpc_restart_call_prepare(task);
+ }
+
++#ifdef CONFIG_PREEMPT_RT_BASE
++static void nfs_down_anon(struct semaphore *sema)
++{
++ down(sema);
++}
++
++static void nfs_up_anon(struct semaphore *sema)
++{
++ up(sema);
++}
++
++#else
++static void nfs_down_anon(struct rw_semaphore *rwsem)
++{
++ down_read_non_owner(rwsem);
++}
++
++static void nfs_up_anon(struct rw_semaphore *rwsem)
++{
++ up_read_non_owner(rwsem);
++}
++#endif
++
+ /**
+ * nfs_async_unlink_release - Release the sillydelete data.
+ * @task: rpc_task of the sillydelete
+@@ -65,7 +88,7 @@ static void nfs_async_unlink_release(void *calldata)
+ struct dentry *dentry = data->dentry;
+ struct super_block *sb = dentry->d_sb;
+
+- up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem);
++ nfs_up_anon(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem);
+ d_lookup_done(dentry);
+ nfs_free_unlinkdata(data);
+ dput(dentry);
+@@ -118,10 +141,10 @@ static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nf
+ struct inode *dir = d_inode(dentry->d_parent);
+ struct dentry *alias;
+
+- down_read_non_owner(&NFS_I(dir)->rmdir_sem);
++ nfs_down_anon(&NFS_I(dir)->rmdir_sem);
+ alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq);
+ if (IS_ERR(alias)) {
+- up_read_non_owner(&NFS_I(dir)->rmdir_sem);
++ nfs_up_anon(&NFS_I(dir)->rmdir_sem);
+ return 0;
+ }
+ if (!d_in_lookup(alias)) {
+@@ -143,7 +166,7 @@ static int nfs_call_unlink(struct dentry *dentry, struct inode *inode, struct nf
+ ret = 0;
+ spin_unlock(&alias->d_lock);
+ dput(alias);
+- up_read_non_owner(&NFS_I(dir)->rmdir_sem);
++ nfs_up_anon(&NFS_I(dir)->rmdir_sem);
+ /*
+ * If we'd displaced old cached devname, free it. At that
+ * point dentry is definitely not a root, so we won't need
+diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
+index 8ea7ceed8285..d52dfae05d2a 100644
+--- a/include/linux/nfs_fs.h
++++ b/include/linux/nfs_fs.h
+@@ -164,7 +164,11 @@ struct nfs_inode {
+
+ /* Readers: in-flight sillydelete RPC calls */
+ /* Writers: rmdir */
++#ifdef CONFIG_PREEMPT_RT_BASE
++ struct semaphore rmdir_sem;
++#else
+ struct rw_semaphore rmdir_sem;
++#endif
+ struct mutex commit_mutex;
+
+ #if IS_ENABLED(CONFIG_NFS_V4)
+--
+2.36.1
+