Re: [RESEND PATCH v2] hfsplus: prevent negative dentries when casefolded

From: Chung-Chiang Cheng
Date: Mon Jul 19 2021 - 05:03:53 EST


This function revalidates dentries without blocking and storing to the
dentry. As the document mentioned [1], I think it's safe in rcu-walk
mode. I also found jfs_ci_revalidate() takes the same approach.

        d_revalidate may be called in rcu-walk mode (flags & LOOKUP_RCU).
        If in rcu-walk mode, the filesystem must revalidate the dentry without
        blocking or storing to the dentry, d_parent and d_inode should not be
        used without care (because they can change and, in d_inode case, even
        become NULL under us


[1] https://www.kernel.org/doc/Documentation/filesystems/vfs.txt

Thanks,
C.C.Cheng

+
+int hfsplus_revalidate_dentry(struct dentry *dentry, unsigned int flags)
+{
What’s about this code?

If (flags & LOOKUP_RCU)
return -ECHILD;

Do we really need to miss it here?

Thanks,
Slava.


+ /*
+ * dentries are always valid when disabling casefold.
+ */
+ if (!test_bit(HFSPLUS_SB_CASEFOLD, &HFSPLUS_SB(dentry->d_sb)->flags))
+ return 1;
+
+ /*
+ * Positive dentries are valid when enabling casefold.
+ *
+ * Note, rename() to existing directory entry will have ->d_inode, and
+ * will use existing name which isn't specified name by user.
+ *
+ * We may be able to drop this positive dentry here. But dropping
+ * positive dentry isn't good idea. So it's unsupported like
+ * rename("filename", "FILENAME") for now.
+ */
+ if (d_really_is_positive(dentry))
+ return 1;
+
+ /*
+ * Drop the negative dentry, in order to make sure to use the case
+ * sensitive name which is specified by user if this is for creation.
+ */
+ if (flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET))
+ return 0;
+
+ return 1;
+}
--
2.25.1