Index: uspace/srv/bd/hr/raid5.c
===================================================================
--- uspace/srv/bd/hr/raid5.c	(revision d6fe2a1a254fa576538892960e5ea16d7bb73a77)
+++ uspace/srv/bd/hr/raid5.c	(revision f1be66bf66ac82676d5a20f271776de58afafac5)
@@ -102,7 +102,11 @@
 	}
 
+	fibril_rwlock_write_lock(&new_volume->states_lock);
+
 	rc = hr_raid5_update_vol_status(new_volume);
-	if (rc != EOK)
+	if (rc != EOK) {
+		fibril_rwlock_write_unlock(&new_volume->states_lock);
 		return rc;
+	}
 
 	bd_srvs_init(&new_volume->hr_bds);
@@ -111,4 +115,6 @@
 
 	rc = hr_register_volume(new_volume);
+
+	fibril_rwlock_write_unlock(&new_volume->states_lock);
 
 	return rc;
@@ -140,5 +146,7 @@
 {
 	fibril_mutex_lock(&vol->lock);
+	fibril_rwlock_write_lock(&vol->states_lock);
 	(void)hr_raid5_update_vol_status(vol);
+	fibril_rwlock_write_unlock(&vol->states_lock);
 	fibril_mutex_unlock(&vol->lock);
 }
@@ -149,4 +157,5 @@
 
 	fibril_mutex_lock(&vol->lock);
+	fibril_mutex_lock(&vol->hotspare_lock);
 
 	if (vol->hotspare_no >= HR_MAX_HOTSPARES) {
@@ -158,7 +167,8 @@
 
 	vol->hotspares[vol->hotspare_no].svc_id = hotspare;
-	hr_update_hotspare_status(vol, vol->hotspare_no, HR_EXT_HOTSPARE);
 
 	vol->hotspare_no++;
+
+	hr_update_hotspare_status(vol, vol->hotspare_no - 1, HR_EXT_HOTSPARE);
 
 	/*
@@ -169,10 +179,14 @@
 		    "spawning new rebuild fibril\n");
 		fid_t fib = fibril_create(hr_raid5_rebuild, vol);
-		if (fib == 0)
+		if (fib == 0) {
+			fibril_mutex_unlock(&vol->hotspare_lock);
+			fibril_mutex_unlock(&vol->lock);
 			return ENOMEM;
+		}
 		fibril_start(fib);
 		fibril_detach(fib);
 	}
 
+	fibril_mutex_unlock(&vol->hotspare_lock);
 	fibril_mutex_unlock(&vol->lock);
 
@@ -587,4 +601,5 @@
 	left = cnt;
 
+	fibril_rwlock_write_lock(&vol->states_lock);
 	while (left != 0) {
 		phys_block = ext_stripe * strip_size + strip_off;
@@ -684,4 +699,5 @@
 error:
 	(void)hr_raid5_update_vol_status(vol);
+	fibril_rwlock_write_unlock(&vol->states_lock);
 	fibril_mutex_unlock(&vol->lock);
 	return rc;
@@ -697,4 +713,6 @@
 
 	fibril_mutex_lock(&vol->lock);
+	fibril_rwlock_read_lock(&vol->extents_lock);
+	fibril_rwlock_write_lock(&vol->states_lock);
 
 	if (vol->hotspare_no == 0) {
@@ -738,5 +756,7 @@
 
 	vol->hotspares[hotspare_idx].svc_id = 0;
+	fibril_mutex_lock(&vol->hotspare_lock);
 	hr_update_hotspare_status(vol, hotspare_idx, HR_EXT_MISSING);
+	fibril_mutex_unlock(&vol->hotspare_lock);
 
 	vol->hotspare_no--;
@@ -813,6 +833,8 @@
 		 * during rebuild.
 		 */
+		fibril_rwlock_write_unlock(&vol->states_lock);
 		fibril_mutex_unlock(&vol->lock);
 		fibril_mutex_lock(&vol->lock);
+		fibril_rwlock_write_lock(&vol->states_lock);
 	}
 
@@ -829,4 +851,6 @@
 	(void)hr_raid5_update_vol_status(vol);
 
+	fibril_rwlock_write_unlock(&vol->states_lock);
+	fibril_rwlock_read_unlock(&vol->extents_lock);
 	fibril_mutex_unlock(&vol->lock);
 
