1 From: Felix Fietkau <nbd@nbd.name>
2 Subject: jffs2: use .rename2 and add RENAME_WHITEOUT support
4 It is required for renames on overlayfs
6 Signed-off-by: Felix Fietkau <nbd@nbd.name>
11 @@ -752,6 +752,24 @@ static int jffs2_mknod (struct inode *di
15 +static int jffs2_whiteout (struct inode *old_dir, struct dentry *old_dentry)
20 + wh = d_alloc(old_dentry->d_parent, &old_dentry->d_name);
24 + err = jffs2_mknod(old_dir, wh, S_IFCHR | WHITEOUT_MODE,
33 static int jffs2_rename (struct inode *old_dir_i, struct dentry *old_dentry,
34 struct inode *new_dir_i, struct dentry *new_dentry,
36 @@ -762,7 +780,7 @@ static int jffs2_rename (struct inode *o
40 - if (flags & ~RENAME_NOREPLACE)
41 + if (flags & ~(RENAME_NOREPLACE|RENAME_WHITEOUT))
44 /* The VFS will check for us and prevent trying to rename a
45 @@ -828,9 +846,14 @@ static int jffs2_rename (struct inode *o
46 if (d_is_dir(old_dentry) && !victim_f)
49 - /* Unlink the original */
50 - ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
51 - old_dentry->d_name.name, old_dentry->d_name.len, NULL, now);
52 + if (flags & RENAME_WHITEOUT)
53 + /* Replace with whiteout */
54 + ret = jffs2_whiteout(old_dir_i, old_dentry);
56 + /* Unlink the original */
57 + ret = jffs2_do_unlink(c, JFFS2_INODE_INFO(old_dir_i),
58 + old_dentry->d_name.name,
59 + old_dentry->d_name.len, NULL, now);
61 /* We don't touch inode->i_nlink */