Rebase master to b108
[zfs.git] / lib / libzfs / libzfs_pool.c
index dc5407b..75ecc54 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -217,12 +217,39 @@ zpool_get_prop(zpool_handle_t *zhp, zpool_prop_t prop, char *buf, size_t len,
        uint_t vsc;
 
        if (zpool_get_state(zhp) == POOL_STATE_UNAVAIL) {
-               if (prop == ZPOOL_PROP_NAME)
+               switch (prop) {
+               case ZPOOL_PROP_NAME:
                        (void) strlcpy(buf, zpool_get_name(zhp), len);
-               else if (prop == ZPOOL_PROP_HEALTH)
+                       break;
+
+               case ZPOOL_PROP_HEALTH:
                        (void) strlcpy(buf, "FAULTED", len);
-               else
+                       break;
+
+               case ZPOOL_PROP_GUID:
+                       intval = zpool_get_prop_int(zhp, prop, &src);
+                       (void) snprintf(buf, len, "%llu", intval);
+                       break;
+
+               case ZPOOL_PROP_ALTROOT:
+               case ZPOOL_PROP_CACHEFILE:
+                       if (zhp->zpool_props != NULL ||
+                           zpool_get_all_props(zhp) == 0) {
+                               (void) strlcpy(buf,
+                                   zpool_get_prop_string(zhp, prop, &src),
+                                   len);
+                               if (srctype != NULL)
+                                       *srctype = src;
+                               return (0);
+                       }
+                       /* FALLTHROUGH */
+               default:
                        (void) strlcpy(buf, "-", len);
+                       break;
+               }
+
+               if (srctype != NULL)
+                       *srctype = src;
                return (0);
        }
 
@@ -532,9 +559,6 @@ zpool_set_prop(zpool_handle_t *zhp, const char *propname, const char *propval)
            dgettext(TEXT_DOMAIN, "cannot set property for '%s'"),
            zhp->zpool_name);
 
-       if (zhp->zpool_props == NULL && zpool_get_all_props(zhp))
-               return (zfs_error(zhp->zpool_hdl, EZFS_POOLPROPS, errbuf));
-
        if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0)
                return (no_memory(zhp->zpool_hdl));
 
@@ -1127,7 +1151,7 @@ zpool_add(zpool_handle_t *zhp, nvlist_t *nvroot)
  * mounted datasets in the pool.
  */
 int
-zpool_export(zpool_handle_t *zhp, boolean_t force)
+zpool_export_common(zpool_handle_t *zhp, boolean_t force, boolean_t hardforce)
 {
        zfs_cmd_t zc = { 0 };
        char msg[1024];
@@ -1140,6 +1164,7 @@ zpool_export(zpool_handle_t *zhp, boolean_t force)
 
        (void) strlcpy(zc.zc_name, zhp->zpool_name, sizeof (zc.zc_name));
        zc.zc_cookie = force;
+       zc.zc_guid = hardforce;
 
        if (zfs_ioctl(zhp->zpool_hdl, ZFS_IOC_POOL_EXPORT, &zc) != 0) {
                switch (errno) {
@@ -1160,6 +1185,18 @@ zpool_export(zpool_handle_t *zhp, boolean_t force)
        return (0);
 }
 
+int
+zpool_export(zpool_handle_t *zhp, boolean_t force)
+{
+       return (zpool_export_common(zhp, force, B_FALSE));
+}
+
+int
+zpool_export_force(zpool_handle_t *zhp)
+{
+       return (zpool_export_common(zhp, B_TRUE, B_TRUE));
+}
+
 /*
  * zpool_import() is a contracted interface. Should be kept the same
  * if possible.
@@ -1182,7 +1219,9 @@ zpool_import(libzfs_handle_t *hdl, nvlist_t *config, const char *newname,
                }
 
                if (nvlist_add_string(props,
-                   zpool_prop_to_name(ZPOOL_PROP_ALTROOT), altroot) != 0) {
+                   zpool_prop_to_name(ZPOOL_PROP_ALTROOT), altroot) != 0 ||
+                   nvlist_add_string(props,
+                   zpool_prop_to_name(ZPOOL_PROP_CACHEFILE), "none") != 0) {
                        nvlist_free(props);
                        return (zfs_error_fmt(hdl, EZFS_NOMEM,
                            dgettext(TEXT_DOMAIN, "cannot import '%s'"),