mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
Add ZFS_IOC offsets for FreeBSD
FreeBSD requires three additional ioctls, they are ZFS_IOC_NEXTBOOT, ZFS_IOC_JAIL, and ZFS_IOC_UNJAIL. These have been added after the Linux-specific ioctls. The range 0x80-0xFF has been reserved for future optional platform-specific ioctls. Any platform may choose to implement these as appropriate. None of the existing ioctl numbers have been changed to maintain compatibility. For Linux no vectors have been registered for the new ioctls and they are reported as unsupported. Reviewed-by: Jorgen Lundman <lundman@lundman.net> Reviewed-by: Allan Jude <allanjude@freebsd.org> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matt Macy <mmacy@FreeBSD.org> Closes #9667
This commit is contained in:
parent
e64e84eca5
commit
054a049841
@ -1190,9 +1190,13 @@ typedef enum {
|
||||
*/
|
||||
typedef enum zfs_ioc {
|
||||
/*
|
||||
* illumos - 81/128 numbers reserved.
|
||||
* Core features - 81/128 numbers reserved.
|
||||
*/
|
||||
#ifdef __FreeBSD__
|
||||
ZFS_IOC_FIRST = 0,
|
||||
#else
|
||||
ZFS_IOC_FIRST = ('Z' << 8),
|
||||
#endif
|
||||
ZFS_IOC = ZFS_IOC_FIRST,
|
||||
ZFS_IOC_POOL_CREATE = ZFS_IOC_FIRST, /* 0x5a00 */
|
||||
ZFS_IOC_POOL_DESTROY, /* 0x5a01 */
|
||||
@ -1280,18 +1284,15 @@ typedef enum zfs_ioc {
|
||||
ZFS_IOC_WAIT, /* 0x5a53 */
|
||||
|
||||
/*
|
||||
* Linux - 3/64 numbers reserved.
|
||||
* Per-platform (Optional) - 6/128 numbers reserved.
|
||||
*/
|
||||
ZFS_IOC_LINUX = ('Z' << 8) + 0x80,
|
||||
ZFS_IOC_EVENTS_NEXT, /* 0x5a81 */
|
||||
ZFS_IOC_EVENTS_CLEAR, /* 0x5a82 */
|
||||
ZFS_IOC_EVENTS_SEEK, /* 0x5a83 */
|
||||
|
||||
/*
|
||||
* FreeBSD - 1/64 numbers reserved.
|
||||
*/
|
||||
ZFS_IOC_FREEBSD = ('Z' << 8) + 0xC0,
|
||||
|
||||
ZFS_IOC_PLATFORM = ZFS_IOC_FIRST + 0x80,
|
||||
ZFS_IOC_EVENTS_NEXT, /* 0x81 (Linux) */
|
||||
ZFS_IOC_EVENTS_CLEAR, /* 0x82 (Linux) */
|
||||
ZFS_IOC_EVENTS_SEEK, /* 0x83 (Linux) */
|
||||
ZFS_IOC_NEXTBOOT, /* 0x84 (FreeBSD) */
|
||||
ZFS_IOC_JAIL, /* 0x85 (FreeBSD) */
|
||||
ZFS_IOC_UNJAIL, /* 0x86 (FreeBSD) */
|
||||
ZFS_IOC_LAST
|
||||
} zfs_ioc_t;
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <libzfs_core.h>
|
||||
#include <libzutil.h>
|
||||
|
||||
#include <sys/nvpair.h>
|
||||
#include <sys/zfs_ioctl.h>
|
||||
@ -99,10 +100,12 @@ static unsigned ioc_skip[] = {
|
||||
ZFS_IOC_SPACE_WRITTEN,
|
||||
ZFS_IOC_POOL_REGUID,
|
||||
ZFS_IOC_SEND_PROGRESS,
|
||||
|
||||
ZFS_IOC_EVENTS_NEXT,
|
||||
ZFS_IOC_EVENTS_CLEAR,
|
||||
ZFS_IOC_EVENTS_SEEK,
|
||||
ZFS_IOC_NEXTBOOT,
|
||||
ZFS_IOC_JAIL,
|
||||
ZFS_IOC_UNJAIL,
|
||||
};
|
||||
|
||||
|
||||
@ -154,7 +157,7 @@ lzc_ioctl_run(zfs_ioc_t ioc, const char *name, nvlist_t *innvl, int expected)
|
||||
zc.zc_nvlist_dst_size = MAX(size * 2, 128 * 1024);
|
||||
zc.zc_nvlist_dst = (uint64_t)(uintptr_t)malloc(zc.zc_nvlist_dst_size);
|
||||
|
||||
if (ioctl(zfs_fd, ioc, &zc) != 0)
|
||||
if (zfs_ioctl_fd(zfs_fd, ioc, &zc) != 0)
|
||||
error = errno;
|
||||
|
||||
if (error != expected) {
|
||||
@ -685,7 +688,7 @@ zfs_destroy(const char *dataset)
|
||||
|
||||
(void) strlcpy(zc.zc_name, dataset, sizeof (zc.zc_name));
|
||||
zc.zc_name[sizeof (zc.zc_name) - 1] = '\0';
|
||||
err = ioctl(zfs_fd, ZFS_IOC_DESTROY, &zc);
|
||||
err = zfs_ioctl_fd(zfs_fd, ZFS_IOC_DESTROY, &zc);
|
||||
|
||||
return (err == 0 ? 0 : errno);
|
||||
}
|
||||
@ -858,7 +861,7 @@ zfs_ioc_input_tests(const char *pool)
|
||||
if (ioc_tested[cmd])
|
||||
continue;
|
||||
|
||||
if (ioctl(zfs_fd, ioc, &zc) != 0 &&
|
||||
if (zfs_ioctl_fd(zfs_fd, ioc, &zc) != 0 &&
|
||||
errno != ZFS_ERR_IOC_CMD_UNAVAIL) {
|
||||
(void) fprintf(stderr, "cmd %d is missing a test case "
|
||||
"(%d)\n", cmd, errno);
|
||||
@ -867,9 +870,12 @@ zfs_ioc_input_tests(const char *pool)
|
||||
}
|
||||
|
||||
enum zfs_ioc_ref {
|
||||
#ifdef __FreeBSD__
|
||||
ZFS_IOC_BASE = 0,
|
||||
#else
|
||||
ZFS_IOC_BASE = ('Z' << 8),
|
||||
LINUX_IOC_BASE = ZFS_IOC_BASE + 0x80,
|
||||
FREEBSD_IOC_BASE = ZFS_IOC_BASE + 0xC0,
|
||||
#endif
|
||||
ZFS_IOC_PLATFORM_BASE = ZFS_IOC_BASE + 0x80,
|
||||
};
|
||||
|
||||
/*
|
||||
@ -972,9 +978,12 @@ validate_ioc_values(void)
|
||||
CHECK(ZFS_IOC_BASE + 81 == ZFS_IOC_REDACT);
|
||||
CHECK(ZFS_IOC_BASE + 82 == ZFS_IOC_GET_BOOKMARK_PROPS);
|
||||
CHECK(ZFS_IOC_BASE + 83 == ZFS_IOC_WAIT);
|
||||
CHECK(LINUX_IOC_BASE + 1 == ZFS_IOC_EVENTS_NEXT);
|
||||
CHECK(LINUX_IOC_BASE + 2 == ZFS_IOC_EVENTS_CLEAR);
|
||||
CHECK(LINUX_IOC_BASE + 3 == ZFS_IOC_EVENTS_SEEK);
|
||||
CHECK(ZFS_IOC_PLATFORM_BASE + 1 == ZFS_IOC_EVENTS_NEXT);
|
||||
CHECK(ZFS_IOC_PLATFORM_BASE + 2 == ZFS_IOC_EVENTS_CLEAR);
|
||||
CHECK(ZFS_IOC_PLATFORM_BASE + 3 == ZFS_IOC_EVENTS_SEEK);
|
||||
CHECK(ZFS_IOC_PLATFORM_BASE + 4 == ZFS_IOC_NEXTBOOT);
|
||||
CHECK(ZFS_IOC_PLATFORM_BASE + 5 == ZFS_IOC_JAIL);
|
||||
CHECK(ZFS_IOC_PLATFORM_BASE + 6 == ZFS_IOC_UNJAIL);
|
||||
|
||||
#undef CHECK
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user