Re: [PATCH 5/5] Change vfs_mkdir() to unlock on failure.
Amir Goldstein <[email protected]>
| Newsgroups | gmane.comp.file-systems.ecryptfs.general,gmane.linux.file-systems,gmane.comp.file-systems.coda.general,gmane.linux.nfs,gmane.linux.file-systems.union,gmane.linux.kernel |
|---|---|
| Message-ID | <CAOQ4uxiV6Ay7iaxi3qw4nYTiVTZ6abH+W6o3z1OJVwf6ySOrzg@mail.gmail.com> |
On Mon, Jun 9, 2025 at 1:10 AM NeilBrown <[email protected]> wrote: > > Proposed changes to directory-op locking will lock the dentry rather > than the whole directory. So the dentry will need to be unlocked. > > vfs_mkdir() consumes the dentry on error, so there will be no dentry to > be unlocked. > > So change vfs_mkdir() to unlock on error as well as releasing the > dentry. This requires various other functions in various callers to > also unlock on error. > That's a scary subtle API change to make. If the change to mkdir API wasn't only in v6.15, that would have been a lethal backporting bug landmine. Anyway, a shiny porting.rst comment is due. > At present this results in some clumsy code. Once the transition to > dentry locking is complete the clumsiness will be gone. > > overlayfs looks particularly clumsy as in some cases a double-directory > rename lock is taken, and a mkdir is then performed in one of the > directories. If that fails the other directory must be unlocked. Can some of this mess be abstracted with a helper like unlock_new_dir(struct dentry *newdir) which is tolerant to PTR_ERR? I will refrain from reviewing the ovl patch because you said you found a bug in it and because I hope it may be easier to review with the proposed cleanup helper. > > Signed-off-by: NeilBrown <[email protected]> > --- ... > diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h > index 8baaba0a3fe5..44df3a2449e7 100644 > --- a/fs/overlayfs/overlayfs.h > +++ b/fs/overlayfs/overlayfs.h > @@ -248,6 +248,7 @@ static inline struct dentry *ovl_do_mkdir(struct ovl_fs *ofs, > { > dentry = vfs_mkdir(ovl_upper_mnt_idmap(ofs), dir, dentry, mode); > pr_debug("mkdir(%pd2, 0%o) = %i\n", dentry, mode, PTR_ERR_OR_ZERO(dentry)); > + /* Note: dir will have been unlocked on failure */ > return dentry; > } > Your previous APi change introduced a regression here. The name will not be printed in the error case. I will post a fix. Thanks, Amir.