Index: uspace/srv/bd/hr/hr.c
===================================================================
--- uspace/srv/bd/hr/hr.c	(revision e2b417fb8e7a6702a6b892e56aeb05aaca322df1)
+++ uspace/srv/bd/hr/hr.c	(revision 401b9e42596ee6f79ffb72abcea7c66e9878f990)
@@ -264,4 +264,6 @@
 
 	atomic_init(&new_volume->rebuild_blk, 0);
+	atomic_init(&new_volume->state_changed, false);
+	atomic_init(&new_volume->pending_invalidation, false);
 
 	rc = new_volume->hr_ops.create(new_volume);
@@ -320,5 +322,9 @@
 		fibril_rwlock_write_lock(&vol->states_lock);
 		fibril_rwlock_read_lock(&vol->extents_lock);
+
+		/* TODO: maybe expose extent state callbacks */
 		hr_update_ext_status(vol, fail_extent, HR_EXT_FAILED);
+		atomic_store(&vol->state_changed, true);
+
 		fibril_rwlock_read_unlock(&vol->extents_lock);
 		fibril_rwlock_write_unlock(&vol->states_lock);
Index: uspace/srv/bd/hr/raid1.c
===================================================================
--- uspace/srv/bd/hr/raid1.c	(revision e2b417fb8e7a6702a6b892e56aeb05aaca322df1)
+++ uspace/srv/bd/hr/raid1.c	(revision 401b9e42596ee6f79ffb72abcea7c66e9878f990)
@@ -103,4 +103,6 @@
 	new_volume->hr_bds.sarg = new_volume;
 
+	/* force volume state update */
+	atomic_store(&new_volume->state_changed, true);
 	hr_raid1_update_vol_status(new_volume);
 	if (new_volume->status == HR_VOL_FAULTY)
@@ -275,10 +277,15 @@
 static void hr_raid1_update_vol_status(hr_volume_t *vol)
 {
-	fibril_mutex_lock(&vol->deferred_list_lock);
-
-	if (list_count(&vol->deferred_invalidations_list) > 0)
+	bool exp = true;
+
+	if (!atomic_compare_exchange_strong(&vol->state_changed, &exp, false))
+		return;
+
+	if (atomic_compare_exchange_strong(&vol->pending_invalidation, &exp,
+	    false)) {
+		fibril_mutex_lock(&vol->deferred_list_lock);
 		process_deferred_invalidations(vol);
-
-	fibril_mutex_unlock(&vol->deferred_list_lock);
+		fibril_mutex_unlock(&vol->deferred_list_lock);
+	}
 
 	fibril_rwlock_read_lock(&vol->extents_lock);
@@ -344,5 +351,5 @@
 				assert(vol->extents[extent].status ==
 				    HR_EXT_INVALID);
-				goto done;
+				goto deferring_end;
 			}
 		}
@@ -358,5 +365,8 @@
 		list_append(&vol->deferred_inval[i].link,
 		    &vol->deferred_invalidations_list);
-	done:
+
+		atomic_store(&vol->pending_invalidation, true);
+	deferring_end:
+
 		fibril_mutex_unlock(&vol->deferred_list_lock);
 		break;
@@ -367,4 +377,6 @@
 		hr_update_ext_status(vol, extent, HR_EXT_FAILED);
 	}
+
+	atomic_store(&vol->state_changed, true);
 
 	fibril_rwlock_write_unlock(&vol->states_lock);
Index: uspace/srv/bd/hr/var.h
===================================================================
--- uspace/srv/bd/hr/var.h	(revision e2b417fb8e7a6702a6b892e56aeb05aaca322df1)
+++ uspace/srv/bd/hr/var.h	(revision 401b9e42596ee6f79ffb72abcea7c66e9878f990)
@@ -117,8 +117,10 @@
 	 * are harvested later when we are able to.
 	 */
+	_Atomic bool pending_invalidation;
 	fibril_mutex_t deferred_list_lock;
 	list_t deferred_invalidations_list;
 	hr_deferred_invalidation_t deferred_inval[HR_MAX_EXTENTS];
 
+	_Atomic bool state_changed;
 	_Atomic uint64_t rebuild_blk;
 	uint64_t counter; /* metadata syncing */
