summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEtienne Dechamps <[email protected]>2012-07-06 16:22:03 +0200
committerBrian Behlendorf <[email protected]>2012-07-12 08:59:16 -0700
commit7608bd0dd01829a130cd8a4d244e197ce8fa590a (patch)
tree8e895f8fe4e4e2f471257f3fd4b36b8f2c926c82
parent8adf48642253c2ef9571ece5b233e0bf1f0217a8 (diff)
Use the right device path when relabeling.
Currently, zpool_vdev_online() calls zpool_relabel_disk() with a short partition device name, which is obviously wrong because (1) zpool_relabel_disk() expects a full, absolute path to use with open() and (2) efi_write() must be called on an opened disk device, not a partition device. With this patch, zpool_relabel_disk() gets called with a full disk device path. The path is determined using the same algorithm as zpool_find_vdev(). Signed-off-by: Brian Behlendorf <[email protected]> Issue #808
-rw-r--r--lib/libzfs/libzfs_pool.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/libzfs/libzfs_pool.c b/lib/libzfs/libzfs_pool.c
index 08b83c8c1..fa9f36cc6 100644
--- a/lib/libzfs/libzfs_pool.c
+++ b/lib/libzfs/libzfs_pool.c
@@ -2143,13 +2143,10 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
if (flags & ZFS_ONLINE_EXPAND ||
zpool_get_prop_int(zhp, ZPOOL_PROP_AUTOEXPAND, NULL)) {
- char *pathname = NULL;
uint64_t wholedisk = 0;
(void) nvlist_lookup_uint64(tgt, ZPOOL_CONFIG_WHOLE_DISK,
&wholedisk);
- verify(nvlist_lookup_string(tgt, ZPOOL_CONFIG_PATH,
- &pathname) == 0);
/*
* XXX - L2ARC 1.0 devices can't support expansion.
@@ -2161,8 +2158,20 @@ zpool_vdev_online(zpool_handle_t *zhp, const char *path, int flags,
}
if (wholedisk) {
- pathname += strlen(DISK_ROOT) + 1;
- error = zpool_relabel_disk(hdl, pathname, msg);
+ const char *fullpath = path;
+ char buf[MAXPATHLEN];
+
+ if (path[0] != '/') {
+ error = zfs_resolve_shortname(path, buf,
+ sizeof(buf));
+ if (error != 0)
+ return (zfs_error(hdl, EZFS_NODEVICE,
+ msg));
+
+ fullpath = buf;
+ }
+
+ error = zpool_relabel_disk(hdl, fullpath, msg);
if (error != 0)
return (error);
}