hc
2023-11-30 6c9be420e167ee7ce45c0309586f09ddab28ac15
kernel/fs/nfs/unlink.c
....@@ -13,7 +13,7 @@
1313 #include <linux/sunrpc/clnt.h>
1414 #include <linux/nfs_fs.h>
1515 #include <linux/sched.h>
16
-#include <linux/wait.h>
16
+#include <linux/swait.h>
1717 #include <linux/namei.h>
1818 #include <linux/fsnotify.h>
1919
....@@ -52,6 +52,29 @@
5252 rpc_restart_call_prepare(task);
5353 }
5454
55
+#ifdef CONFIG_PREEMPT_RT_BASE
56
+static void nfs_down_anon(struct semaphore *sema)
57
+{
58
+ down(sema);
59
+}
60
+
61
+static void nfs_up_anon(struct semaphore *sema)
62
+{
63
+ up(sema);
64
+}
65
+
66
+#else
67
+static void nfs_down_anon(struct rw_semaphore *rwsem)
68
+{
69
+ down_read_non_owner(rwsem);
70
+}
71
+
72
+static void nfs_up_anon(struct rw_semaphore *rwsem)
73
+{
74
+ up_read_non_owner(rwsem);
75
+}
76
+#endif
77
+
5578 /**
5679 * nfs_async_unlink_release - Release the sillydelete data.
5780 * @task: rpc_task of the sillydelete
....@@ -65,7 +88,7 @@
6588 struct dentry *dentry = data->dentry;
6689 struct super_block *sb = dentry->d_sb;
6790
68
- up_read_non_owner(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem);
91
+ nfs_up_anon(&NFS_I(d_inode(dentry->d_parent))->rmdir_sem);
6992 d_lookup_done(dentry);
7093 nfs_free_unlinkdata(data);
7194 dput(dentry);
....@@ -118,10 +141,10 @@
118141 struct inode *dir = d_inode(dentry->d_parent);
119142 struct dentry *alias;
120143
121
- down_read_non_owner(&NFS_I(dir)->rmdir_sem);
144
+ nfs_down_anon(&NFS_I(dir)->rmdir_sem);
122145 alias = d_alloc_parallel(dentry->d_parent, &data->args.name, &data->wq);
123146 if (IS_ERR(alias)) {
124
- up_read_non_owner(&NFS_I(dir)->rmdir_sem);
147
+ nfs_up_anon(&NFS_I(dir)->rmdir_sem);
125148 return 0;
126149 }
127150 if (!d_in_lookup(alias)) {
....@@ -143,7 +166,7 @@
143166 ret = 0;
144167 spin_unlock(&alias->d_lock);
145168 dput(alias);
146
- up_read_non_owner(&NFS_I(dir)->rmdir_sem);
169
+ nfs_up_anon(&NFS_I(dir)->rmdir_sem);
147170 /*
148171 * If we'd displaced old cached devname, free it. At that
149172 * point dentry is definitely not a root, so we won't need
....@@ -183,7 +206,7 @@
183206 goto out_free_name;
184207 }
185208 data->res.dir_attr = &data->dir_attr;
186
- init_waitqueue_head(&data->wq);
209
+ init_swait_queue_head(&data->wq);
187210
188211 status = -EBUSY;
189212 spin_lock(&dentry->d_lock);