Loading fs/nfsd/nfs4xdr.c +18 −12 Original line number Original line Diff line number Diff line Loading @@ -2014,6 +2014,22 @@ static __be32 fattr_handle_absent_fs(u32 *bmval0, u32 *bmval1, u32 *rdattr_err) return 0; return 0; } } static int get_parent_attributes(struct svc_export *exp, struct kstat *stat) { struct path path = exp->ex_path; int err; path_get(&path); while (follow_up(&path)) { if (path.dentry != path.mnt->mnt_root) break; } err = vfs_getattr(path.mnt, path.dentry, stat); path_put(&path); return err; } /* /* * Note: @fhp can be NULL; in this case, we might have to compose the filehandle * Note: @fhp can be NULL; in this case, we might have to compose the filehandle * ourselves. * ourselves. Loading Loading @@ -2430,18 +2446,8 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, * and this is the root of a cross-mounted filesystem. * and this is the root of a cross-mounted filesystem. */ */ if (ignore_crossmnt == 0 && if (ignore_crossmnt == 0 && dentry == exp->ex_path.mnt->mnt_root) { dentry == exp->ex_path.mnt->mnt_root) struct path path = exp->ex_path; get_parent_attributes(exp, &stat); path_get(&path); while (follow_up(&path)) { if (path.dentry != path.mnt->mnt_root) break; } err = vfs_getattr(path.mnt, path.dentry, &stat); path_put(&path); if (err) goto out_nfserr; } WRITE64(stat.ino); WRITE64(stat.ino); } } if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { Loading Loading
fs/nfsd/nfs4xdr.c +18 −12 Original line number Original line Diff line number Diff line Loading @@ -2014,6 +2014,22 @@ static __be32 fattr_handle_absent_fs(u32 *bmval0, u32 *bmval1, u32 *rdattr_err) return 0; return 0; } } static int get_parent_attributes(struct svc_export *exp, struct kstat *stat) { struct path path = exp->ex_path; int err; path_get(&path); while (follow_up(&path)) { if (path.dentry != path.mnt->mnt_root) break; } err = vfs_getattr(path.mnt, path.dentry, stat); path_put(&path); return err; } /* /* * Note: @fhp can be NULL; in this case, we might have to compose the filehandle * Note: @fhp can be NULL; in this case, we might have to compose the filehandle * ourselves. * ourselves. Loading Loading @@ -2430,18 +2446,8 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp, * and this is the root of a cross-mounted filesystem. * and this is the root of a cross-mounted filesystem. */ */ if (ignore_crossmnt == 0 && if (ignore_crossmnt == 0 && dentry == exp->ex_path.mnt->mnt_root) { dentry == exp->ex_path.mnt->mnt_root) struct path path = exp->ex_path; get_parent_attributes(exp, &stat); path_get(&path); while (follow_up(&path)) { if (path.dentry != path.mnt->mnt_root) break; } err = vfs_getattr(path.mnt, path.dentry, &stat); path_put(&path); if (err) goto out_nfserr; } WRITE64(stat.ino); WRITE64(stat.ino); } } if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { Loading