blob: 63943f84fb94029be9f104a5f1f07fe984fba715 [file] [log] [blame]
developer5d148cb2023-06-02 13:08:11 +08001From d08d34636d1384d5ddb141e0bb72afa591c12118 Mon Sep 17 00:00:00 2001
2From: Sam Shih <sam.shih@mediatek.com>
3Date: Fri, 2 Jun 2023 13:06:22 +0800
4Subject: [PATCH]
5 [spi-and-storage][999-2380-fix-dirty-race-between-do_tmpfile.patch]
6
7---
8 fs/ubifs/dir.c | 60 +++++++++++++++++++++++++-------------------------
9 1 file changed, 30 insertions(+), 30 deletions(-)
10
developer21425092022-06-08 17:05:12 +080011diff --git a/fs/ubifs/dir.c b/fs/ubifs/dir.c
developer5d148cb2023-06-02 13:08:11 +080012index 332c0b02a..97b231c43 100644
developer21425092022-06-08 17:05:12 +080013--- a/fs/ubifs/dir.c
14+++ b/fs/ubifs/dir.c
15@@ -356,6 +356,32 @@ out_budg:
16 return err;
17 }
18
19+/**
20+ * lock_2_inodes - a wrapper for locking two UBIFS inodes.
21+ * @inode1: first inode
22+ * @inode2: second inode
23+ *
24+ * We do not implement any tricks to guarantee strict lock ordering, because
25+ * VFS has already done it for us on the @i_mutex. So this is just a simple
26+ * wrapper function.
27+ */
28+static void lock_2_inodes(struct inode *inode1, struct inode *inode2)
29+{
30+ mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
31+ mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
32+}
33+
34+/**
35+ * unlock_2_inodes - a wrapper for unlocking two UBIFS inodes.
36+ * @inode1: first inode
37+ * @inode2: second inode
38+ */
39+static void unlock_2_inodes(struct inode *inode1, struct inode *inode2)
40+{
41+ mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
42+ mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
43+}
44+
45 static int do_tmpfile(struct inode *dir, struct dentry *dentry,
46 umode_t mode, struct inode **whiteout)
47 {
48@@ -364,7 +390,7 @@ static int do_tmpfile(struct inode *dir, struct dentry *dentry,
49 struct ubifs_budget_req req = { .new_ino = 1, .new_dent = 1,
50 .dirtied_ino = 1};
51 struct ubifs_budget_req ino_req = { .dirtied_ino = 1 };
52- struct ubifs_inode *ui, *dir_ui = ubifs_inode(dir);
53+ struct ubifs_inode *ui;
54 int err, instantiated = 0;
55 struct fscrypt_name nm;
56
57@@ -426,18 +452,18 @@ static int do_tmpfile(struct inode *dir, struct dentry *dentry,
58 instantiated = 1;
59 mutex_unlock(&ui->ui_mutex);
60
61- mutex_lock(&dir_ui->ui_mutex);
62+ lock_2_inodes(dir, inode);
63 err = ubifs_jnl_update(c, dir, &nm, inode, 1, 0);
64 if (err)
65 goto out_cancel;
66- mutex_unlock(&dir_ui->ui_mutex);
67+ unlock_2_inodes(dir, inode);
68
69 ubifs_release_budget(c, &req);
70
71 return 0;
72
73 out_cancel:
74- mutex_unlock(&dir_ui->ui_mutex);
75+ unlock_2_inodes(dir, inode);
76 out_inode:
77 make_bad_inode(inode);
78 if (!instantiated)
79@@ -672,32 +698,6 @@ static int ubifs_dir_release(struct inode *dir, struct file *file)
80 return 0;
81 }
82
83-/**
84- * lock_2_inodes - a wrapper for locking two UBIFS inodes.
85- * @inode1: first inode
86- * @inode2: second inode
87- *
88- * We do not implement any tricks to guarantee strict lock ordering, because
89- * VFS has already done it for us on the @i_mutex. So this is just a simple
90- * wrapper function.
91- */
92-static void lock_2_inodes(struct inode *inode1, struct inode *inode2)
93-{
94- mutex_lock_nested(&ubifs_inode(inode1)->ui_mutex, WB_MUTEX_1);
95- mutex_lock_nested(&ubifs_inode(inode2)->ui_mutex, WB_MUTEX_2);
96-}
97-
98-/**
99- * unlock_2_inodes - a wrapper for unlocking two UBIFS inodes.
100- * @inode1: first inode
101- * @inode2: second inode
102- */
103-static void unlock_2_inodes(struct inode *inode1, struct inode *inode2)
104-{
105- mutex_unlock(&ubifs_inode(inode2)->ui_mutex);
106- mutex_unlock(&ubifs_inode(inode1)->ui_mutex);
107-}
108-
109 static int ubifs_link(struct dentry *old_dentry, struct inode *dir,
110 struct dentry *dentry)
111 {
developer5d148cb2023-06-02 13:08:11 +0800112--
1132.34.1
114