Index: uspace/srv/bd/hr/hr.c
===================================================================
--- uspace/srv/bd/hr/hr.c	(revision b247c7145535f828c4029dbc592e1daef51f4928)
+++ uspace/srv/bd/hr/hr.c	(revision 6aafb480111c5cc96fb85e470247a656a20f0613)
@@ -358,5 +358,5 @@
 	}
 
-	fibril_rwlock_read_lock(&vol->extents_lock);
+	fibril_rwlock_write_lock(&vol->extents_lock);
 	fibril_rwlock_write_lock(&vol->states_lock);
 
@@ -368,5 +368,5 @@
 	case HR_EXT_FAILED:
 		fibril_rwlock_write_unlock(&vol->states_lock);
-		fibril_rwlock_read_unlock(&vol->extents_lock);
+		fibril_rwlock_write_unlock(&vol->extents_lock);
 		async_answer_0(icall, EINVAL);
 		return;
@@ -374,9 +374,11 @@
 		hr_update_ext_state(vol, extent_idx_to_fail, HR_EXT_FAILED);
 		(void)vol->meta_ops->erase_block(ext->svc_id);
+		block_fini(ext->svc_id);
+		ext->svc_id = 0;
 		hr_mark_vol_state_dirty(vol);
 	}
 
 	fibril_rwlock_write_unlock(&vol->states_lock);
-	fibril_rwlock_read_unlock(&vol->extents_lock);
+	fibril_rwlock_write_unlock(&vol->extents_lock);
 
 	vol->hr_ops.vol_state_eval(vol);
Index: uspace/srv/bd/hr/raid1.c
===================================================================
--- uspace/srv/bd/hr/raid1.c	(revision b247c7145535f828c4029dbc592e1daef51f4928)
+++ uspace/srv/bd/hr/raid1.c	(revision 6aafb480111c5cc96fb85e470247a656a20f0613)
@@ -185,10 +185,10 @@
 	size_t rebuild_no = hr_count_extents(vol, HR_EXT_REBUILD);
 
+	fibril_rwlock_read_unlock(&vol->states_lock);
+	fibril_rwlock_read_unlock(&vol->extents_lock);
+
 	fibril_mutex_lock(&vol->hotspare_lock);
 	size_t hs_no = vol->hotspare_no;
 	fibril_mutex_unlock(&vol->hotspare_lock);
-
-	fibril_rwlock_read_unlock(&vol->states_lock);
-	fibril_rwlock_read_unlock(&vol->extents_lock);
 
 	if (healthy == 0) {
@@ -206,13 +206,10 @@
 		}
 
-		if (old_state != HR_VOL_REBUILD) {
-			if (hs_no > 0 || invalid_no > 0 || rebuild_no > 0) {
-				fid_t fib = fibril_create(hr_raid1_rebuild,
-				    vol);
-				if (fib == 0)
-					return;
-				fibril_start(fib);
-				fibril_detach(fib);
-			}
+		if (hs_no > 0 || invalid_no > 0 || rebuild_no > 0) {
+			fid_t fib = fibril_create(hr_raid1_rebuild, vol);
+			if (fib == 0)
+				return;
+			fibril_start(fib);
+			fibril_detach(fib);
 		}
 	} else {
@@ -541,4 +538,6 @@
 	hr_mark_vol_state_dirty(vol);
 
+	hr_update_vol_state(vol, HR_VOL_DEGRADED);
+
 	fibril_rwlock_write_unlock(&vol->states_lock);
 end:
Index: uspace/srv/bd/hr/raid5.c
===================================================================
--- uspace/srv/bd/hr/raid5.c	(revision b247c7145535f828c4029dbc592e1daef51f4928)
+++ uspace/srv/bd/hr/raid5.c	(revision 6aafb480111c5cc96fb85e470247a656a20f0613)
@@ -846,4 +846,6 @@
 	hr_mark_vol_state_dirty(vol);
 
+	hr_update_vol_state(vol, HR_VOL_DEGRADED);
+
 	fibril_rwlock_write_unlock(&vol->states_lock);
 end:
Index: uspace/srv/bd/hr/util.c
===================================================================
--- uspace/srv/bd/hr/util.c	(revision b247c7145535f828c4029dbc592e1daef51f4928)
+++ uspace/srv/bd/hr/util.c	(revision 6aafb480111c5cc96fb85e470247a656a20f0613)
@@ -1110,4 +1110,6 @@
 errno_t hr_init_rebuild(hr_volume_t *vol, size_t *rebuild_idx)
 {
+	HR_DEBUG("%s()", __func__);
+
 	errno_t rc = EOK;
 	size_t bad = vol->extent_no;
@@ -1115,13 +1117,15 @@
 	if (vol->level == HR_LVL_0)
 		return EINVAL;
+
+	fibril_rwlock_read_lock(&vol->states_lock);
+	if (vol->state != HR_VOL_DEGRADED) {
+		fibril_rwlock_read_unlock(&vol->states_lock);
+		return EINVAL;
+	}
+	fibril_rwlock_read_unlock(&vol->states_lock);
 
 	fibril_rwlock_write_lock(&vol->extents_lock);
 	fibril_rwlock_write_lock(&vol->states_lock);
 	fibril_mutex_lock(&vol->hotspare_lock);
-
-	if (vol->state != HR_VOL_DEGRADED) {
-		rc = EINVAL;
-		goto error;
-	}
 
 	size_t rebuild = vol->extent_no;
