Xiubo Li <xiubli@xxxxxxxxxx> writes: > On 6/6/23 14:25, Milind Changire wrote: >> nit: >> the commit title refers to ceph_open() but the code changes are >> pertaining to ceph_lookup() > > Good catch. > > I couldn't remember why we didn't fix this before as I remembered I have found > this. Yeah, it's really odd we didn't catch this before. I had to go look at old email: this helper was initially used in ceph_atomic_open() only, but then in v3 it was made more generic so that it could also be used in ceph_lookup(). Xiubo, do you want me to send out a new version of this patch, or are you OK simply updating the subject, using 'ceph_lookup' instead of 'ceph_open'? Cheers, -- Luís > Thanks > > - Xiubo > > >> Otherwise it looks good to me. >> >> Reviewed-by: Milind Changire <mchangir@xxxxxxxxxx> >> >> On Mon, Apr 17, 2023 at 9:03 AM <xiubli@xxxxxxxxxx> wrote: >>> From: Luís Henriques <lhenriques@xxxxxxx> >>> >>> Instead of setting the no-key dentry in ceph_lookup(), use the new >>> fscrypt_prepare_lookup_partial() helper. We still need to mark the >>> directory as incomplete if the directory was just unlocked. >>> >>> Tested-by: Luís Henriques <lhenriques@xxxxxxx> >>> Tested-by: Venky Shankar <vshankar@xxxxxxxxxx> >>> Signed-off-by: Luís Henriques <lhenriques@xxxxxxx> >>> Signed-off-by: Xiubo Li <xiubli@xxxxxxxxxx> >>> --- >>> fs/ceph/dir.c | 13 +++++++------ >>> 1 file changed, 7 insertions(+), 6 deletions(-) >>> >>> diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c >>> index fe48a5d26c1d..c28de23e12a1 100644 >>> --- a/fs/ceph/dir.c >>> +++ b/fs/ceph/dir.c >>> @@ -784,14 +784,15 @@ static struct dentry *ceph_lookup(struct inode *dir, struct dentry *dentry, >>> return ERR_PTR(-ENAMETOOLONG); >>> >>> if (IS_ENCRYPTED(dir)) { >>> - err = ceph_fscrypt_prepare_readdir(dir); >>> + bool had_key = fscrypt_has_encryption_key(dir); >>> + >>> + err = fscrypt_prepare_lookup_partial(dir, dentry); >>> if (err < 0) >>> return ERR_PTR(err); >>> - if (!fscrypt_has_encryption_key(dir)) { >>> - spin_lock(&dentry->d_lock); >>> - dentry->d_flags |= DCACHE_NOKEY_NAME; >>> - spin_unlock(&dentry->d_lock); >>> - } >>> + >>> + /* mark directory as incomplete if it has been unlocked */ >>> + if (!had_key && fscrypt_has_encryption_key(dir)) >>> + ceph_dir_clear_complete(dir); >>> } >>> >>> /* can we conclude ENOENT locally? */ >>> -- >>> 2.39.1 >>> >> >