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
Add ZFS specific mmap() checks
[zfs.git]
/
module
/
zfs
/
vdev_mirror.c
diff --git
a/module/zfs/vdev_mirror.c
b/module/zfs/vdev_mirror.c
index
fff7e08
..
47181d4
100644
(file)
--- a/
module/zfs/vdev_mirror.c
+++ b/
module/zfs/vdev_mirror.c
@@
-19,7
+19,7
@@
* CDDL HEADER END
*/
/*
* CDDL HEADER END
*/
/*
- * Copyright 20
09
Sun Microsystems, Inc. All rights reserved.
+ * Copyright 20
10
Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
* Use is subject to license terms.
*/
@@
-60,6
+60,11
@@
vdev_mirror_map_free(zio_t *zio)
kmem_free(mm, offsetof(mirror_map_t, mm_child[mm->mm_children]));
}
kmem_free(mm, offsetof(mirror_map_t, mm_child[mm->mm_children]));
}
+static const zio_vsd_ops_t vdev_mirror_vsd_ops = {
+ vdev_mirror_map_free,
+ zio_vsd_default_cksum_report
+};
+
static mirror_map_t *
vdev_mirror_map_alloc(zio_t *zio)
{
static mirror_map_t *
vdev_mirror_map_alloc(zio_t *zio)
{
@@
-117,28
+122,29
@@
vdev_mirror_map_alloc(zio_t *zio)
}
zio->io_vsd = mm;
}
zio->io_vsd = mm;
- zio->io_vsd_
free = vdev_mirror_map_free
;
+ zio->io_vsd_
ops = &vdev_mirror_vsd_ops
;
return (mm);
}
static int
vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift)
{
return (mm);
}
static int
vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift)
{
- vdev_t *cvd;
- uint64_t c;
int numerrors = 0;
int numerrors = 0;
- int ret, lasterror = 0;
+ int lasterror = 0;
+ int c;
if (vd->vdev_children == 0) {
vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
return (EINVAL);
}
if (vd->vdev_children == 0) {
vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
return (EINVAL);
}
+ vdev_open_children(vd);
+
for (c = 0; c < vd->vdev_children; c++) {
for (c = 0; c < vd->vdev_children; c++) {
- cvd = vd->vdev_child[c];
+
vdev_t *
cvd = vd->vdev_child[c];
- if (
(ret = vdev_open(cvd)) != 0
) {
- lasterror =
ret
;
+ if (
cvd->vdev_open_error
) {
+ lasterror =
cvd->vdev_open_error
;
numerrors++;
continue;
}
numerrors++;
continue;
}
@@
-158,7
+164,7
@@
vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift)
static void
vdev_mirror_close(vdev_t *vd)
{
static void
vdev_mirror_close(vdev_t *vd)
{
-
uint64_
t c;
+
in
t c;
for (c = 0; c < vd->vdev_children; c++)
vdev_close(vd->vdev_child[c]);
for (c = 0; c < vd->vdev_children; c++)
vdev_close(vd->vdev_child[c]);
@@
-211,7
+217,7
@@
vdev_mirror_child_select(zio_t *zio)
uint64_t txg = zio->io_txg;
int i, c;
uint64_t txg = zio->io_txg;
int i, c;
- ASSERT(zio->io_bp == NULL ||
zio->io_bp->blk_birth
== txg);
+ ASSERT(zio->io_bp == NULL ||
BP_PHYSICAL_BIRTH(zio->io_bp)
== txg);
/*
* Try to find a child whose DTL doesn't contain the block to read.
/*
* Try to find a child whose DTL doesn't contain the block to read.
@@
-308,9
+314,9
@@
vdev_mirror_io_start(zio_t *zio)
static int
vdev_mirror_worst_error(mirror_map_t *mm)
{
static int
vdev_mirror_worst_error(mirror_map_t *mm)
{
- int error[2] = { 0, 0 };
+ int
c,
error[2] = { 0, 0 };
- for (
int
c = 0; c < mm->mm_children; c++) {
+ for (c = 0; c < mm->mm_children; c++) {
mirror_child_t *mc = &mm->mm_child[c];
int s = mc->mc_speculative;
error[s] = zio_worst_error(error[s], mc->mc_error);
mirror_child_t *mc = &mm->mm_child[c];
int s = mc->mc_speculative;
error[s] = zio_worst_error(error[s], mc->mc_error);
@@
-449,6
+455,8
@@
vdev_ops_t vdev_mirror_ops = {
vdev_mirror_io_start,
vdev_mirror_io_done,
vdev_mirror_state_change,
vdev_mirror_io_start,
vdev_mirror_io_done,
vdev_mirror_state_change,
+ NULL,
+ NULL,
VDEV_TYPE_MIRROR, /* name of this vdev type */
B_FALSE /* not a leaf vdev */
};
VDEV_TYPE_MIRROR, /* name of this vdev type */
B_FALSE /* not a leaf vdev */
};
@@
-460,6
+468,8
@@
vdev_ops_t vdev_replacing_ops = {
vdev_mirror_io_start,
vdev_mirror_io_done,
vdev_mirror_state_change,
vdev_mirror_io_start,
vdev_mirror_io_done,
vdev_mirror_state_change,
+ NULL,
+ NULL,
VDEV_TYPE_REPLACING, /* name of this vdev type */
B_FALSE /* not a leaf vdev */
};
VDEV_TYPE_REPLACING, /* name of this vdev type */
B_FALSE /* not a leaf vdev */
};
@@
-471,6
+481,8
@@
vdev_ops_t vdev_spare_ops = {
vdev_mirror_io_start,
vdev_mirror_io_done,
vdev_mirror_state_change,
vdev_mirror_io_start,
vdev_mirror_io_done,
vdev_mirror_state_change,
+ NULL,
+ NULL,
VDEV_TYPE_SPARE, /* name of this vdev type */
B_FALSE /* not a leaf vdev */
};
VDEV_TYPE_SPARE, /* name of this vdev type */
B_FALSE /* not a leaf vdev */
};