ceph already splices the correct dentry (in splice_dentry()) from the result of mkdir but does nothing more with it. Now that ->mkdir can return a dentry, return the correct dentry. Signed-off-by: NeilBrown <neilb@xxxxxxx> --- fs/ceph/dir.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 39e0f240de06..c1a1c168bb27 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -1099,6 +1099,7 @@ static struct dentry *ceph_mkdir(struct mnt_idmap *idmap, struct inode *dir, struct ceph_client *cl = mdsc->fsc->client; struct ceph_mds_request *req; struct ceph_acl_sec_ctx as_ctx = {}; + struct dentry *ret = NULL; int err; int op; @@ -1166,14 +1167,20 @@ static struct dentry *ceph_mkdir(struct mnt_idmap *idmap, struct inode *dir, !req->r_reply_info.head->is_dentry) err = ceph_handle_notrace_create(dir, dentry); out_req: + if (!err && req->r_dentry != dentry) + /* Some other dentry was spliced in */ + ret = dget(req->r_dentry); ceph_mdsc_put_request(req); out: if (!err) + /* Should this use 'ret' ?? */ ceph_init_inode_acls(d_inode(dentry), &as_ctx); else d_drop(dentry); ceph_release_acl_sec_ctx(&as_ctx); - return ERR_PTR(err); + if (err) + return ERR_PTR(err); + return ret; } static int ceph_link(struct dentry *old_dentry, struct inode *dir, -- 2.47.1