Index: uspace/lib/label/src/dummy.c
===================================================================
--- uspace/lib/label/src/dummy.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
+++ uspace/lib/label/src/dummy.c	(revision 372df8f916002c4dcfde6b3bfe02589b3c2f10da)
@@ -0,0 +1,215 @@
+/*
+ * Copyright (c) 2015 Jiri Svoboda
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup liblabel
+ * @{
+ */
+/**
+ * @file Dummy label (for disks that have no recognized label)
+ */
+
+#include <block.h>
+#include <errno.h>
+#include <mem.h>
+#include <stdlib.h>
+
+#include "dummy.h"
+
+static int dummy_open(service_id_t, label_t **);
+static int dummy_create(service_id_t, label_t **);
+static void dummy_close(label_t *);
+static int dummy_destroy(label_t *);
+static int dummy_get_info(label_t *, label_info_t *);
+static label_part_t *dummy_part_first(label_t *);
+static label_part_t *dummy_part_next(label_part_t *);
+static void dummy_part_get_info(label_part_t *, label_part_info_t *);
+static int dummy_part_create(label_t *, label_part_spec_t *, label_part_t **);
+static int dummy_part_destroy(label_part_t *);
+static int dummy_suggest_ptype(label_t *, label_pcnt_t, label_ptype_t *);
+
+label_ops_t dummy_label_ops = {
+	.open = dummy_open,
+	.create = dummy_create,
+	.close = dummy_close,
+	.destroy = dummy_destroy,
+	.get_info = dummy_get_info,
+	.part_first = dummy_part_first,
+	.part_next = dummy_part_next,
+	.part_get_info = dummy_part_get_info,
+	.part_create = dummy_part_create,
+	.part_destroy = dummy_part_destroy,
+	.suggest_ptype = dummy_suggest_ptype
+};
+
+static int dummy_open(service_id_t sid, label_t **rlabel)
+{
+	label_t *label = NULL;
+	label_part_t *part = NULL;
+	size_t bsize;
+	aoff64_t nblocks;
+	uint64_t ba_min, ba_max;
+	int rc;
+
+	rc = block_get_bsize(sid, &bsize);
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
+
+	rc = block_get_nblocks(sid, &nblocks);
+	if (rc != EOK) {
+		rc = EIO;
+		goto error;
+	}
+
+	label = calloc(1, sizeof(label_t));
+	if (label == NULL)
+		return ENOMEM;
+
+	list_initialize(&label->parts);
+	list_initialize(&label->pri_parts);
+	list_initialize(&label->log_parts);
+
+	ba_min = 0;
+	ba_max = nblocks;
+
+	label->ops = &dummy_label_ops;
+	label->ltype = lt_none;
+	label->svc_id = sid;
+	label->ablock0 = ba_min;
+	label->anblocks = ba_max - ba_min + 1;
+	label->pri_entries = 0;
+	label->block_size = bsize;
+
+	part = calloc(1, sizeof(label_part_t));
+	if (part == NULL)
+		return ENOMEM;
+
+	part->index = 0;
+	part->block0 = ba_min;
+	part->nblocks = ba_max - ba_min;
+	part->ptype.fmt = lptf_num;
+
+	part->label = label;
+	list_append(&part->lparts, &label->parts);
+	list_append(&part->lpri, &label->pri_parts);
+
+
+	*rlabel = label;
+	return EOK;
+error:
+	free(part);
+	free(label);
+	return rc;
+}
+
+static int dummy_create(service_id_t sid, label_t **rlabel)
+{
+	return ENOTSUP;
+}
+
+static void dummy_close(label_t *label)
+{
+	label_part_t *part;
+
+	part = dummy_part_first(label);
+	while (part != NULL) {
+		list_remove(&part->lparts);
+		list_remove(&part->lpri);
+		free(part);
+		part = dummy_part_first(label);
+	}
+
+	free(label);
+}
+
+static int dummy_destroy(label_t *label)
+{
+	return ENOTSUP;
+}
+
+static int dummy_get_info(label_t *label, label_info_t *linfo)
+{
+	memset(linfo, 0, sizeof(label_info_t));
+	linfo->dcnt = dc_label;
+	linfo->ltype = lt_none;
+	linfo->flags = 0;
+	linfo->ablock0 = label->ablock0;
+	linfo->anblocks = label->anblocks;
+	return EOK;
+}
+
+static label_part_t *dummy_part_first(label_t *label)
+{
+	link_t *link;
+
+	link = list_first(&label->parts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, label_part_t, lparts);
+}
+
+static label_part_t *dummy_part_next(label_part_t *part)
+{
+	link_t *link;
+
+	link = list_next(&part->lparts, &part->label->parts);
+	if (link == NULL)
+		return NULL;
+
+	return list_get_instance(link, label_part_t, lparts);
+}
+
+static void dummy_part_get_info(label_part_t *part, label_part_info_t *pinfo)
+{
+	pinfo->index = part->index;
+	pinfo->pkind = lpk_primary;
+	pinfo->block0 = part->block0;
+	pinfo->nblocks = part->nblocks;
+}
+
+static int dummy_part_create(label_t *label, label_part_spec_t *pspec,
+    label_part_t **rpart)
+{
+	return ENOTSUP;
+}
+
+static int dummy_part_destroy(label_part_t *part)
+{
+	return ENOTSUP;
+}
+
+static int dummy_suggest_ptype(label_t *label, label_pcnt_t pcnt,
+    label_ptype_t *ptype)
+{
+	return ENOTSUP;
+}
+
+/** @}
+ */
