Index: uspace/srv/volsrv/empty.c
===================================================================
--- uspace/srv/volsrv/empty.c	(revision edebb4a154d7503a1a506cd53ce84ae086f387d6)
+++ uspace/srv/volsrv/empty.c	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
@@ -57,40 +57,17 @@
 }
 
-int vol_part_is_empty(service_id_t sid, bool *rempty)
-{
-	int rc;
-	bool block_inited = false;
-	void *buf = NULL;
-	aoff64_t nblocks;
+/** Calculate number of blocks to check.
+ *
+ * Will store to @a *ncb the number of blocks that should be checked
+ * at the beginning and end of device each.
+ *
+ * @param nblocks Total number of blocks on block device
+ * @param block_size Block size
+ * @param ncb Place to store number of blocks to check.
+ */
+static void calc_num_check_blocks(aoff64_t nblocks, size_t block_size,
+    aoff64_t *ncb)
+{
 	aoff64_t n;
-	aoff64_t i;
-	size_t block_size;
-	bool empty;
-
-	rc = block_init(EXCHANGE_SERIALIZE, sid, 2048);
-	if (rc != EOK) {
-		log_msg(LOG_DEFAULT, LVL_ERROR, "Error opening "
-		    "block device service %zu", sid);
-		rc = EIO;
-		goto error;
-	}
-
-	block_inited = true;
-
-	rc = block_get_bsize(sid, &block_size);
-	if (rc != EOK) {
-		log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting "
-		    "block size.");
-		rc = EIO;
-		goto error;
-	}
-
-	rc = block_get_nblocks(sid, &nblocks);
-	if (rc != EOK) {
-		log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting "
-		    "number of blocks.");
-		rc = EIO;
-		goto error;
-	}
 
 	/* Check first 16 kiB / 16 blocks, whichever is more */
@@ -104,4 +81,46 @@
 	if (n > (nblocks + 1) / 2)
 		n = (nblocks + 1) / 2;
+
+	*ncb = n;
+}
+
+int vol_part_is_empty(service_id_t sid, bool *rempty)
+{
+	int rc;
+	bool block_inited = false;
+	void *buf = NULL;
+	aoff64_t nblocks;
+	aoff64_t n;
+	aoff64_t i;
+	size_t block_size;
+	bool empty;
+
+	rc = block_init(EXCHANGE_SERIALIZE, sid, 2048);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error opening "
+		    "block device service %zu", sid);
+		rc = EIO;
+		goto error;
+	}
+
+	block_inited = true;
+
+	rc = block_get_bsize(sid, &block_size);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting "
+		    "block size.");
+		rc = EIO;
+		goto error;
+	}
+
+	rc = block_get_nblocks(sid, &nblocks);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting "
+		    "number of blocks.");
+		rc = EIO;
+		goto error;
+	}
+
+	calc_num_check_blocks(nblocks, block_size, &n);
 
 	buf = calloc(block_size, 1);
@@ -157,4 +176,80 @@
 }
 
+int vol_part_empty(service_id_t sid)
+{
+	int rc;
+	bool block_inited = false;
+	void *buf = NULL;
+	aoff64_t nblocks;
+	aoff64_t n;
+	aoff64_t i;
+	size_t block_size;
+
+	rc = block_init(EXCHANGE_SERIALIZE, sid, 2048);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error opening "
+		    "block device service %zu", sid);
+		rc = EIO;
+		goto error;
+	}
+
+	block_inited = true;
+
+	rc = block_get_bsize(sid, &block_size);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting "
+		    "block size.");
+		rc = EIO;
+		goto error;
+	}
+
+	rc = block_get_nblocks(sid, &nblocks);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error getting "
+		    "number of blocks.");
+		rc = EIO;
+		goto error;
+	}
+
+	calc_num_check_blocks(nblocks, block_size, &n);
+
+	buf = calloc(block_size, 1);
+	if (buf == NULL) {
+		log_msg(LOG_DEFAULT, LVL_ERROR, "Error allocating buffer.");
+		rc = ENOMEM;
+		goto error;
+	}
+
+	for (i = 0; i < n; i++) {
+		rc = block_write_direct(sid, i, 1, buf);
+		if (rc != EOK) {
+			log_msg(LOG_DEFAULT, LVL_ERROR, "Error "
+			    "reading blocks.");
+			rc = EIO;
+			goto error;
+		}
+	}
+
+	for (i = 0; i < n; i++) {
+		rc = block_write_direct(sid, nblocks - n + i, 1, buf);
+		if (rc != EOK) {
+			log_msg(LOG_DEFAULT, LVL_ERROR, "Error "
+			    "reading blocks.");
+			rc = EIO;
+			goto error;
+		}
+	}
+
+	block_fini(sid);
+	free(buf);
+	return EOK;
+error:
+	if (block_inited)
+		block_fini(sid);
+	if (buf != NULL)
+		free(buf);
+	return rc;
+}
+
 /** @}
  */
Index: uspace/srv/volsrv/empty.h
===================================================================
--- uspace/srv/volsrv/empty.h	(revision edebb4a154d7503a1a506cd53ce84ae086f387d6)
+++ uspace/srv/volsrv/empty.h	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
@@ -41,4 +41,5 @@
 
 extern int vol_part_is_empty(service_id_t, bool *);
+extern int vol_part_empty(service_id_t);
 
 #endif
Index: uspace/srv/volsrv/part.c
===================================================================
--- uspace/srv/volsrv/part.c	(revision edebb4a154d7503a1a506cd53ce84ae086f387d6)
+++ uspace/srv/volsrv/part.c	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
@@ -252,6 +252,17 @@
 int vol_part_empty_part(vol_part_t *part)
 {
+	int rc;
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_part()");
+
+	rc = vol_part_empty(part->svc_id);
+	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_part() - failed %d",
+		    rc);
+		return rc;
+	}
+
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_part() - success");
 	part->pcnt = vpc_empty;
-
 	return EOK;
 }
Index: uspace/srv/volsrv/volsrv.c
===================================================================
--- uspace/srv/volsrv/volsrv.c	(revision edebb4a154d7503a1a506cd53ce84ae086f387d6)
+++ uspace/srv/volsrv/volsrv.c	(revision ea0ff6b69b253afa7b6b4e9cd38ef8e91ec0daab)
@@ -199,11 +199,16 @@
 
 	sid = IPC_GET_ARG1(*icall);
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_srv(%zu)", sid);
 
 	rc = vol_part_find_by_id(sid, &part);
 	if (rc != EOK) {
+		log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_srv(%zu) - "
+		    "partition not found", sid);
 		async_answer_0(iid, ENOENT);
 		return;
 	}
 
+	log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_empty_srv(%zu) - "
+	    "call vol_part_empty_part()", sid);
 	rc = vol_part_empty_part(part);
 	if (rc != EOK) {
