Fix zpool_read_all_labels when vfs.aio.enable_unsafe=0
Previously, zpool_read_all_labels was trying to do 256KB reads, which are greater than the default MAXPHYS and therefore must go through the slow, unsafe AIO path. Shrink these reads to 112KB so they can use the safe, fast AIO path instead. MFC after: 1 week X-MFC-With: 324568 Sponsored by: Spectra Logic Corp
This commit is contained in:
parent
2502c4412c
commit
2c7d2a9055
@ -930,7 +930,7 @@ zpool_read_all_labels(int fd, nvlist_t **config)
|
||||
struct aiocb aiocbs[VDEV_LABELS];
|
||||
struct aiocb *aiocbps[VDEV_LABELS];
|
||||
int l;
|
||||
vdev_label_t *labels;
|
||||
vdev_phys_t *labels;
|
||||
uint64_t state, txg, size;
|
||||
int nlabels = 0;
|
||||
|
||||
@ -940,15 +940,15 @@ zpool_read_all_labels(int fd, nvlist_t **config)
|
||||
return (0);
|
||||
size = P2ALIGN_TYPED(statbuf.st_size, sizeof (vdev_label_t), uint64_t);
|
||||
|
||||
if ((labels = calloc(VDEV_LABELS, sizeof (vdev_label_t))) == NULL)
|
||||
if ((labels = calloc(VDEV_LABELS, sizeof (vdev_phys_t))) == NULL)
|
||||
return (0);
|
||||
|
||||
memset(aiocbs, 0, sizeof(aiocbs));
|
||||
for (l = 0; l < VDEV_LABELS; l++) {
|
||||
aiocbs[l].aio_fildes = fd;
|
||||
aiocbs[l].aio_offset = label_offset(size, l);
|
||||
aiocbs[l].aio_offset = label_offset(size, l) + VDEV_SKIP_SIZE;
|
||||
aiocbs[l].aio_buf = &labels[l];
|
||||
aiocbs[l].aio_nbytes = sizeof(vdev_label_t);
|
||||
aiocbs[l].aio_nbytes = sizeof(vdev_phys_t);
|
||||
aiocbs[l].aio_lio_opcode = LIO_READ;
|
||||
aiocbps[l] = &aiocbs[l];
|
||||
}
|
||||
@ -962,17 +962,18 @@ zpool_read_all_labels(int fd, nvlist_t **config)
|
||||
(void)aio_return(&aiocbs[l]);
|
||||
}
|
||||
}
|
||||
free(labels);
|
||||
return (0);
|
||||
}
|
||||
|
||||
for (l = 0; l < VDEV_LABELS; l++) {
|
||||
nvlist_t *temp = NULL;
|
||||
|
||||
if (aio_return(&aiocbs[l]) != sizeof(vdev_label_t))
|
||||
if (aio_return(&aiocbs[l]) != sizeof(vdev_phys_t))
|
||||
continue;
|
||||
|
||||
if (nvlist_unpack(labels[l].vl_vdev_phys.vp_nvlist,
|
||||
sizeof (labels[l].vl_vdev_phys.vp_nvlist), &temp, 0) != 0)
|
||||
if (nvlist_unpack(labels[l].vp_nvlist,
|
||||
sizeof (labels[l].vp_nvlist), &temp, 0) != 0)
|
||||
continue;
|
||||
|
||||
if (nvlist_lookup_uint64(temp, ZPOOL_CONFIG_POOL_STATE,
|
||||
|
Loading…
Reference in New Issue
Block a user