From db1c02cc2889e9008e1c5e74fc192064b162ebd7 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 2 Nov 2010 14:21:06 -0400 Subject: [PATCH] set REPARSE_POINT attr only if symlink_support attr is set --- daemon/nfs41_types.h | 1 + daemon/nfs41_xdr.c | 4 ++++ daemon/volume.c | 7 ++++--- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/daemon/nfs41_types.h b/daemon/nfs41_types.h index 73065a0..19d9ac1 100644 --- a/daemon/nfs41_types.h +++ b/daemon/nfs41_types.h @@ -190,6 +190,7 @@ typedef struct __nfs41_file_info { bool_t case_insensitive; bool_t case_preserving; bool_t symlink_dir; + bool_t symlink_support; } nfs41_file_info; #endif /* !__NFS41_DAEMON_TYPES_H__ */ diff --git a/daemon/nfs41_xdr.c b/daemon/nfs41_xdr.c index 3dfcb74..0c689b4 100644 --- a/daemon/nfs41_xdr.c +++ b/daemon/nfs41_xdr.c @@ -1552,6 +1552,10 @@ static bool_t decode_file_attrs( if (!xdr_u_hyper(xdr, &info->size)) return FALSE; } + if (attrs->attrmask.arr[0] & FATTR4_WORD0_SYMLINK_SUPPORT) { + if (!xdr_bool(xdr, &info->symlink_support)) + return FALSE; + } if (attrs->attrmask.arr[0] & FATTR4_WORD0_FSID) { if (!xdr_fsid(xdr, &info->fsid)) return FALSE; diff --git a/daemon/volume.c b/daemon/volume.c index c232331..e25a42f 100644 --- a/daemon/volume.c +++ b/daemon/volume.c @@ -96,7 +96,7 @@ static int handle_volume_attributes( /* query the case_ attributes of the root filesystem */ nfs41_file_info info = { 0 }; bitmap4 attr_request = { 1, { FATTR4_WORD0_CASE_INSENSITIVE | - FATTR4_WORD0_CASE_PRESERVING } }; + FATTR4_WORD0_CASE_PRESERVING | FATTR4_WORD0_SYMLINK_SUPPORT} }; PFILE_FS_ATTRIBUTE_INFORMATION attr = &args->info.attribute; int status = NO_ERROR; @@ -108,8 +108,9 @@ static int handle_volume_attributes( goto out; } - attr->FileSystemAttributes = FILE_SUPPORTS_REMOTE_STORAGE | - FILE_SUPPORTS_REPARSE_POINTS; + attr->FileSystemAttributes = FILE_SUPPORTS_REMOTE_STORAGE; + if (info.symlink_support) + attr->FileSystemAttributes |= FILE_SUPPORTS_REPARSE_POINTS; if (info.case_preserving) attr->FileSystemAttributes |= FILE_CASE_PRESERVED_NAMES; if (!info.case_insensitive)