diff --git a/ZFSin/zfs/cmd/kstat/kstat.vcxproj b/ZFSin/zfs/cmd/kstat/kstat.vcxproj index 0840982c..28cb574e 100644 --- a/ZFSin/zfs/cmd/kstat/kstat.vcxproj +++ b/ZFSin/zfs/cmd/kstat/kstat.vcxproj @@ -103,7 +103,7 @@ true __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreaded Console @@ -133,7 +133,7 @@ true __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreadedDebug Console diff --git a/ZFSin/zfs/cmd/zdb/zdb/zdb.vcxproj b/ZFSin/zfs/cmd/zdb/zdb/zdb.vcxproj index ad01f052..46815e4c 100644 --- a/ZFSin/zfs/cmd/zdb/zdb/zdb.vcxproj +++ b/ZFSin/zfs/cmd/zdb/zdb/zdb.vcxproj @@ -111,7 +111,7 @@ false __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreadedDebug 4146 @@ -164,8 +164,7 @@ false __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - - + MultiThreaded 4146 diff --git a/ZFSin/zfs/cmd/zfs/zfs/zfs.vcxproj b/ZFSin/zfs/cmd/zfs/zfs/zfs.vcxproj index aa5b7242..3949eb60 100644 --- a/ZFSin/zfs/cmd/zfs/zfs/zfs.vcxproj +++ b/ZFSin/zfs/cmd/zfs/zfs/zfs.vcxproj @@ -133,7 +133,7 @@ __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) false - + MultiThreadedDebug Console @@ -171,8 +171,7 @@ __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) false - - + MultiThreaded Console diff --git a/ZFSin/zfs/cmd/zfs/zfs_main.c b/ZFSin/zfs/cmd/zfs/zfs_main.c index cecd879a..8f42b2a7 100644 --- a/ZFSin/zfs/cmd/zfs/zfs_main.c +++ b/ZFSin/zfs/cmd/zfs/zfs_main.c @@ -2587,7 +2587,7 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space) if ((cb->cb_numname && cb->cb_sid2posix) || name == NULL) { if (nvlist_add_uint64(props, "name", rid) != 0) nomem(); - namelen = snprintf(NULL, 0, "%u", rid); + namelen = snprintf(NULL, 0, "%llu", rid); } else { if (nvlist_add_string(props, "name", name) != 0) nomem(); @@ -4014,7 +4014,7 @@ zfs_do_send(int argc, char **argv) } } - if (!flags.dryrun && win_isatty(STDOUT_FILENO)) { + if (!flags.dryrun && isatty(STDOUT_FILENO)) { (void) fprintf(stderr, gettext("Error: Stream can not be written to a terminal.\n" "You must redirect standard output.\n")); @@ -4267,7 +4267,7 @@ zfs_do_receive(int argc, char **argv) } - if (win_isatty(STDIN_FILENO)) { + if (isatty(STDIN_FILENO)) { (void) fprintf(stderr, gettext("Error: Backup stream can not be read " "from a terminal.\n" @@ -5334,7 +5334,7 @@ construct_fsacl_list(boolean_t un, struct allow_opts *opts, nvlist_t **nvlp) } } - (void) sprintf(id, "%u", rid); + (void) sprintf(id, "%llu", rid); who = id; store_allow_perm(who_type, opts->local, @@ -7116,7 +7116,7 @@ manual_mount(int argc, char **argv) /* check for legacy mountpoint and complain appropriately */ ret = 0; if (strcmp(mountpoint, ZFS_MOUNTPOINT_LEGACY) == 0) { - if (zmount(dataset, path, MS_OPTIONSTR | flags, MNTTYPE_ZFS, + if (zmount(zhp, path, MS_OPTIONSTR | flags, MNTTYPE_ZFS, NULL, 0, mntopts, sizeof (mntopts)) != 0) { #ifdef __APPLE__ if (errno == ENOTSUP && zfs_version > ZPL_VERSION) { diff --git a/ZFSin/zfs/cmd/zpool/zpool/zpool.vcxproj b/ZFSin/zfs/cmd/zpool/zpool/zpool.vcxproj index ba7ee2e3..57d81a5b 100644 --- a/ZFSin/zfs/cmd/zpool/zpool/zpool.vcxproj +++ b/ZFSin/zfs/cmd/zpool/zpool/zpool.vcxproj @@ -136,8 +136,7 @@ __x86_64;_CRT_SECURE_NO_WARNINGS false $(SolutionDir)/ZFSin/zfs/lib/libuuid;$(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - - + MultiThreadedDebug 4018;4242;4244 @@ -179,8 +178,7 @@ __x86_64;_CRT_SECURE_NO_WARNINGS false $(SolutionDir)/ZFSin/zfs/lib/libuuid;$(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - - + MultiThreaded 4018;4242;4244 diff --git a/ZFSin/zfs/cmd/zpool/zpool_main.c b/ZFSin/zfs/cmd/zpool/zpool_main.c index e83fb245..274ae9c9 100644 --- a/ZFSin/zfs/cmd/zpool/zpool_main.c +++ b/ZFSin/zfs/cmd/zpool/zpool_main.c @@ -4327,7 +4327,7 @@ static int get_columns(void) { CONSOLE_SCREEN_BUFFER_INFO csbi; - int columns, rows; + int columns /*, rows*/; csbi.srWindow.Right = 1; csbi.srWindow.Left = 80; @@ -8363,14 +8363,8 @@ zpool_do_events_next(ev_opts_t *opts) nvlist_t *nvl; int zevent_fd, ret, dropped; -#ifdef WIN32 - zevent_fd = CreateFile(ZFS_DEV, GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, 0, NULL); - VERIFY(zevent_fd != INVALID_HANDLE_VALUE); -#else zevent_fd = open(ZFS_DEV, O_RDWR); VERIFY(zevent_fd >= 0); -#endif if (!opts->scripted) (void) printf(gettext("%-30s %s\n"), "TIME", "CLASS"); @@ -8395,11 +8389,7 @@ zpool_do_events_next(ev_opts_t *opts) nvlist_free(nvl); } -#ifdef WIN32 - VERIFY(CloseHandle(zevent_fd)); -#else VERIFY(0 == close(zevent_fd)); -#endif return (ret); } diff --git a/ZFSin/zfs/cmd/zpool/zpool_vdev.c b/ZFSin/zfs/cmd/zpool/zpool_vdev.c index 452ba263..c879084d 100644 --- a/ZFSin/zfs/cmd/zpool/zpool_vdev.c +++ b/ZFSin/zfs/cmd/zpool/zpool_vdev.c @@ -606,7 +606,7 @@ is_whole_disk(const char *path) h = CreateFile(path, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if ((h == INVALID_HANDLE_VALUE)) return (B_FALSE); - if (efi_alloc_and_init(h, EFI_NUMPAR, &label) != 0) { + if (efi_alloc_and_init(HTOI(h), EFI_NUMPAR, &label) != 0) { (void) CloseHandle(h); return (B_FALSE); } @@ -799,7 +799,7 @@ make_leaf_vdev(nvlist_t *props, const char *arg, uint64_t is_log) return NULL; } - PARTITION_INFORMATION partInfo; + //PARTITION_INFORMATION partInfo; DWORD retcount = 0; //int err; char buf[1024]; @@ -815,7 +815,7 @@ make_leaf_vdev(nvlist_t *props, const char *arg, uint64_t is_log) (LPOVERLAPPED)NULL); if (err) isdisk++; fprintf(stderr, "DeviceName said %s with '%s'\n", err ? "OK" : "NG", buf); - DISK_GEOMETRY_EX *p = buf; + DISK_GEOMETRY_EX *p = (DISK_GEOMETRY_EX *)buf; err = DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, (LPVOID)NULL, @@ -826,7 +826,7 @@ make_leaf_vdev(nvlist_t *props, const char *arg, uint64_t is_log) (LPOVERLAPPED)NULL); if (err) isdisk++; fprintf(stderr, "DriveGeometry said %s\n", err ? "OK" : "NG"); - DRIVE_LAYOUT_INFORMATION_EX *x = buf; + DRIVE_LAYOUT_INFORMATION_EX *x = (DRIVE_LAYOUT_INFORMATION_EX *)buf; err = DeviceIoControl(h, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, (LPVOID)NULL, @@ -837,7 +837,7 @@ make_leaf_vdev(nvlist_t *props, const char *arg, uint64_t is_log) (LPOVERLAPPED)NULL); if (err) isdisk++; fprintf(stderr, "LayoutInfo said %s\n", err ? "OK" : "NG"); - VOLUME_DISK_EXTENTS *e = buf; + VOLUME_DISK_EXTENTS *e = (VOLUME_DISK_EXTENTS *)buf; err = DeviceIoControl(h, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, (LPVOID)NULL, @@ -1445,7 +1445,7 @@ make_disks(zpool_handle_t *zhp, nvlist_t *nv) h = CreateFile(path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (h != INVALID_HANDLE_VALUE) { struct dk_gpt *vtoc; - if ((efi_alloc_and_read(h, &vtoc)) == 0) { + if ((efi_alloc_and_read(HTOI(h), &vtoc)) == 0) { // Slice 1 should be ZFS snprintf(udevpath, MAXPATHLEN, "#%llu#%llu#%s", vtoc->efi_parts[0].p_start * (uint64_t)vtoc->efi_lbasize, diff --git a/ZFSin/zfs/cmd/zstreamdump/zstreamdump.c b/ZFSin/zfs/cmd/zstreamdump/zstreamdump.c index e34e527c..1416a23a 100644 --- a/ZFSin/zfs/cmd/zstreamdump/zstreamdump.c +++ b/ZFSin/zfs/cmd/zstreamdump/zstreamdump.c @@ -280,7 +280,7 @@ main(int argc, char *argv[]) } } - if (win_isatty((uintptr_t)STDIN_FILENO)) { + if (isatty(STDIN_FILENO)) { (void) fprintf(stderr, "Error: Backup stream can not be read " "from a terminal.\n" diff --git a/ZFSin/zfs/cmd/zstreamdump/zstreamdump/zstreamdump.vcxproj b/ZFSin/zfs/cmd/zstreamdump/zstreamdump/zstreamdump.vcxproj index 5f606b6b..61c820a9 100644 --- a/ZFSin/zfs/cmd/zstreamdump/zstreamdump/zstreamdump.vcxproj +++ b/ZFSin/zfs/cmd/zstreamdump/zstreamdump/zstreamdump.vcxproj @@ -113,7 +113,7 @@ true __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libuuid;$(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreadedDebug Console @@ -164,8 +164,7 @@ true __x86_64;_CRT_SECURE_NO_WARNINGS $(SolutionDir)/ZFSin/zfs/lib/libuuid;$(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - - + MultiThreaded Console diff --git a/ZFSin/zfs/include/libzfs_impl.h b/ZFSin/zfs/include/libzfs_impl.h index 43e827cd..b4581a98 100644 --- a/ZFSin/zfs/include/libzfs_impl.h +++ b/ZFSin/zfs/include/libzfs_impl.h @@ -65,7 +65,7 @@ typedef struct libzfs_fru { struct libzfs_handle { int libzfs_error; - HANDLE libzfs_fd; + int libzfs_fd; FILE *libzfs_mnttab; FILE *libzfs_sharetab; zpool_handle_t *libzfs_pool_handles; diff --git a/ZFSin/zfs/include/sys/efi_partition.h b/ZFSin/zfs/include/sys/efi_partition.h index 1953e818..ec68ae95 100644 --- a/ZFSin/zfs/include/sys/efi_partition.h +++ b/ZFSin/zfs/include/sys/efi_partition.h @@ -233,15 +233,15 @@ struct partition64 { #endif #ifndef _KERNEL -extern int efi_alloc_and_init(HANDLE, uint32_t, struct dk_gpt **); -extern int efi_alloc_and_read(HANDLE, struct dk_gpt **); -extern int efi_write(HANDLE, struct dk_gpt *); -extern int efi_rescan(HANDLE); +extern int efi_alloc_and_init(int, uint32_t, struct dk_gpt **); +extern int efi_alloc_and_read(int, struct dk_gpt **); +extern int efi_write(int, struct dk_gpt *); +extern int efi_rescan(int); extern void efi_free(struct dk_gpt *); -extern int efi_type(HANDLE); +extern int efi_type(int); extern void efi_err_check(struct dk_gpt *); -extern int efi_auto_sense(HANDLE fd, struct dk_gpt **); -extern int efi_use_whole_disk(HANDLE fd); +extern int efi_auto_sense(int fd, struct dk_gpt **); +extern int efi_use_whole_disk(int fd); #endif #ifdef __cplusplus diff --git a/ZFSin/zfs/include/sys/metaslab_impl.h b/ZFSin/zfs/include/sys/metaslab_impl.h index 7c86912a..9fc4a8f7 100644 --- a/ZFSin/zfs/include/sys/metaslab_impl.h +++ b/ZFSin/zfs/include/sys/metaslab_impl.h @@ -60,6 +60,7 @@ typedef struct metaslab_alloc_trace { * error conditions. These errors are stored to the offset member * of the metaslab_alloc_trace_t record and displayed by mdb. */ +#pragma warning (disable: 4146) typedef enum trace_alloc_type { TRACE_ALLOC_FAILURE = -1ULL, TRACE_TOO_SMALL = -2ULL, diff --git a/ZFSin/zfs/include/sys/zfs_context_userland.h b/ZFSin/zfs/include/sys/zfs_context_userland.h index 24f6f8e9..61abcf62 100644 --- a/ZFSin/zfs/include/sys/zfs_context_userland.h +++ b/ZFSin/zfs/include/sys/zfs_context_userland.h @@ -223,7 +223,7 @@ extern void zk_thread_join(pthread_t tid); */ #define MTX_MAGIC 0x9522f51362a6e326ull #define MTX_INIT ((void *)NULL) -#define MTX_DEST ((void *)-1UL) +#define MTX_DEST ((void *)-1ULL) typedef struct kmutex { void *m_owner; @@ -458,7 +458,6 @@ typedef struct vnode vnode_t; #ifdef _WIN32 #define vnode_vid(vp) ((vp)->v_id) -#define pwrite64 pwrite int vnode_getwithvid(vnode_t *vp, uint32_t id); int vnode_getwithref(vnode_t *vp); int vnode_put(vnode_t *vp); diff --git a/ZFSin/zfs/include/sys/zfs_windows.h b/ZFSin/zfs/include/sys/zfs_windows.h index 37579cf3..e018b48e 100644 --- a/ZFSin/zfs/include/sys/zfs_windows.h +++ b/ZFSin/zfs/include/sys/zfs_windows.h @@ -153,5 +153,6 @@ extern NTSTATUS ioctl_mountdev_query_suggested_link_name(PDEVICE_OBJECT, PIRP, P extern NTSTATUS ioctl_mountdev_query_stable_guid(PDEVICE_OBJECT, PIRP, PIO_STACK_LOCATION); extern NTSTATUS ioctl_query_stable_guid(PDEVICE_OBJECT, PIRP, PIO_STACK_LOCATION); +extern void fastio_init(FAST_IO_DISPATCH **fast); #endif diff --git a/ZFSin/zfs/lib/libavl/libavl/libavl.vcxproj b/ZFSin/zfs/lib/libavl/libavl/libavl.vcxproj index a9e9971c..41a22025 100644 --- a/ZFSin/zfs/lib/libavl/libavl/libavl.vcxproj +++ b/ZFSin/zfs/lib/libavl/libavl/libavl.vcxproj @@ -109,7 +109,7 @@ __x86_64 $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -117,8 +117,7 @@ __x86_64 $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libefi/libefi/libefi.vcxproj b/ZFSin/zfs/lib/libefi/libefi/libefi.vcxproj index 2a21777e..1842cd37 100644 --- a/ZFSin/zfs/lib/libefi/libefi/libefi.vcxproj +++ b/ZFSin/zfs/lib/libefi/libefi/libefi.vcxproj @@ -114,7 +114,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -122,8 +122,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libefi/rdwr_efi.c b/ZFSin/zfs/lib/libefi/rdwr_efi.c index 06a1a4af..11b5b9e2 100644 --- a/ZFSin/zfs/lib/libefi/rdwr_efi.c +++ b/ZFSin/zfs/lib/libefi/rdwr_efi.c @@ -49,56 +49,6 @@ #include #include int osx_device_isvirtual(char *pathbuf); -#endif - -#ifdef _WIN32 -#include -#include - -static inline int lseek(HANDLE fd, uint64_t offset, int seek) -{ - LARGE_INTEGER LOFF, LNEW; - int type; - - LOFF.QuadPart = offset; - switch (seek) { - case SEEK_SET: - type = FILE_BEGIN; - break; - case SEEK_CUR: - type = FILE_CURRENT; - break; - case SEEK_END: - type = FILE_END; - break; - } - if (!SetFilePointerEx(fd, LOFF, &LNEW, type)) - return -1; - return LNEW.QuadPart; -} - -static inline int read(HANDLE fd, void *data, uint32_t len) -{ - DWORD red; - - if (!ReadFile(fd, data, len, &red, NULL)) - return -1; - - return red; -} - -static inline int write(HANDLE fd, void *data, uint32_t len) -{ - DWORD wrote; - - if (!WriteFile(fd, data, len, &wrote, NULL)) - return -1; - - return wrote; -} - - - #endif static struct uuid_to_ptag { @@ -189,13 +139,13 @@ efi_crc32(const unsigned char *buf, unsigned int size) } static int -read_disk_info(HANDLE fd, diskaddr_t *capacity, uint_t *lbsize) +read_disk_info(int fd, diskaddr_t *capacity, uint_t *lbsize) { DISK_GEOMETRY_EX geometry_ex; DWORD len; LARGE_INTEGER large; - if (DeviceIoControl(fd, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, + if (DeviceIoControl(ITOH(fd), IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, &geometry_ex, sizeof(geometry_ex), &len, NULL)) { *lbsize = (uint_t)geometry_ex.Geometry.BytesPerSector; @@ -208,7 +158,7 @@ read_disk_info(HANDLE fd, diskaddr_t *capacity, uint_t *lbsize) } static int -efi_get_info(HANDLE fd, struct dk_cinfo *dki_info) +efi_get_info(int fd, struct dk_cinfo *dki_info) { int rval = 0; #if defined(__linux__) @@ -378,7 +328,7 @@ efi_get_info(HANDLE fd, struct dk_cinfo *dki_info) PARTITION_INFORMATION partInfo; DWORD retcount = 0; int err; - err = DeviceIoControl(fd, + err = DeviceIoControl(ITOH(fd), IOCTL_DISK_GET_PARTITION_INFO, (LPVOID)NULL, (DWORD)0, @@ -423,7 +373,7 @@ efi_get_info(HANDLE fd, struct dk_cinfo *dki_info) sizeof (struct dk_part)) int -efi_alloc_and_init(HANDLE fd, uint32_t nparts, struct dk_gpt **vtoc) +efi_alloc_and_init(int fd, uint32_t nparts, struct dk_gpt **vtoc) { diskaddr_t capacity = 0; uint_t lbsize = 0; @@ -494,7 +444,7 @@ efi_alloc_and_init(HANDLE fd, uint32_t nparts, struct dk_gpt **vtoc) * Read EFI - return partition number upon success. */ int -efi_alloc_and_read(HANDLE fd, struct dk_gpt **vtoc) +efi_alloc_and_read(int fd, struct dk_gpt **vtoc) { int rval; uint32_t nparts; @@ -539,7 +489,7 @@ efi_alloc_and_read(HANDLE fd, struct dk_gpt **vtoc) } static int -efi_ioctl(HANDLE fd, int cmd, dk_efi_t *dk_ioc) +efi_ioctl(int fd, int cmd, dk_efi_t *dk_ioc) { void *data = dk_ioc->dki_data; int error; @@ -630,11 +580,8 @@ efi_ioctl(HANDLE fd, int cmd, dk_efi_t *dk_ioc) } /* Sync the new EFI table to disk */ -#ifdef _WIN32 - FlushFileBuffers(fd); // I think I added fsync to posix.c, but this is the only call? -#else error = fsync(fd); -#endif + if (error == -1) return (error); @@ -662,7 +609,7 @@ efi_ioctl(HANDLE fd, int cmd, dk_efi_t *dk_ioc) } int -efi_rescan(HANDLE fd) +efi_rescan(int fd) { #if defined(__linux__) int retry = 10; @@ -683,7 +630,7 @@ efi_rescan(HANDLE fd) } static int -check_label(HANDLE fd, dk_efi_t *dk_ioc) +check_label(int fd, dk_efi_t *dk_ioc) { efi_gpt_t *efi; uint_t crc; @@ -735,7 +682,7 @@ check_label(HANDLE fd, dk_efi_t *dk_ioc) } static int -efi_read(HANDLE fd, struct dk_gpt *vtoc) +efi_read(int fd, struct dk_gpt *vtoc) { int i, j; int label_len; @@ -1000,7 +947,7 @@ efi_read(HANDLE fd, struct dk_gpt *vtoc) /* writes a "protective" MBR */ static int -write_pmbr(HANDLE fd, struct dk_gpt *vtoc) +write_pmbr(int fd, struct dk_gpt *vtoc) { dk_efi_t dk_ioc; struct mboot mb; @@ -1191,7 +1138,7 @@ check_input(struct dk_gpt *vtoc) * add all the unallocated space to the current label */ int -efi_use_whole_disk(HANDLE fd) +efi_use_whole_disk(int fd) { struct dk_gpt *efi_label; int rval; @@ -1273,7 +1220,7 @@ efi_use_whole_disk(HANDLE fd) * write EFI label and backup label */ int -efi_write(HANDLE fd, struct dk_gpt *vtoc) +efi_write(int fd, struct dk_gpt *vtoc) { dk_efi_t dk_ioc; efi_gpt_t *efi; @@ -1487,7 +1434,7 @@ efi_free(struct dk_gpt *ptr) * Otherwise 0. */ int -efi_type(HANDLE fd) +efi_type(int fd) { #if 0 struct vtoc vtoc; @@ -1604,7 +1551,7 @@ efi_err_check(struct dk_gpt *vtoc) * label type */ int -efi_auto_sense(HANDLE fd, struct dk_gpt **vtoc) +efi_auto_sense(int fd, struct dk_gpt **vtoc) { int i; diff --git a/ZFSin/zfs/lib/libicp/libicp/libicp.vcxproj b/ZFSin/zfs/lib/libicp/libicp/libicp.vcxproj index 1f778807..ab7c4368 100644 --- a/ZFSin/zfs/lib/libicp/libicp/libicp.vcxproj +++ b/ZFSin/zfs/lib/libicp/libicp/libicp.vcxproj @@ -142,7 +142,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/module/icp/include;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -150,8 +150,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/module/icp/include;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libkstat/libkstat.vcxproj b/ZFSin/zfs/lib/libkstat/libkstat.vcxproj index 37a20f48..bf371e83 100644 --- a/ZFSin/zfs/lib/libkstat/libkstat.vcxproj +++ b/ZFSin/zfs/lib/libkstat/libkstat.vcxproj @@ -109,7 +109,7 @@ true __x86_64 $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -140,7 +140,7 @@ true __x86_64 $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libnvpair/libnvpair/libnvpair.vcxproj b/ZFSin/zfs/lib/libnvpair/libnvpair/libnvpair.vcxproj index 219f257e..85e5cf03 100644 --- a/ZFSin/zfs/lib/libnvpair/libnvpair/libnvpair.vcxproj +++ b/ZFSin/zfs/lib/libnvpair/libnvpair/libnvpair.vcxproj @@ -122,7 +122,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -130,8 +130,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libshare/libshare.c b/ZFSin/zfs/lib/libshare/libshare.c index 96e77a9c..d8ff1aab 100644 --- a/ZFSin/zfs/lib/libshare/libshare.c +++ b/ZFSin/zfs/lib/libshare/libshare.c @@ -196,15 +196,9 @@ update_sharetab(sa_handle_impl_t impl_handle) sa_fstype_t *fstype; const char *resource; -#ifdef _WIN32 - if (mkdir("/etc/dfs") < 0 && errno != EEXIST) { - return; - } -#else if (mkdir("/etc/dfs", 0755) < 0 && errno != EEXIST) { return; } -#endif temp_fd = mkstemp(tempfile); diff --git a/ZFSin/zfs/lib/libshare/libshare/libshare.vcxproj b/ZFSin/zfs/lib/libshare/libshare/libshare.vcxproj index 8da8bf98..59f94d38 100644 --- a/ZFSin/zfs/lib/libshare/libshare/libshare.vcxproj +++ b/ZFSin/zfs/lib/libshare/libshare/libshare.vcxproj @@ -111,7 +111,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -119,8 +119,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libspl/fdatasync.c b/ZFSin/zfs/lib/libspl/fdatasync.c index 5b0b67bf..971836fa 100644 --- a/ZFSin/zfs/lib/libspl/fdatasync.c +++ b/ZFSin/zfs/lib/libspl/fdatasync.c @@ -19,13 +19,3 @@ * CDDL HEADER END */ -#include -#include - -int -fdatasync(int fd) -{ - //if (fcntl(fd, F_FULLFSYNC) == -1) - // return -1; - return 0; -} diff --git a/ZFSin/zfs/lib/libspl/include/sys/w32_types.h b/ZFSin/zfs/lib/libspl/include/sys/w32_types.h index 2a390672..8ae3c1ee 100644 --- a/ZFSin/zfs/lib/libspl/include/sys/w32_types.h +++ b/ZFSin/zfs/lib/libspl/include/sys/w32_types.h @@ -44,6 +44,9 @@ #include #include +/* Now replace POSIX calls with our versions. */ +#include + typedef enum boolean { B_FALSE=0, B_TRUE } boolean_t; typedef enum boolean bool_t; @@ -157,9 +160,9 @@ typedef union { #define FLT_MAX 3.4028234663852885981170E+38F #define FLT_MIN 1.1754943508222875079688E-38F -#define STDIN_FILENO GetStdHandle(STD_INPUT_HANDLE) -#define STDOUT_FILENO GetStdHandle(STD_OUTPUT_HANDLE) -#define STDERR_FILENO GetStdHandle(STD_ERROR_HANDLE) +#define STDIN_FILENO HTOI(GetStdHandle(STD_INPUT_HANDLE)) +#define STDOUT_FILENO HTOI(GetStdHandle(STD_OUTPUT_HANDLE)) +#define STDERR_FILENO HTOI(GetStdHandle(STD_ERROR_HANDLE)) #define O_EXLOCK 0 #define bzero(b,len) (memset((b), '\0', (len))) @@ -176,9 +179,9 @@ int posix_memalign(void **memptr, size_t alignment, size_t size); #define sleep(x) Sleep(x * 1000) -int fsync(int); - #define lstat _stat64 +#define unlink _unlink +#define strdup _strdup #define MFSTYPENAMELEN 16 #define MNAMELEN MAXPATHLEN diff --git a/ZFSin/zfs/lib/libspl/include/unistd.h b/ZFSin/zfs/lib/libspl/include/unistd.h index 219614ef..54f5572c 100644 --- a/ZFSin/zfs/lib/libspl/include/unistd.h +++ b/ZFSin/zfs/lib/libspl/include/unistd.h @@ -49,10 +49,7 @@ extern int optopt; extern int optreset; extern char *optarg; -int fdatasync(int fd); - #include -#define ftruncate _chsize_s #include #include @@ -64,24 +61,18 @@ size_t strlcat(register char* s, register const char* t, register size_t n); ssize_t getline(char** linep, size_t *linecapp, FILE* stream); -int pread(int fd, void* buf, size_t nbyte, off_t offset); int pread_win(HANDLE h, void* buf, size_t nbyte, off_t offset); -int pwrite(HANDLE h, const void* buf, size_t nbyte, off_t offset); -int fstat_blk(int fd, struct _stat64* st); int pipe(int fildes[2]); char* realpath(const char* file_name, char* resolved_name); -int win_isatty(uintptr_t h); int usleep(__int64 usec); int vasprintf(char** strp, const char* fmt, va_list ap); int asprintf(char** strp, const char* fmt, ...); int strncasecmp(char* s1, char* s2, size_t n); -int socketpair(int* sv); int readlink(const char* path, char* buf, size_t bufsize); const char* getexecname(void); uint64_t geteuid(void); struct zfs_cmd; -int ioctl(HANDLE hDevice, unsigned long request, struct zfs_cmd *zc); int mkstemp(char* tmpl); int64_t gethrtime(void); int gettimeofday(struct timeval* tp, struct timezone* tzp); diff --git a/ZFSin/zfs/lib/libspl/include/wosix.h b/ZFSin/zfs/lib/libspl/include/wosix.h new file mode 100644 index 00000000..3b79af95 --- /dev/null +++ b/ZFSin/zfs/lib/libspl/include/wosix.h @@ -0,0 +1,111 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License, Version 1.0 only + * (the "License"). You may not use this file except in compliance + * with the License. + * + * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE + * or http://www.opensolaris.org/os/licensing. + * See the License for the specific language governing permissions + * and limitations under the License. + * + * When distributing Covered Code, include this CDDL HEADER in each + * file and include the License file at usr/src/OPENSOLARIS.LICENSE. + * If applicable, add the following below this CDDL HEADER, with the + * fields enclosed by brackets "[]" replaced with your own identifying + * information: Portions Copyright [yyyy] [name of copyright owner] + * + * CDDL HEADER END + */ + /* + * Copyright(c) 2019 Jorgen Lundman + */ + +#ifndef WOSIX_HEADER +#define WOSIX_HEADER + +/* Replace all the normal POSIX calls; open, read, write, close, lseek, fstat + * As we have to use HANDLEs to open devices, we add a shim-layer to handle + * int fd and the change in underlying API calls. + * First, include the header that defines them in Windows. + */ +#include +#include +#include +#include + +#define HTOI(H) ((int)(unsigned __int64)(H)) +#define ITOH(I) ((HANDLE)(unsigned __int64)(I)) + +extern int wosix_fsync(int fd); +extern int wosix_open(const char *path, int oflag, ...); +extern int wosix_close(int fd); +extern int wosix_ioctl(int fd, unsigned long request, void *zc); +extern int wosix_read(int fd, void *data, uint32_t len); +extern int wosix_write(int fd, const void *data, uint32_t len); +extern int wosix_isatty(int fd); +extern int wosix_mkdir(const char *path, mode_t mode); +extern int wosix_pwrite(int fd, const void *buf, size_t nbyte, off_t offset); +extern int wosix_pread(int fd, void *buf, size_t nbyte, off_t offset); +extern int wosix_fstat(int fd, struct _stat64 *st); +extern int wosix_fstat_blk(int fd, struct _stat64 *st); +extern uint64_t wosix_lseek(int fd, uint64_t offset, int seek); +extern int wosix_fdatasync(int fd); +extern int wosix_ftruncate(int fd, off_t length); +extern int wosix_socketpair(int domain, int type, int protocol, int socket_vector[2]); +extern int wosix_dup2(int fildes, int fildes2); + +#define wosix_fileno(X) (_get_osfhandle(_fileno((X)))) + +extern FILE *wosix_fdopen(int fildes, const char *mode); + + /* + * Thin wrapper for the POSIX IO calls, to translate to HANDLEs + * + * Currently it "hopes" that HANDLE value will fit in type "int". + * This could be improved in future. + */ +#undef open +#define open wosix_open +#undef close +#define close wosix_close +#undef ioctl +#define ioctl wosix_ioctl +#undef lseek +#define lseek wosix_lseek +#undef fsync +#define fsync wosix_fsync +#undef read +#define read wosix_read +#undef write +#define write wosix_write +#undef fileno +#define fileno wosix_fileno +#undef isatty +#define isatty wosix_isatty +#undef mkdir +#define mkdir wosix_mkdir +#undef pread +#define pread wosix_pread +#define pread64 wosix_pread +#undef pwrite +#define pwrite wosix_pwrite +#define pwrite64 wosix_pwrite +#undef fstat +#define fstat wosix_fstat +#undef fstat_blk +#define fstat_blk wosix_fstat_blk +#undef fdatasync +#define fdatasync wosix_fdatasync +#undef ftruncate +#define ftruncate wosix_ftruncate +#undef socketpair +#define socketpair wosix_socketpair +#undef fdopen +#define fdopen wosix_fdopen +#undef dup2 +#define dup2 wosix_dup2 + +#endif /* WOSIX_HEADER */ \ No newline at end of file diff --git a/ZFSin/zfs/lib/libspl/libspl/libspl.vcxproj b/ZFSin/zfs/lib/libspl/libspl/libspl.vcxproj index 051b05c3..99d97680 100644 --- a/ZFSin/zfs/lib/libspl/libspl/libspl.vcxproj +++ b/ZFSin/zfs/lib/libspl/libspl/libspl.vcxproj @@ -137,7 +137,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;%(AdditionalIncludeDirectories) __x86_64;%(PreprocessorDefinitions) - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -149,8 +149,7 @@ __x86_64;%(PreprocessorDefinitions) $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;%(AdditionalIncludeDirectories) - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libspl/posix.c b/ZFSin/zfs/lib/libspl/posix.c index c0f59b8d..b98521e7 100644 --- a/ZFSin/zfs/lib/libspl/posix.c +++ b/ZFSin/zfs/lib/libspl/posix.c @@ -48,14 +48,7 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) return 0; } -int fsync(int fd) { - HANDLE h = (HANDLE)_get_osfhandle(fd); - if (!FlushFileBuffers(h)) - return EIO; - return 0; -} - -const char* getexecname(void) +const char *getexecname(void) { __declspec(thread) static char execname[32767 + 1]; GetModuleFileNameA(NULL, execname, sizeof(execname)); @@ -125,93 +118,6 @@ char *realpath(const char *file_name, char *resolved_name) return resolved_name; } -int pread(int fd, void *buf, size_t nbyte, off_t offset) -{ - uint64_t off; - int red; - - off = _lseek(fd, 0, SEEK_CUR); - if (_lseek(fd, offset, SEEK_SET) != offset) - return -1; - - red = read(fd, buf, nbyte); - - _lseek(fd, off, SEEK_SET); - - return red; -} - -int pread_win(HANDLE h, void *buf, size_t nbyte, off_t offset) -{ - uint64_t off; - DWORD red; - LARGE_INTEGER large; - LARGE_INTEGER lnew; - - // This code does all seeks based on "current" so we can pre-seek to offset start - - // Find current position - large.QuadPart = 0; - SetFilePointerEx(h, large, &lnew, FILE_CURRENT); - - // Seek to place to read - large.QuadPart = offset; - SetFilePointerEx(h, large, NULL, FILE_CURRENT); - - // Read - if (!ReadFile(h, buf, nbyte, &red, NULL)) - red = -GetLastError(); - - // Restore position - SetFilePointerEx(h, lnew, NULL, FILE_BEGIN); - - return red; -} - -int pwrite(HANDLE h, const void *buf, size_t nbyte, off_t offset) -{ - uint64_t off; - DWORD wrote; - LARGE_INTEGER large; - LARGE_INTEGER lnew; - - // This code does all seeks based on "current" so we can pre-seek to offset start - - // Find current position - large.QuadPart = 0; - SetFilePointerEx(h, large, &lnew, FILE_CURRENT); - - // Seek to place to read - large.QuadPart = offset; - SetFilePointerEx(h, large, NULL, FILE_CURRENT); - - // Read - if (!WriteFile(h, buf, nbyte, &wrote, NULL)) - wrote = -GetLastError(); - - // Restore position - SetFilePointerEx(h, lnew, NULL, FILE_BEGIN); - - return wrote; -} - - -int fstat_blk(int fd, struct _stat64 *st) -{ - DISK_GEOMETRY_EX geometry_ex; - HANDLE handle; - DWORD len; - - handle = (HANDLE) _get_osfhandle(fd); - if (!DeviceIoControl(handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, - &geometry_ex, sizeof(geometry_ex), &len, NULL)) - return -1; - - st->st_size = (diskaddr_t)geometry_ex.DiskSize.QuadPart; - - return (0); -} - int statfs(const char *path, struct statfs *buf) { ULARGE_INTEGER lpFreeBytesAvailable; @@ -332,7 +238,6 @@ mkstemp(char *tmpl) return -1; } - int readlink(const char *path, char *buf, size_t bufsize) { return -1; @@ -461,7 +366,8 @@ basename(char *arg) return(basedir(arg, BASENAME)); } -char* getIoctlAsString(int cmdNo) { +char* getIoctlAsString(int cmdNo) +{ switch (cmdNo) { case 0x800: return "ZFS_IOC_FIRST"; case 0x801: return "ZFS_IOC_POOL_DESTROY"; @@ -557,66 +463,11 @@ char* getIoctlAsString(int cmdNo) { } } -int ioctl(HANDLE hDevice, unsigned long request, zfs_cmd_t *zc) -{ - int error; - //HANDLE hDevice; - ULONG bytesReturned; - - //hDevice = _get_osfhandle(fd); -#if 0 - fprintf(stderr, "calling ioctl on 0x%x (raw 0x%x) struct size %d in %p:%d out %p:%d\n", - (request&0x2ffc) >> 2, request, - sizeof(zfs_cmd_t), - zc->zc_nvlist_src, zc->zc_nvlist_src_size, - zc->zc_nvlist_dst, zc->zc_nvlist_dst_size - ); fflush(stderr); - strcpy(zc->zc_name, "thisisatest"); - zc->zc_dev = 0x12345678; - for (int x = 0; x < 16; x++) - fprintf(stderr, "%02x ", ((unsigned char *)zc)[x]); - fprintf(stderr, "\n"); - fflush(stderr); -#endif - error = DeviceIoControl(hDevice, - (DWORD)request, - zc, - (DWORD)sizeof(zfs_cmd_t), - zc, - (DWORD)sizeof(zfs_cmd_t), - &bytesReturned, - NULL - ); - - if (error == 0) - error = GetLastError(); - else - error = zc->zc_ioc_error; - -#ifdef DEBUG - fprintf(stderr, " (ioctl 0x%x (%s) status %d bytes %ld)\n", (request & 0x2ffc) >> 2, getIoctlAsString((request & 0x2ffc) >> 2), error, bytesReturned); fflush(stderr); -#endif -#if 0 - for (int x = 0; x < 16; x++) - fprintf(stderr, "%02x ", ((unsigned char *)zc)[x]); - fprintf(stderr, "\n"); - fflush(stderr); - fprintf(stderr, "returned ioctl on 0x%x (raw 0x%x) struct size %d in %p:%d out %p:%d\n", - (request & 0x2ffc) >> 2, request, - sizeof(zfs_cmd_t), - zc->zc_nvlist_src, zc->zc_nvlist_src_size, - zc->zc_nvlist_dst, zc->zc_nvlist_dst_size - ); fflush(stderr); -#endif - errno = error; - return error; -} - int vasprintf(char **strp, const char *fmt, va_list ap) { int r = -1, size; - + size = _vscprintf(fmt, ap); if ((size >= 0) && (size < INT_MAX)) { @@ -629,7 +480,7 @@ int vasprintf(char **strp, const char *fmt, va_list ap) } } } else { - *strp = 0; + *strp = 0; } return(r); @@ -755,7 +606,7 @@ openlog(const char *ident, int logopt, int facility) } void -syslog(int priority, const char *message, ... ) +syslog(int priority, const char *message, ...) { } @@ -784,82 +635,6 @@ unmount(const char *dir, int flags) return -1; } -int socketpair(int *sv) -{ - int temp, s1, s2, result; - struct sockaddr_in saddr; - int nameLen; - unsigned long option_arg = 1; - - nameLen = sizeof(saddr); - - /* ignore address family for now; just stay with AF_INET */ - temp = socket(AF_INET, SOCK_STREAM, 0); - if (temp == INVALID_SOCKET) return -1; - - setsockopt(temp, SOL_SOCKET, SO_REUSEADDR, (void *)&option_arg, - sizeof(option_arg)); - - /* We *SHOULD* choose the correct sockaddr structure based - on the address family requested... */ - memset(&saddr, 0, sizeof(saddr)); - - saddr.sin_family = AF_INET; - saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - saddr.sin_port = 0; // give me a port - - result = bind(temp, (struct sockaddr *)&saddr, nameLen); - if (result == SOCKET_ERROR) { - errno = WSAGetLastError(); - closesocket(temp); - return -2; - } - - // Don't care about error here, the connect will fail instead - listen(temp, 1); - - // Fetch out the port that was given to us. - nameLen = sizeof(struct sockaddr_in); - - result = getsockname(temp, (struct sockaddr *)&saddr, &nameLen); - - if (result == INVALID_SOCKET) { - closesocket(temp); - return -4; /* error case */ - } - - s1 = socket(AF_INET, SOCK_STREAM, 0); - if (s1 == INVALID_SOCKET) { - closesocket(temp); - return -5; - } - - nameLen = sizeof(struct sockaddr_in); - - result = connect(s1, (struct sockaddr *)&saddr, nameLen); - - if (result == INVALID_SOCKET) { - closesocket(temp); - closesocket(s1); - return -6; /* error case */ - } - - s2 = accept(temp, NULL, NULL); - - closesocket(temp); - - if (s2 == INVALID_SOCKET) { - closesocket(s1); - return -7; - } - - sv[0] = s1; sv[1] = s2; - - if ((sv[0] < 0) || (sv[1] < 0)) return -8; - - return 0; /* normal case */ -} - extern size_t strlcpy(register char* s, register const char* t, register size_t n) { @@ -919,44 +694,6 @@ char *strndup(char *src, size_t size) return r; } -int win_isatty(uintptr_t x) -{ - DWORD mode; - HANDLE h = (HANDLE)x; - int ret; -#if 0 - const unsigned long bufSize = sizeof(DWORD) + MAX_PATH * sizeof(WCHAR); - BYTE buf[sizeof(DWORD) + MAX_PATH * sizeof(WCHAR)]; - PFILE_NAME_INFO pfni = (PFILE_NAME_INFO)buf; - - if (!GetFileInformationByHandleEx(h, FileNameInfo, buf, bufSize)) { - return 0; - } - - PWSTR fn = pfni->FileName; - fn[pfni->FileNameLength] = L'\0'; - - ret = ((wcsstr(fn, L"\\cygwin-") || wcsstr(fn, L"\\msys-")) && - wcsstr(fn, L"-pty") && wcsstr(fn, L"-master")); - - //printf("ret %d Got name as '%S'\n", ret, fn); fflush(stdout); - return ret; -#else - - ret = ((GetFileType(h) & ~FILE_TYPE_REMOTE) == FILE_TYPE_CHAR); - -#endif - //fprintf(stderr, "%s: return %d\r\n", __func__, ret); - //fflush(stderr); - - // FIXME - always say it ISN'T a tty, this way zfs send will work - // everywhere - the only negative side-effect is garbage printed - // on console if users do something dumb. - return 0; - - return ret; -} - int setrlimit(int resource, const struct rlimit *rlp) { return 0; @@ -1014,4 +751,431 @@ ssize_t getline(char **linep, size_t* linecapp, SetConsoleMode(hStdin, mode); return i; -} \ No newline at end of file +} + + +/* Windows POSIX wrappers */ + + +int wosix_fsync(int fd) +{ + if (!FlushFileBuffers(ITOH(fd))) + return EIO; + return 0; +} + +int wosix_open(const char *path, int oflag, ...) +{ + HANDLE h; + DWORD mode = GENERIC_READ; // RDONLY=0, WRONLY=1, RDWR=2; + DWORD how = OPEN_EXISTING; + DWORD share = FILE_SHARE_READ; + // This is wrong, not all bitfields + if (oflag&O_WRONLY) mode = GENERIC_WRITE; + if (oflag&O_RDWR) mode = GENERIC_READ | GENERIC_WRITE; + + switch (oflag&(O_CREAT | O_TRUNC | O_EXCL)) { + case O_CREAT: + how = OPEN_ALWAYS; + break; + case O_TRUNC: + how = TRUNCATE_EXISTING; + break; + case (O_CREAT | O_EXCL): + case (O_CREAT | O_EXCL | O_TRUNC): // Only creating new implies starting from 0 + how = CREATE_NEW; + break; + case (O_CREAT | O_TRUNC): + how = CREATE_ALWAYS; + break; + default: + case O_EXCL: // Invalid, ignore bit - treat as normal open + how = OPEN_EXISTING; + break; + } + if (oflag&O_APPEND) mode |= FILE_APPEND_DATA; + +#ifdef O_EXLOCK + if (!oflag&O_EXLOCK) share |= FILE_SHARE_WRITE; +#endif + + h = CreateFile(path, mode, share, NULL, how, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + errno = EINVAL; + switch (GetLastError()) { + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + errno = ENOENT; + break; + case ERROR_ACCESS_DENIED: + errno = EACCES; + break; + case ERROR_FILE_EXISTS: + errno = EEXIST; + break; + } + return -1; + } + return (HTOI(h)); +} + +int wosix_close(int fd) +{ + HANDLE h = ITOH(fd); + + // Use CloseHandle() for everything except sockets. + if ((GetFileType(h) == FILE_TYPE_REMOTE) && + !GetNamedPipeInfo(h, NULL, NULL, NULL, NULL)) + return closesocket((SOCKET)h); + + if (CloseHandle(h)) + return 0; + return -1; +} + +int wosix_ioctl(int fd, unsigned long request, zfs_cmd_t *zc) +{ + int error; + ULONG bytesReturned; + + error = DeviceIoControl(ITOH(fd), + (DWORD)request, + zc, + (DWORD)sizeof(zfs_cmd_t), + zc, + (DWORD)sizeof(zfs_cmd_t), + &bytesReturned, + NULL + ); + + if (error == 0) + error = GetLastError(); + else + error = zc->zc_ioc_error; + +#ifdef DEBUG + fprintf(stderr, " (ioctl 0x%x (%s) status %d bytes %ld)\n", (request & 0x2ffc) >> 2, getIoctlAsString((request & 0x2ffc) >> 2), error, bytesReturned); fflush(stderr); +#endif +#if 0 + for (int x = 0; x < 16; x++) + fprintf(stderr, "%02x ", ((unsigned char *)zc)[x]); + fprintf(stderr, "\n"); + fflush(stderr); + fprintf(stderr, "returned ioctl on 0x%x (raw 0x%x) struct size %d in %p:%d out %p:%d\n", + (request & 0x2ffc) >> 2, request, + sizeof(zfs_cmd_t), + zc->zc_nvlist_src, zc->zc_nvlist_src_size, + zc->zc_nvlist_dst, zc->zc_nvlist_dst_size + ); fflush(stderr); +#endif + errno = error; + return error; +} + +uint64_t wosix_lseek(int fd, uint64_t offset, int seek) +{ + LARGE_INTEGER LOFF, LNEW; + int type = FILE_BEGIN; + + LOFF.QuadPart = offset; + switch (seek) { + case SEEK_SET: + type = FILE_BEGIN; + break; + case SEEK_CUR: + type = FILE_CURRENT; + break; + case SEEK_END: + type = FILE_END; + break; + } + if (!SetFilePointerEx(ITOH(fd), LOFF, &LNEW, type)) + return -1; + return LNEW.QuadPart; +} + +int wosix_read(int fd, void *data, uint32_t len) +{ + DWORD red; + + if (!ReadFile(ITOH(fd), data, len, &red, NULL)) + return -1; + + return red; +} + +int wosix_write(int fd, const void *data, uint32_t len) +{ + DWORD wrote; + + if (!WriteFile(ITOH(fd), data, len, &wrote, NULL)) + return -1; + + return wrote; +} + +int wosix_isatty(int fd) +{ + DWORD mode; + HANDLE h = ITOH(fd); + int ret; +#if 0 + const unsigned long bufSize = sizeof(DWORD) + MAX_PATH * sizeof(WCHAR); + BYTE buf[sizeof(DWORD) + MAX_PATH * sizeof(WCHAR)]; + PFILE_NAME_INFO pfni = (PFILE_NAME_INFO)buf; + + if (!GetFileInformationByHandleEx(h, FileNameInfo, buf, bufSize)) { + return 0; + } + + PWSTR fn = pfni->FileName; + fn[pfni->FileNameLength] = L'\0'; + + ret = ((wcsstr(fn, L"\\cygwin-") || wcsstr(fn, L"\\msys-")) && + wcsstr(fn, L"-pty") && wcsstr(fn, L"-master")); + + //printf("ret %d Got name as '%S'\n", ret, fn); fflush(stdout); + return ret; +#else + + ret = ((GetFileType(h) & ~FILE_TYPE_REMOTE) == FILE_TYPE_CHAR); + +#endif + //fprintf(stderr, "%s: return %d\r\n", __func__, ret); + //fflush(stderr); + + // FIXME - always say it ISN'T a tty, this way zfs send will work + // everywhere - the only negative side-effect is garbage printed + // on console if users do something dumb. + return 0; + + return ret; +} + +// A bit different, just to wrap away the second argument +// Presumably _mkdir() sets errno, as EEXIST is tested. +int wosix_mkdir(const char *path, mode_t mode) +{ + return _mkdir(path); +} + +// Only fill in what we actually use in ZFS +// Mostly used to test for existance, st_mode, st_size +// also FIFO and BLK (fixme) +int wosix_fstat(int fd, struct _stat64 *st) +{ + HANDLE h = ITOH(fd); + BY_HANDLE_FILE_INFORMATION info; + + if (!GetFileInformationByHandle(h, &info)) + return -1; // errno? + + st->st_dev = 0; + st->st_ino = 0; + st->st_mode = (info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? + _S_IFDIR : _S_IFREG; + st->st_nlink = (info.nNumberOfLinks > SHRT_MAX ? SHRT_MAX : info.nNumberOfLinks); + st->st_uid = 0; + st->st_gid = 0; + st->st_rdev = 0; + st->st_size = ((long long)info.nFileSizeHigh << 32ULL) | (long long)info.nFileSizeLow; + st->st_atime = 0; + st->st_mtime = 0; + st->st_ctime = 0; + + return 0; +} + +int wosix_fstat_blk(int fd, struct _stat64 *st) +{ + DISK_GEOMETRY_EX geometry_ex; + HANDLE handle = ITOH(fd); + DWORD len; + + if (!DeviceIoControl(handle, IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, NULL, 0, + &geometry_ex, sizeof(geometry_ex), &len, NULL)) + return -1; + + st->st_size = (diskaddr_t)geometry_ex.DiskSize.QuadPart; + + return (0); +} + +// os specific files can call this directly. +int pread_win(HANDLE h, void *buf, size_t nbyte, off_t offset) +{ + uint64_t off; + DWORD red; + LARGE_INTEGER large; + LARGE_INTEGER lnew; + + // This code does all seeks based on "current" so we can pre-seek to offset start + + // Find current position + large.QuadPart = 0; + SetFilePointerEx(h, large, &lnew, FILE_CURRENT); + + // Seek to place to read + large.QuadPart = offset; + SetFilePointerEx(h, large, NULL, FILE_CURRENT); + + // Read + if (!ReadFile(h, buf, nbyte, &red, NULL)) + red = -GetLastError(); + + // Restore position + SetFilePointerEx(h, lnew, NULL, FILE_BEGIN); + + return red; +} + +int wosix_pread(int fd, void *buf, size_t nbyte, off_t offset) +{ + return pread_win(ITOH(fd), buf, nbyte, offset); +} + +int wosix_pwrite(int fd, const void *buf, size_t nbyte, off_t offset) +{ + HANDLE h = ITOH(fd); + uint64_t off; + DWORD wrote; + LARGE_INTEGER large; + LARGE_INTEGER lnew; + + // This code does all seeks based on "current" so we can pre-seek to offset start + + // Find current position + large.QuadPart = 0; + SetFilePointerEx(h, large, &lnew, FILE_CURRENT); + + // Seek to place to read + large.QuadPart = offset; + SetFilePointerEx(h, large, NULL, FILE_CURRENT); + + // Write + if (!WriteFile(h, buf, nbyte, &wrote, NULL)) + wrote = -GetLastError(); + + // Restore position + SetFilePointerEx(h, lnew, NULL, FILE_BEGIN); + + return wrote; +} + +int wosix_fdatasync(int fd) +{ + //if (fcntl(fd, F_FULLFSYNC) == -1) + // return -1; + return 0; +} + +int wosix_ftruncate(int fd, off_t length) +{ + HANDLE h = ITOH(fd); + LARGE_INTEGER lnew; + + lnew.QuadPart = length; + if (SetFilePointerEx(h, lnew, NULL, FILE_BEGIN) && + SetEndOfFile(h)) + return 0; // Success + // errno? + return -1; +} + +// This one is a little bit special, ordinarily +// we would take the HANDLE and convert it to a +// FILE *, using _fdopen(_open_osfhandle()); +// But, this is only used from libzfs_sendrecv.c and +// comes from socketpair() - which uses sockets, ie +// already HANDLEs. So they are passed into ssread() +// which uses HANDLEs directly. close() is updated +// to handle closing of SOCKETS. +// Note we do not change fread()/fwrite() from FILE* +// as they are used throughout userland. The fix +// resides in ssread(). +FILE *wosix_fdopen(int fd, const char *mode) +{ + return ((FILE *)ITOH(fd)); +} + +int wosix_socketpair(int domain, int type, int protocol, int sv[2]) +{ + int temp, s1, s2, result; + struct sockaddr_in saddr; + int nameLen; + unsigned long option_arg = 1; + + nameLen = sizeof(saddr); + + /* ignore address family for now; just stay with AF_INET */ + temp = socket(AF_INET, SOCK_STREAM, 0); + if (temp == INVALID_SOCKET) return -1; + + setsockopt(temp, SOL_SOCKET, SO_REUSEADDR, (void *)&option_arg, + sizeof(option_arg)); + + /* We *SHOULD* choose the correct sockaddr structure based + on the address family requested... */ + memset(&saddr, 0, sizeof(saddr)); + + saddr.sin_family = AF_INET; + saddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + saddr.sin_port = 0; // give me a port + + result = bind(temp, (struct sockaddr *)&saddr, nameLen); + if (result == SOCKET_ERROR) { + errno = WSAGetLastError(); + closesocket(temp); + return -2; + } + + // Don't care about error here, the connect will fail instead + listen(temp, 1); + + // Fetch out the port that was given to us. + nameLen = sizeof(struct sockaddr_in); + + result = getsockname(temp, (struct sockaddr *)&saddr, &nameLen); + + if (result == INVALID_SOCKET) { + closesocket(temp); + return -4; /* error case */ + } + + s1 = socket(AF_INET, SOCK_STREAM, 0); + if (s1 == INVALID_SOCKET) { + closesocket(temp); + return -5; + } + + nameLen = sizeof(struct sockaddr_in); + + result = connect(s1, (struct sockaddr *)&saddr, nameLen); + + if (result == INVALID_SOCKET) { + closesocket(temp); + closesocket(s1); + return -6; /* error case */ + } + + s2 = accept(temp, NULL, NULL); + + closesocket(temp); + + if (s2 == INVALID_SOCKET) { + closesocket(s1); + return -7; + } + + sv[0] = s1; sv[1] = s2; + + if ((sv[0] < 0) || (sv[1] < 0)) return -8; + + return 0; /* normal case */ +} + +int wosix_dup2(int fildes, int fildes2) +{ + return -1; +} + diff --git a/ZFSin/zfs/lib/libunicode/libunicode/libunicode.vcxproj b/ZFSin/zfs/lib/libunicode/libunicode/libunicode.vcxproj index 1bf16ece..81b18fbc 100644 --- a/ZFSin/zfs/lib/libunicode/libunicode/libunicode.vcxproj +++ b/ZFSin/zfs/lib/libunicode/libunicode/libunicode.vcxproj @@ -110,7 +110,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -118,8 +118,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/include;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libuuid/libuuid/libuuid.vcxproj b/ZFSin/zfs/lib/libuuid/libuuid/libuuid.vcxproj index 2bc4c349..c06d8c8f 100644 --- a/ZFSin/zfs/lib/libuuid/libuuid/libuuid.vcxproj +++ b/ZFSin/zfs/lib/libuuid/libuuid/libuuid.vcxproj @@ -123,7 +123,7 @@ __x86_64;_WIN64;_AMD64_;AMD64;HAVE_STDINT_H;%(PreprocessorDefinitions) $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -131,8 +131,7 @@ __x86_64;_WIN64;_AMD64_;AMD64;HAVE_STDINT_H;%(PreprocessorDefinitions) $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libuutil/libuutil/libuutil.vcxproj b/ZFSin/zfs/lib/libuutil/libuutil/libuutil.vcxproj index c5ea6e14..7fa0823b 100644 --- a/ZFSin/zfs/lib/libuutil/libuutil/libuutil.vcxproj +++ b/ZFSin/zfs/lib/libuutil/libuutil/libuutil.vcxproj @@ -129,7 +129,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -137,8 +137,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libzfs/libzfs/libzfs.vcxproj b/ZFSin/zfs/lib/libzfs/libzfs/libzfs.vcxproj index 2bd498fc..74ba928d 100644 --- a/ZFSin/zfs/lib/libzfs/libzfs/libzfs.vcxproj +++ b/ZFSin/zfs/lib/libzfs/libzfs/libzfs.vcxproj @@ -130,7 +130,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -138,8 +138,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libzfs/libzfs_crypto.c b/ZFSin/zfs/lib/libzfs/libzfs_crypto.c index 67625f9c..234c1fb4 100644 --- a/ZFSin/zfs/lib/libzfs/libzfs_crypto.c +++ b/ZFSin/zfs/lib/libzfs/libzfs_crypto.c @@ -135,12 +135,7 @@ get_key_material_raw(FILE *fd, const char *fsname, zfs_keyformat_t keyformat, #endif *len_out = 0; - -#ifdef _WIN32 - if (win_isatty(_get_osfhandle(_fileno(fd)))) { -#else - if (isatty(fileno(fd)) { -#endif + if (isatty(fileno(fd))) { /* * handle SIGINT and ignore SIGSTP. This is necessary to * restore the state of the terminal. @@ -224,11 +219,7 @@ get_key_material_raw(FILE *fd, const char *fsname, zfs_keyformat_t keyformat, *len_out = bytes; out: -#ifdef _WIN32 - if (win_isatty(_get_osfhandle(_fileno(fd)))) { -#else if (isatty(fileno(fd))) { -#endif /* reset the teminal */ (void) tcsetattr(fileno(fd), TCSAFLUSH, &old_term); #ifndef _WIN32 @@ -276,11 +267,7 @@ get_key_material(libzfs_handle_t *hdl, boolean_t do_verify, boolean_t newkey, switch (keyloc) { case ZFS_KEYLOCATION_PROMPT: fd = stdin; -#ifdef _WIN32 - if (win_isatty(_get_osfhandle(_fileno(fd)))) { -#else if (isatty(fileno(fd))) { -#endif can_retry = B_TRUE; /* raw keys cannot be entered on the terminal */ @@ -386,11 +373,7 @@ get_key_material(libzfs_handle_t *hdl, boolean_t do_verify, boolean_t newkey, break; } -#ifdef _WIN32 - if (do_verify && win_isatty(_get_osfhandle(_fileno(fd)))) { -#else if (do_verify && isatty(fileno(fd))) { -#endif ret = get_key_material_raw(fd, fsname, keyformat, B_TRUE, newkey, &km2, &kmlen2); if (ret != 0) diff --git a/ZFSin/zfs/lib/libzfs/libzfs_diff.c b/ZFSin/zfs/lib/libzfs/libzfs_diff.c index 1968d611..92f2f711 100644 --- a/ZFSin/zfs/lib/libzfs/libzfs_diff.c +++ b/ZFSin/zfs/lib/libzfs/libzfs_diff.c @@ -558,11 +558,7 @@ teardown_differ_info(differ_info_t *di) free(di->tosnap); free(di->tmpsnap); free(di->tomnt); -#ifdef WIN32 - CloseHandle(di->cleanupfd); -#else (void) close(di->cleanupfd); -#endif } static int @@ -750,14 +746,8 @@ setup_differ_info(zfs_handle_t *zhp, const char *fromsnap, { di->zhp = zhp; -#ifdef WIN32 - di->cleanupfd = CreateFile(ZFS_DEV, GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, 0, NULL); - VERIFY(di->cleanupfd != INVALID_HANDLE_VALUE); -#else di->cleanupfd = open(ZFS_DEV, O_RDWR); VERIFY(di->cleanupfd >= 0); -#endif if (get_snapshot_names(di, fromsnap, tosnap) != 0) return (-1); diff --git a/ZFSin/zfs/lib/libzfs/libzfs_import.c b/ZFSin/zfs/lib/libzfs/libzfs_import.c index 9c16c182..1d8a4f85 100644 --- a/ZFSin/zfs/lib/libzfs/libzfs_import.c +++ b/ZFSin/zfs/lib/libzfs/libzfs_import.c @@ -1093,7 +1093,7 @@ typedef struct rdsk_node { char *rn_parent; #endif int rn_num_labels; - HANDLE rn_dfd; + int rn_dfd; libzfs_handle_t *rn_hdl; nvlist_t *rn_config; avl_tree_t *rn_avl; @@ -1292,6 +1292,7 @@ void signal_alarm(int foo) } #endif +#ifndef _WIN32 static void zpool_open_func(void *arg) { @@ -1452,7 +1453,9 @@ fprintf(stderr, "%s: enter\n", __func__); fflush(stderr); rn->rn_config = config; rn->rn_num_labels = num_labels; } +#endif +// Should probably rename this, and only define one. static void zpool_open_func_win(void *arg) { @@ -1560,7 +1563,7 @@ zpool_open_func_win(void *arg) * Try to read the disk label first so we don't have to * open a bunch of minor nodes that can't have a zpool. */ - check_slices(rn->rn_avl, fd, rn->rn_name); + check_slices(rn->rn_avl, HTOI(fd), rn->rn_name); } if ((zpool_read_label_win(fd, drive_len, &config, &num_labels)) != 0) { @@ -1585,7 +1588,7 @@ zpool_open_func_win(void *arg) * Given a file descriptor, clear (zero) the label information. */ int -zpool_clear_label(HANDLE fd) +zpool_clear_label(int fd) { struct _stat64 statbuf; int l; @@ -1833,7 +1836,7 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importargs_t *iarg) slice->rn_name = zfs_strdup(hdl, name); slice->rn_parent = zfs_strdup(hdl, path); slice->rn_avl = &slice_cache; - slice->rn_dfd = dfd; + slice->rn_dfd = HTOI(dfd); slice->rn_hdl = hdl; slice->rn_nozpool = B_FALSE; avl_add(&slice_cache, slice); @@ -2163,7 +2166,7 @@ zpool_find_import_win(libzfs_handle_t *hdl, importargs_t *iarg) fprintf(stderr, "asking libefi to read label\n"); fflush(stderr); int error; struct dk_gpt *vtoc; - error = efi_alloc_and_read(disk, &vtoc); + error = efi_alloc_and_read(HTOI(disk), &vtoc); if (error >= 0) { fprintf(stderr, "EFI read OK, max partitions %d\n", vtoc->efi_nparts); fflush(stderr); for (int i = 0; i < vtoc->efi_nparts; i++) { diff --git a/ZFSin/zfs/lib/libzfs/libzfs_pool.c b/ZFSin/zfs/lib/libzfs/libzfs_pool.c index aab4f625..fad816af 100644 --- a/ZFSin/zfs/lib/libzfs/libzfs_pool.c +++ b/ZFSin/zfs/lib/libzfs/libzfs_pool.c @@ -2840,7 +2840,7 @@ zpool_get_physpath(zpool_handle_t *zhp, char *physpath, size_t phypath_size) * can block ZFS from accessing the device. This function allows limited retries * in order to work around this behavior. */ -static HANDLE +static int zpool_open_delay(int timeout, const char *path, int oflag) { int i = 0; @@ -2849,7 +2849,7 @@ zpool_open_delay(int timeout, const char *path, int oflag) if (path[0] == '#') { uint64_t offset; uint64_t len; - char *end = NULL; + const char *end = NULL; end = path; while (end && *end == '#') end++; @@ -2886,7 +2886,7 @@ zpool_open_delay(int timeout, const char *path, int oflag) // fd = open(path, oflag); // } - return (fd); + return (HTOI(fd)); } /* @@ -2896,7 +2896,7 @@ zpool_open_delay(int timeout, const char *path, int oflag) static int zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg) { - HANDLE fd; + int fd; int error; if ((fd = zpool_open_delay(10, path, O_RDWR|O_DIRECT|O_SHLOCK)) < 0) { @@ -2914,11 +2914,8 @@ zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg) * The module will do it for us in vdev_disk_open(). */ error = efi_use_whole_disk(fd); -#ifdef _WIN32 - CloseHandle(fd); -#else (void) close(fd); -#endif + if (error && error != VT_ENOSPC) { zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot " "relabel '%s': unable to read disk capacity"), path); @@ -4828,36 +4825,24 @@ zpool_label_disk_check(char *path) { struct dk_gpt *vtoc; int err; - HANDLE fd; + int fd; if ((fd = zpool_open_delay(10, path, O_RDWR|O_DIRECT)) < 0) return (errno); if ((err = efi_alloc_and_read(fd, &vtoc)) != 0) { -#ifdef _WIN32 - CloseHandle(fd); -#else (void) close(fd); -#endif return (err); } if (vtoc->efi_flags & EFI_GPT_PRIMARY_CORRUPT) { efi_free(vtoc); -#ifdef _WIN32 - CloseHandle(fd); -#else (void)close(fd); -#endif return (EIDRM); } efi_free(vtoc); -#ifdef _WIN32 - CloseHandle(fd); -#else (void)close(fd); -#endif return (0); } @@ -4871,7 +4856,7 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) char path[MAXPATHLEN]; struct dk_gpt *vtoc; int rval; - HANDLE fd; + int fd; size_t resv = EFI_MIN_RESV_SIZE; uint64_t slice_size; diskaddr_t start_block; @@ -4929,11 +4914,7 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) */ if (errno == ENOMEM) (void) no_memory(hdl); -#ifdef _WIN32 - CloseHandle(fd); -#else (void) close(fd); -#endif zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "cannot " "label '%s': unable to read disk capacity"), path); @@ -4972,11 +4953,7 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) * ecting the user to manually label the disk and give * a specific slice. */ -#ifdef _WIN32 - CloseHandle(fd); -#else (void) close(fd); -#endif efi_free(vtoc); zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "try using " @@ -4984,11 +4961,7 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, const char *name) return (zfs_error(hdl, EZFS_LABELFAILED, errbuf)); } -#ifdef _WIN32 - CloseHandle(fd); -#else (void)close(fd); -#endif efi_free(vtoc); /* Wait for the first expected partition to appear. */ diff --git a/ZFSin/zfs/lib/libzfs/libzfs_sendrecv.c b/ZFSin/zfs/lib/libzfs/libzfs_sendrecv.c index 3a90ef49..4bbf7379 100644 --- a/ZFSin/zfs/lib/libzfs/libzfs_sendrecv.c +++ b/ZFSin/zfs/lib/libzfs/libzfs_sendrecv.c @@ -137,7 +137,7 @@ ssread(void *buf, size_t len, FILE *stream) { size_t outlen; #ifdef WIN32 - /* Windows we have a SOCKET type here*/ + /* Windows we have a SOCKET type here - can't change fread() call. */ DWORD rv; if (!ReadFile(stream, buf, len, &rv, NULL)) return 0; @@ -210,7 +210,7 @@ ddt_update(libzfs_handle_t *hdl, dedup_table_t *ddt, zio_cksum_t *cs, static int dump_record(dmu_replay_record_t *drr, void *payload, int payload_len, - zio_cksum_t *zc, HANDLE outfd) + zio_cksum_t *zc, int outfd) { ASSERT3U(offsetof(dmu_replay_record_t, drr_u.drr_checksum.drr_checksum), ==, sizeof (dmu_replay_record_t) - sizeof (zio_cksum_t)); @@ -224,31 +224,17 @@ dump_record(dmu_replay_record_t *drr, void *payload, int payload_len, (void) fletcher_4_incremental_native( &drr->drr_u.drr_checksum.drr_checksum, sizeof (zio_cksum_t), zc); -#ifdef WIN32 - DWORD byteswritten = 0; - if (!WriteFile(outfd, drr, sizeof(*drr), &byteswritten, NULL)) { - return (GetLastError()); - } -#else if (write(outfd, drr, sizeof (*drr)) == -1) return (errno); -#endif + if (payload_len != 0) { (void) fletcher_4_incremental_native(payload, payload_len, zc); -#ifdef WIN32 - byteswritten = 0; - if (!WriteFile(outfd, payload, payload_len, &byteswritten, NULL)) { - return (GetLastError()); - } -#else if (write(outfd, payload, payload_len) == -1) return (errno); -#endif } return (0); } - /* * This function is started in a separate thread when the dedup option * has been requested. The main send thread determines the list of @@ -310,12 +296,7 @@ cksummer(void *arg) ddt.ddt_full = B_FALSE; outfd = dda->outputfd; -#ifdef WIN32 - // "inputfd" is from socketpair(), so SOCKET type (HANDLE) and not "fd int". - ofp = dda->inputfd; -#else ofp = fdopen(dda->inputfd, "r"); -#endif while (ssread(drr, sizeof (*drr), ofp) != 0) { /* @@ -522,7 +503,11 @@ cksummer(void *arg) umem_cache_destroy(ddt.ddecache); free(ddt.dedup_hash_array); free(buf); -#ifndef WIN32 +#ifdef _WIN32 + // We don't want to wrap fclose() so this is a special + // place we manually close the handle from socketpair(). + CloseHandle(ofp); +#else (void) fclose(ofp); #endif @@ -1301,7 +1286,7 @@ send_progress_thread(void *arg) 0, NULL, OPEN_EXISTING, 0, NULL); libzfs_handle_t tmp; if (h != INVALID_HANDLE_VALUE) { - tmp.libzfs_fd = h; + tmp.libzfs_fd = HTOI(h); hdl = &tmp; } #endif @@ -2051,13 +2036,8 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, dda.inputfd = pipefd[1]; dda.dedup_hdl = zhp->zfs_hdl; if ((err = pthread_create(&tid, NULL, cksummer, &dda)) != 0) { -#ifdef WIN32 - (void) closesocket(pipefd[0]); - (void) closesocket(pipefd[1]); -#else (void) close(pipefd[0]); (void) close(pipefd[1]); -#endif zfs_error_aux(zhp->zfs_hdl, strerror(errno)); return (zfs_error(zhp->zfs_hdl, EZFS_THREADCREATEFAILED, errbuf)); @@ -2136,19 +2116,11 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, bzero(&drr, sizeof (drr)); drr.drr_type = DRR_END; drr.drr_u.drr_end.drr_checksum = zc; -#ifdef WIN32 - DWORD byteswritten = 0; - if (!WriteFile(outfd, &drr, sizeof(drr), &byteswritten, NULL)) { - err = GetLastError(); - goto stderr_out; - } -#else err = write(outfd, &drr, sizeof (drr)); if (err == -1) { err = errno; goto stderr_out; } -#endif err = 0; } @@ -2197,20 +2169,11 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, ++holdseq; (void) snprintf(sdd.holdtag, sizeof (sdd.holdtag), ".send-%d-%llu", getpid(), (u_longlong_t)holdseq); -#ifdef WIN32 - sdd.cleanup_fd = CreateFile(ZFS_DEV, GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, 0, NULL); - if (sdd.cleanup_fd == INVALID_HANDLE_VALUE) { - err = errno; - goto stderr_out; - } -#else sdd.cleanup_fd = open(ZFS_DEV, O_RDWR); if (sdd.cleanup_fd < 0) { err = errno; goto stderr_out; } -#endif sdd.snapholds = fnvlist_alloc(); } else { sdd.cleanup_fd = -1; @@ -2275,20 +2238,12 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, if (tid_set != 0) { if (err != 0) (void) pthread_cancel(tid); -#ifdef WIN32 - (void) closesocket(pipefd[0]); -#else (void) close(pipefd[0]); -#endif (void) pthread_join(tid, NULL); } if (sdd.cleanup_fd != -1) { -#ifdef WIN32 - VERIFY(0 != CloseHandle(sdd.cleanup_fd)); -#else VERIFY(0 == close(sdd.cleanup_fd)); -#endif sdd.cleanup_fd = -1; } @@ -2301,18 +2256,10 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, */ dmu_replay_record_t drr = { 0 }; drr.drr_type = DRR_END; -#ifdef WIN32 - DWORD byteswritten = 0; - if (!WriteFile(outfd, &drr, sizeof(drr), &byteswritten, NULL)) { - return (zfs_standard_error(zhp->zfs_hdl, - GetLastError(), errbuf)); - } -#else if (write(outfd, &drr, sizeof (drr)) == -1) { return (zfs_standard_error(zhp->zfs_hdl, errno, errbuf)); } -#endif } return (err || sdd.err); @@ -2324,13 +2271,9 @@ zfs_send(zfs_handle_t *zhp, const char *fromsnap, const char *tosnap, nvlist_free(fss); fnvlist_free(sdd.snapholds); -#ifdef WIN32 - if (sdd.cleanup_fd != INVALID_HANDLE_VALUE) - VERIFY(CloseHandle(sdd.cleanup_fd)); -#else if (sdd.cleanup_fd != -1) VERIFY(0 == close(sdd.cleanup_fd)); -#endif + if (tid_set != 0) { (void) pthread_cancel(tid); (void) close(pipefd[0]); @@ -2437,11 +2380,7 @@ recv_read(libzfs_handle_t *hdl, int fd, void *buf, int ilen, int len = ilen; do { -#ifdef WIN32 - ReadFile(fd, cp, len, &rv, NULL); -#else rv = read(fd, cp, len); -#endif cp += rv; len -= rv; } while (rv > 0); @@ -4877,7 +4816,7 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, nvlist_t *props, { char *top_zfs = NULL; int err; - HANDLE cleanup_fd; + int cleanup_fd; uint64_t action_handle = 0; struct _stat64 sb; char *originsnap = NULL; @@ -4930,16 +4869,6 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, nvlist_t *props, if (err && err != ENOENT) return (err); } -#ifdef WIN32 - cleanup_fd = CreateFile(ZFS_DEV, GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, 0, NULL); - VERIFY(cleanup_fd != INVALID_HANDLE_VALUE); - - err = zfs_receive_impl(hdl, tosnap, originsnap, flags, infd, NULL, NULL, - stream_avl, &top_zfs, cleanup_fd, &action_handle, NULL, props); - - VERIFY(CloseHandle(cleanup_fd)); -#else cleanup_fd = open(ZFS_DEV, O_RDWR); VERIFY(cleanup_fd >= 0); @@ -4947,7 +4876,6 @@ zfs_receive(libzfs_handle_t *hdl, const char *tosnap, nvlist_t *props, stream_avl, &top_zfs, cleanup_fd, &action_handle, NULL, props); VERIFY(0 == close(cleanup_fd)); -#endif if (err == 0 && !flags->nomount && top_zfs) { zfs_handle_t *zhp = NULL; diff --git a/ZFSin/zfs/lib/libzfs/libzfs_util.c b/ZFSin/zfs/lib/libzfs/libzfs_util.c index 33c4456d..8d837023 100644 --- a/ZFSin/zfs/lib/libzfs/libzfs_util.c +++ b/ZFSin/zfs/lib/libzfs/libzfs_util.c @@ -1024,14 +1024,8 @@ libzfs_init(void) return (NULL); } -#ifdef WIN32 - hdl->libzfs_fd = CreateFile(ZFS_DEV, GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, 0, NULL); - if ((hdl->libzfs_fd) == INVALID_HANDLE_VALUE) { -#else - hdl->libzfs_fd = open(ZFS_DEV, O_RDWR)); + hdl->libzfs_fd = open(ZFS_DEV, O_RDWR); if (hdl->libzfs_fd < 0) { -#endif (void) fprintf(stderr, gettext("Unable to open %s: %s.\n"), ZFS_DEV, strerror(errno)); @@ -1067,11 +1061,8 @@ libzfs_init(void) #endif if (libzfs_core_init() != 0) { -#ifdef WIN32 - (void) CloseHandle(hdl->libzfs_fd); -#else (void) close(hdl->libzfs_fd); -#endif + #ifdef LINUX (void) fclose(hdl->libzfs_mnttab); #endif @@ -1102,11 +1093,8 @@ libzfs_init(void) void libzfs_fini(libzfs_handle_t *hdl) { -#ifdef WIN32 - (void) CloseHandle(hdl->libzfs_fd); -#else (void) close(hdl->libzfs_fd); -#endif + #ifdef LINUX if (hdl->libzfs_mnttab) #ifdef HAVE_SETMNTENT diff --git a/ZFSin/zfs/lib/libzfs_core/libzfs_core.c b/ZFSin/zfs/lib/libzfs_core/libzfs_core.c index 88e10157..4db7fa32 100644 --- a/ZFSin/zfs/lib/libzfs_core/libzfs_core.c +++ b/ZFSin/zfs/lib/libzfs_core/libzfs_core.c @@ -90,11 +90,8 @@ #include #include #include -#ifdef _WIN32 -static HANDLE g_fd = INVALID_HANDLE_VALUE; -#else + static int g_fd = -1; -#endif static pthread_mutex_t g_lock = PTHREAD_MUTEX_INITIALIZER; static int g_refcount; @@ -139,14 +136,7 @@ libzfs_core_init(void) { (void) pthread_mutex_lock(&g_lock); if (g_refcount == 0) { - //g_fd = open("/dev/zfs", O_RDWR); - g_fd = CreateFile("\\\\.\\ZFS", GENERIC_READ | GENERIC_WRITE, - 0, NULL, OPEN_EXISTING, 0, NULL); - - if (g_fd == INVALID_HANDLE_VALUE) { - (void) pthread_mutex_unlock(&g_lock); - return (errno); - } + g_fd = open(ZFS_DEV, O_RDWR); } g_refcount++; @@ -166,10 +156,9 @@ libzfs_core_fini(void) if (g_refcount > 0) g_refcount--; - if (g_refcount == 0 && g_fd != INVALID_HANDLE_VALUE) { - //(void) close(g_fd); - (void)CloseHandle(g_fd); - g_fd = INVALID_HANDLE_VALUE; + if (g_refcount == 0 && g_fd != -1) { + (void) close(g_fd); + g_fd = -1; } (void) pthread_mutex_unlock(&g_lock); } @@ -181,7 +170,7 @@ libzfs_core_fini(void) * can handle this, so this wrapper is not required. */ static int -zioctl(HANDLE fildes, zfs_ioc_t ioc, zfs_cmd_t *zc) +zioctl(int fildes, zfs_ioc_t ioc, zfs_cmd_t *zc) { return ioctl(g_fd, ioc, zc); } diff --git a/ZFSin/zfs/lib/libzfs_core/libzfs_core/libzfs_core.vcxproj b/ZFSin/zfs/lib/libzfs_core/libzfs_core/libzfs_core.vcxproj index 8ac2a9d4..811433a1 100644 --- a/ZFSin/zfs/lib/libzfs_core/libzfs_core/libzfs_core.vcxproj +++ b/ZFSin/zfs/lib/libzfs_core/libzfs_core/libzfs_core.vcxproj @@ -109,7 +109,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -117,8 +117,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/lib/libzpool/libzpool/libzpool.vcxproj b/ZFSin/zfs/lib/libzpool/libzpool/libzpool.vcxproj index f4f2959d..e9965520 100644 --- a/ZFSin/zfs/lib/libzpool/libzpool/libzpool.vcxproj +++ b/ZFSin/zfs/lib/libzpool/libzpool/libzpool.vcxproj @@ -268,7 +268,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - + MultiThreadedDebug 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 @@ -276,8 +276,7 @@ $(SolutionDir)/ZFSin/zfs/lib/libspl/include;$(SolutionDir)/ZFSin/zfs/include;$(SolutionDir)/ZFSin/zfs/lib/libpthread;$(SolutionDir)/ZFSin/zfs/lib/zlib-1.2.3;%(AdditionalIncludeDirectories) __x86_64 - - + MultiThreaded 4018;4100;4152;4200;4201;4211;4204;4210;4389;4706;4146;4242 diff --git a/ZFSin/zfs/module/zfs/zfs_ioctl.c b/ZFSin/zfs/module/zfs/zfs_ioctl.c index ba632787..7360a9aa 100644 --- a/ZFSin/zfs/module/zfs/zfs_ioctl.c +++ b/ZFSin/zfs/module/zfs/zfs_ioctl.c @@ -7964,6 +7964,7 @@ zfs_attach(void) WIN_DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = (PDRIVER_DISPATCH)dispatcher; WIN_DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = (PDRIVER_DISPATCH)dispatcher; + fastio_init(&WIN_DriverObject->FastIoDispatch); // Register some locking callback thingy extern NTSTATUS ZFSCallbackAcquireForCreateSection( @@ -7981,7 +7982,6 @@ zfs_attach(void) FilterCallbacks.SizeOfFsFilterCallbacks = sizeof(FS_FILTER_CALLBACKS); FilterCallbacks.PreAcquireForSectionSynchronization = ZFSCallbackAcquireForCreateSection; FilterCallbacks.PreReleaseForSectionSynchronization = ZFSCallbackReleaseForCreateSection; - FilterCallbacks.PreAcquireForSectionSynchronization = ZFSCallbackAcquireForCreateSection; FilterCallbacks.PostAcquireForSectionSynchronization = ZFSCallbackAcquireForCreateSection; FilterCallbacks.PreReleaseForSectionSynchronization = ZFSCallbackReleaseForCreateSection; @@ -7995,7 +7995,6 @@ zfs_attach(void) FilterCallbacks.PreReleaseForModifiedPageWriter = ZFSCallbackReleaseForCreateSection; FilterCallbacks.PostReleaseForModifiedPageWriter = ZFSCallbackReleaseForCreateSection; - NTSTATUS Status; Status = FsRtlRegisterFileSystemFilterCallbacks(WIN_DriverObject, diff --git a/ZFSin/zfs/module/zfs/zfs_vnops_windows_lib.c b/ZFSin/zfs/module/zfs/zfs_vnops_windows_lib.c index bb489f49..278c6f87 100644 --- a/ZFSin/zfs/module/zfs/zfs_vnops_windows_lib.c +++ b/ZFSin/zfs/module/zfs/zfs_vnops_windows_lib.c @@ -2460,17 +2460,18 @@ NTSTATUS file_standard_information(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_ST standard->NumberOfLinks = 1; if (IrpSp->FileObject && IrpSp->FileObject->FsContext) { struct vnode *vp = IrpSp->FileObject->FsContext; - VN_HOLD(vp); - znode_t *zp = VTOZ(vp); - standard->Directory = vnode_isdir(vp) ? TRUE : FALSE; - // sa_object_size(zp->z_sa_hdl, &blksize, &nblks); - uint64_t blk = zfs_blksz(zp); - standard->AllocationSize.QuadPart = P2ROUNDUP(zp->z_size ? zp->z_size : 1, blk); // space taken on disk, multiples of block size - //standard->AllocationSize.QuadPart = zp->z_size; // space taken on disk, multiples of block size - standard->EndOfFile.QuadPart = vnode_isdir(vp) ? 0 : zp->z_size; // byte size of file - standard->NumberOfLinks = zp->z_links; - standard->DeletePending = vnode_deleteonclose(vp) ? TRUE : FALSE; - VN_RELE(vp); + if (VN_HOLD(vp) == 0) { + znode_t *zp = VTOZ(vp); + standard->Directory = vnode_isdir(vp) ? TRUE : FALSE; + // sa_object_size(zp->z_sa_hdl, &blksize, &nblks); + uint64_t blk = zfs_blksz(zp); + standard->AllocationSize.QuadPart = P2ROUNDUP(zp->z_size ? zp->z_size : 1, blk); // space taken on disk, multiples of block size + //standard->AllocationSize.QuadPart = zp->z_size; // space taken on disk, multiples of block size + standard->EndOfFile.QuadPart = vnode_isdir(vp) ? 0 : zp->z_size; // byte size of file + standard->NumberOfLinks = zp->z_links; + standard->DeletePending = vnode_deleteonclose(vp) ? TRUE : FALSE; + VN_RELE(vp); + } dprintf("Returning size %llu and allocsize %llu\n", standard->EndOfFile.QuadPart, standard->AllocationSize.QuadPart); Irp->IoStatus.Information = sizeof(FILE_STANDARD_INFORMATION); @@ -3551,6 +3552,530 @@ NTSTATUS ioctl_mountdev_query_stable_guid(PDEVICE_OBJECT DeviceObject, PIRP Irp, return STATUS_SUCCESS; } + +/* FastIO support */ + + +static BOOLEAN __stdcall fastio_check_if_possible(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, ULONG Length, BOOLEAN Wait, + ULONG LockKey, BOOLEAN CheckForReadOperation, PIO_STATUS_BLOCK IoStatus, + PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp = FileObject->FsContext; + LARGE_INTEGER quadlen; + + quadlen.QuadPart = Length; + + if (CheckForReadOperation) { + if (FsRtlFastCheckLockForRead(&vp->lock, FileOffset, &quadlen, LockKey, FileObject, PsGetCurrentProcess())) + return TRUE; + } + else { + if (/*!vp->Vcb->readonly && !is_subvol_readonly(vp->subvol, NULL) && */ // FIXME, readonly + FsRtlFastCheckLockForWrite(&vp->lock, FileOffset, &quadlen, LockKey, FileObject, PsGetCurrentProcess())) + return TRUE; + } + + return FALSE; +} + +static BOOLEAN __stdcall fastio_write(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, + ULONG Length, BOOLEAN Wait, ULONG LockKey, PVOID Buffer, PIO_STATUS_BLOCK IoStatus, + PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp = FileObject->FsContext; + BOOLEAN ret; + +#if 0 + if (!ExAcquireResourceSharedLite(&fcb->Vcb->tree_lock, Wait)) + return false; +#endif + + if (!ExAcquireResourceExclusiveLite(vp->FileHeader.Resource, Wait)) { +// ExReleaseResourceLite(&vp->Vcb->tree_lock); + return FALSE; + } + + ret = FsRtlCopyWrite(FileObject, FileOffset, Length, Wait, LockKey, Buffer, IoStatus, DeviceObject); + +// if (ret) +// vp->inode_item.st_size = fcb->Header.FileSize.QuadPart; + + ExReleaseResourceLite(vp->FileHeader.Resource); +// ExReleaseResourceLite(&fcb->Vcb->tree_lock); + + return ret; +} + +// It would perhaps be re-use the query_basic_info() call above, if some of the +// IrpSp is moved out of it. +static BOOLEAN __stdcall fastio_query_basic_info(PFILE_OBJECT FileObject, BOOLEAN wait, + PFILE_BASIC_INFORMATION fbi, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp; + zfs_dirlist_t *ccb; + + FsRtlEnterFileSystem(); + + dprintf("%s: \n", __func__); + + if (!FileObject) { + FsRtlExitFileSystem(); + return FALSE; + } + + vp = FileObject->FsContext; + + if (!vp) { + FsRtlExitFileSystem(); + return FALSE; + } + +#if 0 + // Only dirs have ccb for us, perhaps this is a mistake? + ccb = FileObject->FsContext2; + + if (!ccb) { + FsRtlExitFileSystem(); + return false; + } + + if (!(ccb->access & (FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES))) { + FsRtlExitFileSystem(); + return false; + } + + // handle streams as well + if (vp->ads) { + if (!ccb->fileref || !ccb->fileref->parent || !ccb->fileref->parent->fcb) { + FsRtlExitFileSystem(); + return false; + } + + fcb = ccb->fileref->parent->fcb; + } +#endif + + if (!ExAcquireResourceSharedLite(vp->FileHeader.Resource, wait)) { + FsRtlExitFileSystem(); + return FALSE; + } + + if (VN_HOLD(vp) == 0) { + znode_t *zp = VTOZ(vp); + zfsvfs_t *zfsvfs = zp->z_zfsvfs; + sa_bulk_attr_t bulk[3]; + int count = 0; + uint64_t mtime[2]; + uint64_t ctime[2]; + uint64_t crtime[2]; + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16); + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16); + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zfsvfs), NULL, &crtime, 16); + sa_bulk_lookup(zp->z_sa_hdl, bulk, count); + + TIME_UNIX_TO_WINDOWS(mtime, fbi->LastWriteTime.QuadPart); + TIME_UNIX_TO_WINDOWS(ctime, fbi->ChangeTime.QuadPart); + TIME_UNIX_TO_WINDOWS(crtime, fbi->CreationTime.QuadPart); + TIME_UNIX_TO_WINDOWS(zp->z_atime, fbi->LastAccessTime.QuadPart); + + fbi->FileAttributes = zfs_getwinflags(zp); + VN_RELE(vp); + + IoStatus->Status = STATUS_SUCCESS; + IoStatus->Information = sizeof(FILE_BASIC_INFORMATION); + } else { + IoStatus->Status = STATUS_INVALID_PARAMETER; + IoStatus->Information = 0; + } + + ExReleaseResourceLite(vp->FileHeader.Resource); + FsRtlExitFileSystem(); + return TRUE; +} + +static BOOLEAN __stdcall fastio_query_standard_info(PFILE_OBJECT FileObject, + BOOLEAN wait, PFILE_STANDARD_INFORMATION fsi, PIO_STATUS_BLOCK IoStatus, + PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp; + zfs_dirlist_t *ccb; + BOOLEAN ads; + ULONG adssize; + + FsRtlEnterFileSystem(); + + dprintf("%s: \n", __func__); + + if (!FileObject) { + FsRtlExitFileSystem(); + return FALSE; + } + + vp = FileObject->FsContext; + ccb = FileObject->FsContext2; + + if (!vp) { + FsRtlExitFileSystem(); + return FALSE; + } + + if (!ExAcquireResourceSharedLite(vp->FileHeader.Resource, wait)) { + FsRtlExitFileSystem(); + return FALSE; + } + +#if 0 + // TODO handle streams + ads = fcb->ads; + + if (ads) { + struct _fcb* fcb2; + + if (!ccb || !ccb->fileref || !ccb->fileref->parent || !ccb->fileref->parent->fcb) { + ExReleaseResourceLite(fcb->Header.Resource); + FsRtlExitFileSystem(); + return false; + } + + adssize = fcb->adsdata.Length; + + fcb2 = ccb->fileref->parent->fcb; + + ExReleaseResourceLite(fcb->Header.Resource); + + fcb = fcb2; + + if (!ExAcquireResourceSharedLite(fcb->Header.Resource, wait)) { + FsRtlExitFileSystem(); + return false; + } + + fsi->AllocationSize.QuadPart = fsi->EndOfFile.QuadPart = adssize; + fsi->NumberOfLinks = fcb->inode_item.st_nlink; + fsi->Directory = false; + } + else { + fsi->AllocationSize.QuadPart = fcb_alloc_size(fcb); + fsi->EndOfFile.QuadPart = S_ISDIR(fcb->inode_item.st_mode) ? 0 : fcb->inode_item.st_size; + fsi->NumberOfLinks = fcb->inode_item.st_nlink; + fsi->Directory = S_ISDIR(fcb->inode_item.st_mode); + } +#endif + + if (VN_HOLD(vp) == 0) { + znode_t *zp = VTOZ(vp); + fsi->Directory = vnode_isdir(vp) ? TRUE : FALSE; + uint64_t blk = zfs_blksz(zp); + fsi->AllocationSize.QuadPart = P2ROUNDUP(zp->z_size ? zp->z_size : 1, blk); // space taken on disk, multiples of block size + fsi->EndOfFile.QuadPart = vnode_isdir(vp) ? 0 : zp->z_size; // byte size of file + fsi->NumberOfLinks = zp->z_links; + fsi->DeletePending = vnode_deleteonclose(vp) ? TRUE : FALSE; + VN_RELE(vp); + } + + IoStatus->Status = STATUS_SUCCESS; + IoStatus->Information = sizeof(FILE_STANDARD_INFORMATION); + + ExReleaseResourceLite(vp->FileHeader.Resource); + + FsRtlExitFileSystem(); + + return TRUE; +} + +#define fastio_possible(vp) (!FsRtlAreThereCurrentFileLocks(&vp->lock) /*&& !fcb->Vcb->readonly */ ? FastIoIsPossible : FastIoIsQuestionable) + +static BOOLEAN __stdcall fastio_lock(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, + PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key, BOOLEAN FailImmediately, + BOOLEAN ExclusiveLock, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) +{ + BOOLEAN ret; + vnode_t *vp = FileObject->FsContext; + + dprintf("%s: \n", __func__); + + if (!vnode_isreg(vp)) { + dprintf("%s: can only lock files\n", __func__); + IoStatus->Status = STATUS_INVALID_PARAMETER; + IoStatus->Information = 0; + return TRUE; + } + + FsRtlEnterFileSystem(); + ExAcquireResourceSharedLite(vp->FileHeader.Resource, TRUE); + + ret = FsRtlFastLock(&vp->lock, FileObject, FileOffset, Length, ProcessId, Key, FailImmediately, + ExclusiveLock, IoStatus, NULL, FALSE); + + if (ret) + vp->FileHeader.IsFastIoPossible = fastio_possible(vp); + + ExReleaseResourceLite(vp->FileHeader.Resource); + FsRtlExitFileSystem(); + + return ret; +} + +static BOOLEAN __stdcall fastio_unlock_single(PFILE_OBJECT FileObject, PLARGE_INTEGER FileOffset, + PLARGE_INTEGER Length, PEPROCESS ProcessId, ULONG Key, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp = FileObject->FsContext; + + dprintf("%s: \n", __func__); + + IoStatus->Information = 0; + + if (!vnode_isreg(vp)) { + dprintf("%s: can only lock files\n", __func__); + IoStatus->Status = STATUS_INVALID_PARAMETER; + return TRUE; + } + + FsRtlEnterFileSystem(); + + IoStatus->Status = FsRtlFastUnlockSingle(&vp->lock, FileObject, FileOffset, Length, ProcessId, Key, NULL, FALSE); + + vp->FileHeader.IsFastIoPossible = fastio_possible(vp); + + FsRtlExitFileSystem(); + + return TRUE; +} + +static BOOLEAN __stdcall fastio_unlock_all(PFILE_OBJECT FileObject, PEPROCESS ProcessId, + PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp = FileObject->FsContext; + + dprintf("%s: \n", __func__); + + IoStatus->Information = 0; + + if (!vnode_isreg(vp)) { + dprintf("%s: can only lock files\n", __func__); + IoStatus->Status = STATUS_INVALID_PARAMETER; + return TRUE; + } + + FsRtlEnterFileSystem(); + + ExAcquireResourceSharedLite(vp->FileHeader.Resource, TRUE); + + IoStatus->Status = FsRtlFastUnlockAll(&vp->lock, FileObject, ProcessId, NULL); + + vp->FileHeader.IsFastIoPossible = fastio_possible(vp); + + ExReleaseResourceLite(vp->FileHeader.Resource); + + FsRtlExitFileSystem(); + + return TRUE; +} + +static BOOLEAN __stdcall fastio_unlock_all_by_key(PFILE_OBJECT FileObject, PVOID ProcessId, + ULONG Key, PIO_STATUS_BLOCK IoStatus, PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp = FileObject->FsContext; + + dprintf("%s: \n", __func__); + + IoStatus->Information = 0; + + if (!vnode_isreg(vp)) { + dprintf("%s: can only lock files\n", __func__); + IoStatus->Status = STATUS_INVALID_PARAMETER; + return TRUE; + } + + FsRtlEnterFileSystem(); + + ExAcquireResourceSharedLite(vp->FileHeader.Resource, TRUE); + + IoStatus->Status = FsRtlFastUnlockAllByKey(&vp->lock, FileObject, ProcessId, Key, NULL); + + vp->FileHeader.IsFastIoPossible = fastio_possible(vp); + + ExReleaseResourceLite(vp->FileHeader.Resource); + + FsRtlExitFileSystem(); + + return TRUE; +} + +static BOOLEAN __stdcall fastio_query_network_open_info(PFILE_OBJECT FileObject, + BOOLEAN Wait, FILE_NETWORK_OPEN_INFORMATION *fnoi, PIO_STATUS_BLOCK IoStatus, + PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp; + zfs_dirlist_t *ccb; + + FsRtlEnterFileSystem(); + + dprintf("%s: \n", __func__); + + RtlZeroMemory(fnoi, sizeof(FILE_NETWORK_OPEN_INFORMATION)); + + vp = FileObject->FsContext; + + if (!vp /*|| fcb == fcb->Vcb->volume_fcb*/ ) { + FsRtlExitFileSystem(); + return FALSE; + } + + ccb = FileObject->FsContext2; + +#if 0 + if (!ccb) { + FsRtlExitFileSystem(); + return false; + } +#endif + + // fileref = ccb->fileref; + + // FIXME, handle streams +#if 0 + if (fcb->ads) { + if (!fileref || !fileref->parent) { + ERR("no fileref for stream\n"); + FsRtlExitFileSystem(); + return false; + } + + ii = &fileref->parent->fcb->inode_item; + } + else + ii = &fcb->inode_item; +#endif + + if (VN_HOLD(vp) == 0) { + znode_t *zp = VTOZ(vp); + zfsvfs_t *zfsvfs = zp->z_zfsvfs; + sa_bulk_attr_t bulk[3]; + int count = 0; + uint64_t mtime[2]; + uint64_t ctime[2]; + uint64_t crtime[2]; + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_MTIME(zfsvfs), NULL, &mtime, 16); + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CTIME(zfsvfs), NULL, &ctime, 16); + SA_ADD_BULK_ATTR(bulk, count, SA_ZPL_CRTIME(zfsvfs), NULL, &crtime, 16); + sa_bulk_lookup(zp->z_sa_hdl, bulk, count); + + TIME_UNIX_TO_WINDOWS(mtime, fnoi->LastWriteTime.QuadPart); + TIME_UNIX_TO_WINDOWS(ctime, fnoi->ChangeTime.QuadPart); + TIME_UNIX_TO_WINDOWS(crtime, fnoi->CreationTime.QuadPart); + TIME_UNIX_TO_WINDOWS(zp->z_atime, fnoi->LastAccessTime.QuadPart); + fnoi->AllocationSize.QuadPart = P2ROUNDUP(zp->z_size, zfs_blksz(zp)); + fnoi->EndOfFile.QuadPart = vnode_isdir(vp) ? 0 : zp->z_size; + fnoi->FileAttributes = zfs_getwinflags(zp); + VN_RELE(vp); + } + + FsRtlExitFileSystem(); + + return TRUE; +} + +static NTSTATUS __stdcall fastio_acquire_for_mod_write(PFILE_OBJECT FileObject, + PLARGE_INTEGER EndingOffset, struct _ERESOURCE **ResourceToRelease, PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp; + + dprintf("%s: \n", __func__); + + vp = FileObject->FsContext; + + if (!vp) + return STATUS_INVALID_PARAMETER; + + // Make sure we don't get interrupted by the flush thread, which can cause a deadlock +#if 0 + if (!ExAcquireResourceSharedLite(&vp->Vcb->tree_lock, false)) + return STATUS_CANT_WAIT; +#endif + + if (!ExAcquireResourceExclusiveLite(vp->FileHeader.Resource, FALSE)) { + //ExReleaseResourceLite(&fcb->Vcb->tree_lock); + dprintf("%s: returning STATUS_CANT_WAIT\n", __func__); + return STATUS_CANT_WAIT; + } + + // Ideally this would be PagingIoResource, but that doesn't play well with copy-on-write, + // as we can't guarantee that we won't need to do any reallocations. + + *ResourceToRelease = vp->FileHeader.Resource; + + dprintf("%s: returning STATUS_SUCCESS\n", __func__); + + return STATUS_SUCCESS; +} + +static NTSTATUS __stdcall fastio_release_for_mod_write(PFILE_OBJECT FileObject, + struct _ERESOURCE *ResourceToRelease, PDEVICE_OBJECT DeviceObject) +{ + vnode_t *vp; + + dprintf("%s:\n", __func__); + + vp = FileObject->FsContext; + + ExReleaseResourceLite(ResourceToRelease); + + //ExReleaseResourceLite(&fcb->Vcb->tree_lock); + return STATUS_SUCCESS; +} + +static NTSTATUS __stdcall fastio_acquire_for_ccflush(PFILE_OBJECT FileObject, + PDEVICE_OBJECT DeviceObject) +{ + + IoSetTopLevelIrp((PIRP)FSRTL_CACHE_TOP_LEVEL_IRP); + + return STATUS_SUCCESS; +} + +static NTSTATUS __stdcall fastio_release_for_ccflush(PFILE_OBJECT FileObject, + PDEVICE_OBJECT DeviceObject) +{ + + if (IoGetTopLevelIrp() == (PIRP)FSRTL_CACHE_TOP_LEVEL_IRP) + IoSetTopLevelIrp(NULL); + + return STATUS_SUCCESS; +} + +static FAST_IO_DISPATCH FastIoDispatch; + +void fastio_init(FAST_IO_DISPATCH **fast) +{ + RtlZeroMemory(&FastIoDispatch, sizeof(FastIoDispatch)); + FastIoDispatch.SizeOfFastIoDispatch = sizeof(FAST_IO_DISPATCH); + + FastIoDispatch.FastIoCheckIfPossible = fastio_check_if_possible; + FastIoDispatch.FastIoRead = FsRtlCopyRead; + FastIoDispatch.FastIoWrite = fastio_write; + FastIoDispatch.FastIoQueryBasicInfo = fastio_query_basic_info; + FastIoDispatch.FastIoQueryStandardInfo = fastio_query_standard_info; + FastIoDispatch.FastIoLock = fastio_lock; + FastIoDispatch.FastIoUnlockSingle = fastio_unlock_single; + FastIoDispatch.FastIoUnlockAll = fastio_unlock_all; + FastIoDispatch.FastIoUnlockAllByKey = fastio_unlock_all_by_key; + FastIoDispatch.FastIoQueryNetworkOpenInfo = fastio_query_network_open_info; + FastIoDispatch.AcquireForModWrite = fastio_acquire_for_mod_write; + FastIoDispatch.MdlRead = FsRtlMdlReadDev; + FastIoDispatch.MdlReadComplete = FsRtlMdlReadCompleteDev; + FastIoDispatch.PrepareMdlWrite = FsRtlPrepareMdlWriteDev; + FastIoDispatch.MdlWriteComplete = FsRtlMdlWriteCompleteDev; + FastIoDispatch.ReleaseForModWrite = fastio_release_for_mod_write; + FastIoDispatch.AcquireForCcFlush = fastio_acquire_for_ccflush; + FastIoDispatch.ReleaseForCcFlush = fastio_release_for_ccflush; + + *fast = &FastIoDispatch; + dprintf("Using FASTIO\n"); +} + + + // FFFF9284A054B080: * user_fs_request: unknown class 0x903bc: CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 238, // 0x2d118c - MASS_STORAGE 0x463 diff --git a/zfsinstaller/zfsinstaller.vcxproj b/zfsinstaller/zfsinstaller.vcxproj index 28eabdf7..ee0845ca 100644 --- a/zfsinstaller/zfsinstaller.vcxproj +++ b/zfsinstaller/zfsinstaller.vcxproj @@ -91,7 +91,7 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true pch.h - MultiThreaded + MultiThreadedDebug Console @@ -145,6 +145,7 @@ NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true pch.h + MultiThreaded Console