mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
OpenZFS restructuring - libspl
Factor Linux specific pieces out of libspl. Reviewed-by: Ryan Moeller <ryan@ixsystems.com> Reviewed-by: Sean Eric Fagan <sef@ixsystems.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Matt Macy <mmacy@FreeBSD.org> Closes #9336
This commit is contained in:
committed by
Brian Behlendorf
parent
6360e2779e
commit
d31277abb1
@@ -11,11 +11,6 @@ AM_CFLAGS += $(NO_UNUSED_BUT_SET_VARIABLE)
|
||||
libzfs_pcdir = $(datarootdir)/pkgconfig
|
||||
libzfs_pc_DATA = libzfs.pc libzfs_core.pc
|
||||
|
||||
DEFAULT_INCLUDES += \
|
||||
-I$(top_srcdir)/include \
|
||||
-I$(top_srcdir)/module/icp/include \
|
||||
-I$(top_srcdir)/lib/libspl/include
|
||||
|
||||
lib_LTLIBRARIES = libzfs.la
|
||||
|
||||
USER_C = \
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
* Copyright (c) 2016, Intel Corporation.
|
||||
*/
|
||||
|
||||
#include <devid.h>
|
||||
#include <errno.h>
|
||||
#include <libintl.h>
|
||||
#include <libgen.h>
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <devid.h>
|
||||
#include <libintl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -3884,86 +3883,6 @@ zpool_sync_one(zpool_handle_t *zhp, void *data)
|
||||
return (0);
|
||||
}
|
||||
|
||||
#if defined(__sun__) || defined(__sun)
|
||||
/*
|
||||
* Convert from a devid string to a path.
|
||||
*/
|
||||
static char *
|
||||
devid_to_path(char *devid_str)
|
||||
{
|
||||
ddi_devid_t devid;
|
||||
char *minor;
|
||||
char *path;
|
||||
devid_nmlist_t *list = NULL;
|
||||
int ret;
|
||||
|
||||
if (devid_str_decode(devid_str, &devid, &minor) != 0)
|
||||
return (NULL);
|
||||
|
||||
ret = devid_deviceid_to_nmlist("/dev", devid, minor, &list);
|
||||
|
||||
devid_str_free(minor);
|
||||
devid_free(devid);
|
||||
|
||||
if (ret != 0)
|
||||
return (NULL);
|
||||
|
||||
/*
|
||||
* In a case the strdup() fails, we will just return NULL below.
|
||||
*/
|
||||
path = strdup(list[0].devname);
|
||||
|
||||
devid_free_nmlist(list);
|
||||
|
||||
return (path);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert from a path to a devid string.
|
||||
*/
|
||||
static char *
|
||||
path_to_devid(const char *path)
|
||||
{
|
||||
int fd;
|
||||
ddi_devid_t devid;
|
||||
char *minor, *ret;
|
||||
|
||||
if ((fd = open(path, O_RDONLY)) < 0)
|
||||
return (NULL);
|
||||
|
||||
minor = NULL;
|
||||
ret = NULL;
|
||||
if (devid_get(fd, &devid) == 0) {
|
||||
if (devid_get_minor_name(fd, &minor) == 0)
|
||||
ret = devid_str_encode(devid, minor);
|
||||
if (minor != NULL)
|
||||
devid_str_free(minor);
|
||||
devid_free(devid);
|
||||
}
|
||||
(void) close(fd);
|
||||
|
||||
return (ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* Issue the necessary ioctl() to update the stored path value for the vdev. We
|
||||
* ignore any failure here, since a common case is for an unprivileged user to
|
||||
* type 'zpool status', and we'll display the correct information anyway.
|
||||
*/
|
||||
static void
|
||||
set_path(zpool_handle_t *zhp, nvlist_t *nv, const char *path)
|
||||
{
|
||||
zfs_cmd_t zc = {"\0"};
|
||||
|
||||
(void) strncpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
|
||||
(void) strncpy(zc.zc_value, path, sizeof (zc.zc_value));
|
||||
verify(nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID,
|
||||
&zc.zc_guid) == 0);
|
||||
|
||||
(void) ioctl(zhp->zpool_hdl->libzfs_fd, ZFS_IOC_VDEV_SETPATH, &zc);
|
||||
}
|
||||
#endif /* sun */
|
||||
|
||||
#define PATH_BUF_LEN 64
|
||||
|
||||
/*
|
||||
@@ -4019,54 +3938,6 @@ zpool_vdev_name(libzfs_handle_t *hdl, zpool_handle_t *zhp, nvlist_t *nv,
|
||||
(void) snprintf(buf, sizeof (buf), "%llu", (u_longlong_t)value);
|
||||
path = buf;
|
||||
} else if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &path) == 0) {
|
||||
#if defined(__sun__) || defined(__sun)
|
||||
/*
|
||||
* Live VDEV path updates to a kernel VDEV during a
|
||||
* zpool_vdev_name lookup are not supported on Linux.
|
||||
*/
|
||||
char *devid;
|
||||
vdev_stat_t *vs;
|
||||
uint_t vsc;
|
||||
|
||||
/*
|
||||
* If the device is dead (faulted, offline, etc) then don't
|
||||
* bother opening it. Otherwise we may be forcing the user to
|
||||
* open a misbehaving device, which can have undesirable
|
||||
* effects.
|
||||
*/
|
||||
if ((nvlist_lookup_uint64_array(nv, ZPOOL_CONFIG_VDEV_STATS,
|
||||
(uint64_t **)&vs, &vsc) != 0 ||
|
||||
vs->vs_state >= VDEV_STATE_DEGRADED) &&
|
||||
zhp != NULL &&
|
||||
nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &devid) == 0) {
|
||||
/*
|
||||
* Determine if the current path is correct.
|
||||
*/
|
||||
char *newdevid = path_to_devid(path);
|
||||
|
||||
if (newdevid == NULL ||
|
||||
strcmp(devid, newdevid) != 0) {
|
||||
char *newpath;
|
||||
|
||||
if ((newpath = devid_to_path(devid)) != NULL) {
|
||||
/*
|
||||
* Update the path appropriately.
|
||||
*/
|
||||
set_path(zhp, nv, newpath);
|
||||
if (nvlist_add_string(nv,
|
||||
ZPOOL_CONFIG_PATH, newpath) == 0)
|
||||
verify(nvlist_lookup_string(nv,
|
||||
ZPOOL_CONFIG_PATH,
|
||||
&path) == 0);
|
||||
free(newpath);
|
||||
}
|
||||
}
|
||||
|
||||
if (newdevid)
|
||||
devid_str_free(newdevid);
|
||||
}
|
||||
#endif /* sun */
|
||||
|
||||
if (name_flags & VDEV_NAME_FOLLOW_LINKS) {
|
||||
char *rp = realpath(path, NULL);
|
||||
if (rp) {
|
||||
|
||||
@@ -1095,7 +1095,6 @@ zfs_path_to_zhandle(libzfs_handle_t *hdl, char *path, zfs_type_t argtype)
|
||||
{
|
||||
struct stat64 statbuf;
|
||||
struct extmnttab entry;
|
||||
int ret;
|
||||
|
||||
if (path[0] != '/' && strncmp(path, "./", strlen("./")) != 0) {
|
||||
/*
|
||||
@@ -1104,24 +1103,12 @@ zfs_path_to_zhandle(libzfs_handle_t *hdl, char *path, zfs_type_t argtype)
|
||||
return (zfs_open(hdl, path, argtype));
|
||||
}
|
||||
|
||||
if (stat64(path, &statbuf) != 0) {
|
||||
(void) fprintf(stderr, "%s: %s\n", path, strerror(errno));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
/* Reopen MNTTAB to prevent reading stale data from open file */
|
||||
if (freopen(MNTTAB, "r", hdl->libzfs_mnttab) == NULL)
|
||||
return (NULL);
|
||||
|
||||
while ((ret = getextmntent(hdl->libzfs_mnttab, &entry, 0)) == 0) {
|
||||
if (makedevice(entry.mnt_major, entry.mnt_minor) ==
|
||||
statbuf.st_dev) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ret != 0) {
|
||||
if (getextmntent(path, &entry, &statbuf) != 0)
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
if (strcmp(entry.mnt_fstype, MNTTYPE_ZFS) != 0) {
|
||||
(void) fprintf(stderr, gettext("'%s': not a ZFS filesystem\n"),
|
||||
|
||||
Reference in New Issue
Block a user