Skip to content

Commit

Permalink
Assign mg_nrot no matter how vdev_open() fails.
Browse files Browse the repository at this point in the history
In dealing with yet another spa_tryimport failure.
  • Loading branch information
inkdot7 committed Oct 1, 2016
1 parent f7a2977 commit cc9d761
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 4 deletions.
2 changes: 1 addition & 1 deletion include/sys/metaslab.h
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ void metaslab_parse_rotor_config(metaslab_class_t *, char *);

metaslab_group_t *metaslab_group_create(metaslab_class_t *, vdev_t *);
void metaslab_group_destroy(metaslab_group_t *);
void metaslab_group_set_rotor_category(metaslab_group_t *);
void metaslab_group_set_rotor_category(metaslab_group_t *, boolean_t);
void metaslab_group_activate(metaslab_group_t *);
void metaslab_group_passivate(metaslab_group_t *);
uint64_t metaslab_group_get_space(metaslab_group_t *);
Expand Down
13 changes: 11 additions & 2 deletions module/zfs/metaslab.c
Original file line number Diff line number Diff line change
Expand Up @@ -856,7 +856,7 @@ metaslab_group_destroy(metaslab_group_t *mg)
}

void
metaslab_group_set_rotor_category(metaslab_group_t *mg)
metaslab_group_set_rotor_category(metaslab_group_t *mg, boolean_t failed_dev)
{
metaslab_class_t *mc = mg->mg_class;

Expand All @@ -866,7 +866,16 @@ metaslab_group_set_rotor_category(metaslab_group_t *mg)

ASSERT(mg->mg_activation_count <= 0);

mg->mg_nrot = metaslab_vdev_rotor_category(mc, mg->mg_vd);
/*
* For a failed device, we assign it to the last rotor
* category. Failed devices would not allocate, but needed
* such that metaslab_class_space_update() can be called for
* them too.
*/
if (failed_dev)
mg->mg_nrot = METASLAB_CLASS_ROTORS-1;
else
mg->mg_nrot = metaslab_vdev_rotor_category(mc, mg->mg_vd);
}

void
Expand Down
10 changes: 9 additions & 1 deletion module/zfs/vdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -1222,10 +1222,18 @@ vdev_open(vdev_t *vd)
vd->vdev_label_aux == VDEV_AUX_EXTERNAL);
vdev_set_state(vd, B_TRUE, VDEV_STATE_FAULTED,
vd->vdev_label_aux);
/*
* Must set some rotor category, such that
* metaslab_class_space_update() can be safely called.
*/
if (vd->vdev_mg)
metaslab_group_set_rotor_category(vd->vdev_mg, B_TRUE);
return (SET_ERROR(ENXIO));
} else if (vd->vdev_offline) {
ASSERT(vd->vdev_children == 0);
vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, VDEV_AUX_NONE);
if (vd->vdev_mg)
metaslab_group_set_rotor_category(vd->vdev_mg, B_TRUE);
return (SET_ERROR(ENXIO));
}

Expand All @@ -1243,7 +1251,7 @@ vdev_open(vdev_t *vd)
* been set.
*/
if (vd->vdev_mg)
metaslab_group_set_rotor_category(vd->vdev_mg);
metaslab_group_set_rotor_category(vd->vdev_mg, B_FALSE);

/*
* Reset the vdev_reopening flag so that we actually close
Expand Down

0 comments on commit cc9d761

Please sign in to comment.