Linux 3.5 compat, eops->encode_fh() takes inodes
[zfs.git] / lib / libzfs / libzfs_pool.c
index 08b83c8..8339305 100644 (file)
@@ -2097,6 +2097,9 @@ zpool_relabel_disk(libzfs_handle_t *hdl, const char *path, const char *msg)
         * It's possible that we might encounter an error if the device
         * does not have any unallocated space left. If so, we simply
         * ignore that error and continue on.
+        *
+        * Also, we don't call efi_rescan() - that would just return EBUSY.
+        * The module will do it for us in vdev_disk_open().
         */
        error = efi_use_whole_disk(fd);
        (void) close(fd);
@@ -2143,13 +2146,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 +2161,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);
                }
@@ -3838,7 +3850,7 @@ zpool_label_disk(libzfs_handle_t *hdl, zpool_handle_t *zhp, char *name)
        vtoc->efi_parts[8].p_size = resv;
        vtoc->efi_parts[8].p_tag = V_RESERVED;
 
-       if ((rval = efi_write(fd, vtoc)) != 0) {
+       if ((rval = efi_write(fd, vtoc)) != 0 || (rval = efi_rescan(fd)) != 0) {
                /*
                 * Some block drivers (like pcata) may not support EFI
                 * GPT labels.  Print out a helpful error message dir-