Readd zpool_clear_label() from OpenSolaris
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
This commit is contained in:
parent
5021058756
commit
51a3ae72d2
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue