git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Leaf vdevs should not be reopened
[zfs.git]
/
module
/
zfs
/
vdev_disk.c
diff --git
a/module/zfs/vdev_disk.c
b/module/zfs/vdev_disk.c
index
e902a70
..
4e38c78
100644
(file)
--- a/
module/zfs/vdev_disk.c
+++ b/
module/zfs/vdev_disk.c
@@
-249,6
+249,16
@@
vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
return EINVAL;
}
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;
vd = kmem_zalloc(sizeof(vdev_disk_t), KM_PUSHPAGE);
if (vd == NULL)
return ENOMEM;
@@
-279,7
+289,10
@@
vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
v->vdev_tsd = vd;
vd->vd_bdev = bdev;
v->vdev_tsd = vd;
vd->vd_bdev = bdev;
- block_size = vdev_bdev_block_size(bdev);
+
+skip_open:
+ /* Determine the physical block size */
+ block_size = vdev_bdev_block_size(vd->vd_bdev);
/* We think the wholedisk property should always be set when this
* function is called. ASSERT here so if any legitimate cases exist
/* We think the wholedisk property should always be set when this
* function is called. ASSERT here so if any legitimate cases exist
@@
-299,7
+312,7
@@
vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
v->vdev_nowritecache = B_FALSE;
/* Physical volume size in bytes */
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;
/* TODO: report possible expansion size */
*max_psize = *psize;
@@
-318,7
+331,7
@@
vdev_disk_close(vdev_t *v)
{
vdev_disk_t *vd = v->vdev_tsd;
{
vdev_disk_t *vd = v->vdev_tsd;
- if (vd == NULL)
+ if (v
->vdev_reopening || v
d == NULL)
return;
if (vd->vd_bdev != NULL)
return;
if (vd->vd_bdev != NULL)