Messages in this thread | | | Subject | Re: [PATCH 1/3] fs/dcache: Add d_clear_dir_neg_dentries() | From | André Almeida <> | Date | Sun, 28 Mar 2021 12:49:01 -0300 |
| |
Às 12:07 de 28/03/21, Matthew Wilcox escreveu: > On Sun, Mar 28, 2021 at 11:43:54AM -0300, André Almeida wrote: >> +/** >> + * d_clear_dir_neg_dentries - Remove negative dentries in an inode >> + * @dir: Directory to clear negative dentries >> + * >> + * For directories with negative dentries that are becoming case-insensitive >> + * dirs, we need to remove all those negative dentries, otherwise they will >> + * become dangling dentries. During the creation of a new file, if a d_hash >> + * collision happens and the names match in a case-insensitive, the name of >> + * the file will be the name defined at the negative dentry, that can be >> + * different from the specified by the user. To prevent this from happening, we >> + * need to remove all dentries in a directory. Given that the directory must be >> + * empty before we call this function we are sure that all dentries there will >> + * be negative. >> + */ > > This is quite the landmine of a function. It _assumes_ that the directory > is empty, and clears all dentries in it. > >> +void d_clear_dir_neg_dentries(struct inode *dir) >> +{ >> + struct dentry *alias, *dentry; >> + >> + hlist_for_each_entry(alias, &dir->i_dentry, d_u.d_alias) { >> + list_for_each_entry(dentry, &alias->d_subdirs, d_child) { >> + d_drop(dentry); >> + dput(dentry); >> + } > > I would be happier if it included a check for negativity. d_is_negative() > or maybe this newfangled d_really_is_negative() (i haven't stayed up > to speed on the precise difference between the two) >
Makes sense. And given that this only makes sense if the directory is empty, if it founds a non-negative dentry, it should return some error right?
>> + } >> +} >> +EXPORT_SYMBOL(d_clear_dir_neg_dentries); > > I'd rather see this _GPL for such an internal thing. >
| |