On Wed, Feb 12, 2020 at 05:55:11AM +0000, Al Viro wrote: > 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). After the patch earlier in the series that created generic_ci_d_compare() and switched f2fs to use it, f2fs_ci_compare() is only called when the filesystem is actually searching a directory, not from ->d_compare(). So the names and parent->d_inode are stable in it. But, that also means the GFP_ATOMIC isn't needed, and f2fs_ci_compare() should be made 'static'. - Eric