Readd zpool_clear_label() from OpenSolaris
authorDmitry Khasanov <pik4ez@gmail.com>
Fri, 5 Jul 2013 10:44:53 +0000 (17:44 +0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 9 Jul 2013 22:42:27 +0000 (15:42 -0700)
This patch restores the zpool_clear_label() function from
OpenSolaris.  This was removed by commit d603ed6 because
it wasn't clear we had a use for it in ZoL.  However, this
functionality is a prerequisite for adding the 'zpool labelclear'
command from FreeBSD.

As part of bringing this change in the zpool_clear_label()
function was changed to use fstat64_blk(2) for compatibility
with Linux.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #1126

lib/libzfs/libzfs_import.c

index 791aaad..58b6043 100644 (file)
@@ -900,6 +900,36 @@ zpool_read_label(int fd, nvlist_t **config)
        return (0);
 }
 
+/*
+ * Given a file descriptor, clear (zero) the label information.  This function
+ * is currently only used in the appliance stack as part of the ZFS sysevent
+ * module.
+ */
+int
+zpool_clear_label(int fd)
+{
+       struct stat64 statbuf;
+       int l;
+       vdev_label_t *label;
+       uint64_t size;
+
+       if (fstat64_blk(fd, &statbuf) == -1)
+               return (0);
+       size = P2ALIGN_TYPED(statbuf.st_size, sizeof (vdev_label_t), uint64_t);
+
+       if ((label = calloc(sizeof (vdev_label_t), 1)) == NULL)
+               return (-1);
+
+       for (l = 0; l < VDEV_LABELS; l++) {
+               if (pwrite64(fd, label, sizeof (vdev_label_t),
+                   label_offset(size, l)) != sizeof (vdev_label_t))
+                       return (-1);
+       }
+
+       free(label);
+       return (0);
+}
+
 #ifdef HAVE_LIBBLKID
 /*
  * Use libblkid to quickly search for zfs devices