From 1123e7b0efbe356dd193747aefebbf9345cb5758 Mon Sep 17 00:00:00 2001 From: Bill Zissimopoulos Date: Tue, 8 May 2018 10:51:29 -0700 Subject: [PATCH] dll: fuse: optimize symlinks aways when readlink returns -ENOSYS --- src/dll/fuse/fuse.c | 9 +++++++++ src/dll/fuse/library.h | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/dll/fuse/fuse.c b/src/dll/fuse/fuse.c index b3b522f7..d742642d 100644 --- a/src/dll/fuse/fuse.c +++ b/src/dll/fuse/fuse.c @@ -376,6 +376,15 @@ static NTSTATUS fsp_fuse_svcstart(FSP_SERVICE *Service, ULONG argc, PWSTR *argv) &f->VolumeParams.VolumeCreationTime); } } + if (0 != f->ops.readlink) + { + char buf[FSP_FSCTL_TRANSACT_PATH_SIZEMAX / sizeof(WCHAR)]; + int err; + + /* this should always fail with ENOSYS or EINVAL */ + err = f->ops.readlink("/", buf, sizeof buf); + f->has_symlinks = -ENOSYS != err; + } /* the FSD does not currently limit these VolumeParams fields; do so here! */ if (f->VolumeParams.SectorSize < FSP_FUSE_SECTORSIZE_MIN || diff --git a/src/dll/fuse/library.h b/src/dll/fuse/library.h index 12474be7..96e7c962 100644 --- a/src/dll/fuse/library.h +++ b/src/dll/fuse/library.h @@ -29,7 +29,7 @@ #define FSP_FUSE_CONTEXT_FROM_HDR(h) \ (struct fuse_context *)((PUINT8)(h) + sizeof(struct fsp_fuse_context_header)) -#define FSP_FUSE_HAS_SYMLINKS(f) (0 != (f)->ops.readlink) +#define FSP_FUSE_HAS_SYMLINKS(f) ((f)->has_symlinks) struct fuse { @@ -44,6 +44,7 @@ struct fuse void *data; unsigned conn_want; BOOLEAN fsinit; + BOOLEAN has_symlinks; UINT32 DebugLog; FSP_FILE_SYSTEM_OPERATION_GUARD_STRATEGY OpGuardStrategy; FSP_FSCTL_VOLUME_PARAMS VolumeParams;