Index: uspace/srv/bd/hr/raid1.c
===================================================================
--- uspace/srv/bd/hr/raid1.c	(revision a62079d832da4d9a32352ac39c84e42c43dd1a0e)
+++ uspace/srv/bd/hr/raid1.c	(revision 234212a2cb8e6d38d313b28851c69c84ff5486bd)
@@ -162,13 +162,12 @@
 }
 
-void hr_raid1_ext_state_cb(hr_volume_t *vol, size_t extent,
-    errno_t rc)
-{
-	HR_DEBUG("%s()", __func__);
+void hr_raid1_ext_state_cb(hr_volume_t *vol, size_t extent, errno_t rc)
+{
+	HR_DEBUG("%s()", __func__);
+
+	assert(fibril_rwlock_is_locked(&vol->extents_lock));
 
 	if (rc == EOK)
 		return;
-
-	assert(fibril_rwlock_is_locked(&vol->extents_lock));
 
 	fibril_rwlock_write_lock(&vol->states_lock);
@@ -219,5 +218,8 @@
 		if (old_state != HR_VOL_REBUILD) {
 			/* XXX: allow REBUILD on INVALID extents */
-			if (vol->hotspare_no > 0) {
+			fibril_mutex_lock(&vol->hotspare_lock);
+			size_t hs_no = vol->hotspare_no;
+			fibril_mutex_unlock(&vol->hotspare_lock);
+			if (hs_no > 0) {
 				fid_t fib = fibril_create(hr_raid1_rebuild,
 				    vol);
@@ -322,4 +324,7 @@
 	uint64_t rebuild_blk;
 
+	if (size < cnt * vol->bsize)
+		return EINVAL;
+
 	fibril_rwlock_read_lock(&vol->states_lock);
 	hr_vol_state_t vol_state = vol->state;
@@ -332,12 +337,8 @@
 	bool exp = false;
 	if (type == HR_BD_WRITE &&
-	    atomic_compare_exchange_strong(&vol->data_dirty, &exp, true)) {
+	    atomic_compare_exchange_strong(&vol->first_write, &exp, true)) {
 		vol->meta_ops->inc_counter(vol);
 		vol->meta_ops->save(vol, WITH_STATE_CALLBACK);
 	}
-
-	if (type == HR_BD_READ || type == HR_BD_WRITE)
-		if (size < cnt * vol->bsize)
-			return EINVAL;
 
 	rc = hr_check_ba_range(vol, cnt, ba);
@@ -346,6 +347,6 @@
 
 	/* allow full dev sync */
-	if (type != HR_BD_SYNC || ba != 0)
-		hr_add_ba_offset(vol, &ba);
+	if (!(type == HR_BD_SYNC && ba == 0 && cnt == 0))
+		hr_add_data_offset(vol, &ba);
 
 	/*
@@ -491,5 +492,5 @@
 	size_t cnt;
 	uint64_t ba = 0;
-	hr_add_ba_offset(vol, &ba);
+	hr_add_data_offset(vol, &ba);
 
 	/*
@@ -501,5 +502,5 @@
 	/* increment metadata counter only on first write */
 	bool exp = false;
-	if (atomic_compare_exchange_strong(&vol->data_dirty, &exp, true)) {
+	if (atomic_compare_exchange_strong(&vol->first_write, &exp, true)) {
 		vol->meta_ops->inc_counter(vol);
 		vol->meta_ops->save(vol, WITH_STATE_CALLBACK);
Index: uspace/srv/bd/hr/util.c
===================================================================
--- uspace/srv/bd/hr/util.c	(revision a62079d832da4d9a32352ac39c84e42c43dd1a0e)
+++ uspace/srv/bd/hr/util.c	(revision 234212a2cb8e6d38d313b28851c69c84ff5486bd)
@@ -152,5 +152,5 @@
 
 	atomic_init(&vol->state_dirty, false);
-	atomic_init(&vol->data_dirty, false);
+	atomic_init(&vol->first_write, false);
 	atomic_init(&vol->rebuild_blk, 0);
 	atomic_init(&vol->open_cnt, 0);
@@ -397,7 +397,12 @@
 }
 
-void hr_add_ba_offset(hr_volume_t *vol, uint64_t *ba)
+void hr_add_data_offset(hr_volume_t *vol, uint64_t *ba)
 {
 	*ba = *ba + vol->data_offset;
+}
+
+void hr_sub_data_offset(hr_volume_t *vol, uint64_t *ba)
+{
+	*ba = *ba - vol->data_offset;
 }
 
Index: uspace/srv/bd/hr/util.h
===================================================================
--- uspace/srv/bd/hr/util.h	(revision a62079d832da4d9a32352ac39c84e42c43dd1a0e)
+++ uspace/srv/bd/hr/util.h	(revision 234212a2cb8e6d38d313b28851c69c84ff5486bd)
@@ -87,5 +87,6 @@
 extern errno_t hr_register_volume(hr_volume_t *);
 extern errno_t hr_check_ba_range(hr_volume_t *, size_t, uint64_t);
-extern void hr_add_ba_offset(hr_volume_t *, uint64_t *);
+extern void hr_add_data_offset(hr_volume_t *, uint64_t *);
+extern void hr_sub_data_offset(hr_volume_t *, uint64_t *);
 extern void hr_update_ext_state(hr_volume_t *, size_t, hr_ext_state_t);
 extern void hr_update_hotspare_state(hr_volume_t *, size_t, hr_ext_state_t);
Index: uspace/srv/bd/hr/var.h
===================================================================
--- uspace/srv/bd/hr/var.h	(revision a62079d832da4d9a32352ac39c84e42c43dd1a0e)
+++ uspace/srv/bd/hr/var.h	(revision 234212a2cb8e6d38d313b28851c69c84ff5486bd)
@@ -105,7 +105,6 @@
 	 * allowing non-destructive read-only access
 	 */
-	_Atomic bool data_dirty;
+	_Atomic bool first_write;
 
-	/* XXX: atomic_uint_least64_t? */
 	_Atomic uint64_t rebuild_blk; /* rebuild position */
 	_Atomic int open_cnt; /* open/close() counter */
