Loading fs/nfsd/nfs4xdr.c +18 −12 Original line number 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; } 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 * 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. */ if (ignore_crossmnt == 0 && dentry == exp->ex_path.mnt->mnt_root) { struct path path = exp->ex_path; 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; } dentry == exp->ex_path.mnt->mnt_root) get_parent_attributes(exp, &stat); WRITE64(stat.ino); } if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { Loading Loading
fs/nfsd/nfs4xdr.c +18 −12 Original line number 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; } 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 * 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. */ if (ignore_crossmnt == 0 && dentry == exp->ex_path.mnt->mnt_root) { struct path path = exp->ex_path; 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; } dentry == exp->ex_path.mnt->mnt_root) get_parent_attributes(exp, &stat); WRITE64(stat.ino); } if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { Loading