On Tue, Feb 11, 2020 at 09:10:13PM -0800, Eric Biggers wrote: > How about: > > int f2fs_ci_compare(const struct inode *parent, const struct qstr *name, > u8 *de_name, size_t de_name_len, bool quick) > { > const struct super_block *sb = parent->i_sb; > const struct unicode_map *um = sb->s_encoding; > struct fscrypt_str decrypted_name = FSTR_INIT(NULL, de_name_len); > struct qstr entry = QSTR_INIT(de_name, de_name_len); > int ret; > > if (IS_ENCRYPTED(parent)) { oops. parent->d_inode is unstable here; could have become NULL by that point. > if (quick) > ret = utf8_strncasecmp_folded(um, name, &entry); > else > ret = utf8_strncasecmp(um, name, &entry); > if (ret < 0) { > /* Handle invalid character sequence as either an error > * or as an opaque byte sequence. > */ Really? How would the callers possibly tell mismatch from an error? And if they could, would would they *do* with that error, seeing that it might be an effect of a race with rename()? Again, ->d_compare() is NOT given a stable name. Or *parent. Or (parent->d_inode).