#include <sys/sunldi.h>
char *zfs_vdev_scheduler = VDEV_SCHEDULER;
+static void *zfs_vdev_holder = VDEV_HOLDER;
/*
* Virtual device vector for disks.
struct gendisk *disk;
int error, partno;
- bdev = vdev_bdev_open(path, vdev_bdev_mode(mode), vd);
+ bdev = vdev_bdev_open(path, vdev_bdev_mode(mode), zfs_vdev_holder);
if (IS_ERR(bdev))
return bdev;
return EINVAL;
}
+ /*
+ * Reopen the device if it's not currently open. Otherwise,
+ * just update the physical size of the device.
+ */
+ if (v->vdev_tsd != NULL) {
+ ASSERT(v->vdev_reopening);
+ vd = v->vdev_tsd;
+ goto skip_open;
+ }
+
vd = kmem_zalloc(sizeof(vdev_disk_t), KM_PUSHPAGE);
if (vd == NULL)
return ENOMEM;
if (v->vdev_wholedisk && v->vdev_expanding)
bdev = vdev_disk_rrpart(v->vdev_path, mode, vd);
if (IS_ERR(bdev))
- bdev = vdev_bdev_open(v->vdev_path, vdev_bdev_mode(mode), vd);
+ bdev = vdev_bdev_open(v->vdev_path,
+ vdev_bdev_mode(mode), zfs_vdev_holder);
if (IS_ERR(bdev)) {
kmem_free(vd, sizeof(vdev_disk_t));
return -PTR_ERR(bdev);
v->vdev_tsd = vd;
vd->vd_bdev = bdev;
- block_size = vdev_bdev_block_size(bdev);
-
- /* We think the wholedisk property should always be set when this
- * function is called. ASSERT here so if any legitimate cases exist
- * where it's not set, we'll find them during debugging. If we never
- * hit the ASSERT, this and the following conditional statement can be
- * removed. */
- ASSERT3S(v->vdev_wholedisk, !=, -1ULL);
-
- /* The wholedisk property was initialized to -1 in vdev_alloc() if it
- * was unspecified. In that case, check if this is a whole device.
- * When bdev->bd_contains == bdev we have a whole device and not simply
- * a partition. */
- if (v->vdev_wholedisk == -1ULL)
- v->vdev_wholedisk = (bdev->bd_contains == bdev);
+
+skip_open:
+ /* Determine the physical block size */
+ block_size = vdev_bdev_block_size(vd->vd_bdev);
/* Clear the nowritecache bit, causes vdev_reopen() to try again. */
v->vdev_nowritecache = B_FALSE;
/* Physical volume size in bytes */
- *psize = bdev_capacity(bdev);
+ *psize = bdev_capacity(vd->vd_bdev);
/* TODO: report possible expansion size */
*max_psize = *psize;
{
vdev_disk_t *vd = v->vdev_tsd;
- if (vd == NULL)
+ if (v->vdev_reopening || vd == NULL)
return;
if (vd->vd_bdev != NULL)
uint64_t s, size;
int i;
- bdev = vdev_bdev_open(devpath, vdev_bdev_mode(FREAD), NULL);
+ bdev = vdev_bdev_open(devpath, vdev_bdev_mode(FREAD), zfs_vdev_holder);
if (IS_ERR(bdev))
return -PTR_ERR(bdev);