|
@@ -1201,6 +1201,28 @@ nfsd_create_locked(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
|
|
break;
|
|
|
case S_IFDIR:
|
|
|
host_err = vfs_mkdir(dirp, dchild, iap->ia_mode);
|
|
|
+ if (!host_err && unlikely(d_unhashed(dchild))) {
|
|
|
+ struct dentry *d;
|
|
|
+ d = lookup_one_len(dchild->d_name.name,
|
|
|
+ dchild->d_parent,
|
|
|
+ dchild->d_name.len);
|
|
|
+ if (IS_ERR(d)) {
|
|
|
+ host_err = PTR_ERR(d);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (unlikely(d_is_negative(d))) {
|
|
|
+ dput(d);
|
|
|
+ err = nfserr_serverfault;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ dput(resfhp->fh_dentry);
|
|
|
+ resfhp->fh_dentry = dget(d);
|
|
|
+ err = fh_update(resfhp);
|
|
|
+ dput(dchild);
|
|
|
+ dchild = d;
|
|
|
+ if (err)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
break;
|
|
|
case S_IFCHR:
|
|
|
case S_IFBLK:
|