summaryrefslogtreecommitdiffstats
path: root/libfdisk
diff options
context:
space:
mode:
authorKarel Zak2013-10-09 16:02:33 +0200
committerKarel Zak2013-10-09 16:02:33 +0200
commit7a188aedbf4468e9753200716ec845a00dd8b30e (patch)
treecbdf161b040688bc81cd1d6b1369d311a25569c6 /libfdisk
parentcytune: fix glush typo in cytune (diff)
downloadkernel-qcow2-util-linux-7a188aedbf4468e9753200716ec845a00dd8b30e.tar.gz
kernel-qcow2-util-linux-7a188aedbf4468e9753200716ec845a00dd8b30e.tar.xz
kernel-qcow2-util-linux-7a188aedbf4468e9753200716ec845a00dd8b30e.zip
libfdisk: add API to disable specified label
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk')
-rw-r--r--libfdisk/src/context.c29
-rw-r--r--libfdisk/src/fdiskP.h3
-rw-r--r--libfdisk/src/label.c23
-rw-r--r--libfdisk/src/libfdisk.h4
4 files changed, 55 insertions, 4 deletions
diff --git a/libfdisk/src/context.c b/libfdisk/src/context.c
index c5d2329cf..9106e29b3 100644
--- a/libfdisk/src/context.c
+++ b/libfdisk/src/context.c
@@ -102,11 +102,38 @@ struct fdisk_label *fdisk_context_get_label(struct fdisk_context *cxt, const cha
return NULL;
}
+int fdisk_context_next_label(struct fdisk_context *cxt, struct fdisk_label **lb)
+{
+ size_t i;
+ struct fdisk_label *res = NULL;
+
+ if (!lb || !cxt)
+ return -EINVAL;
+
+ if (!*lb)
+ res = cxt->labels[0];
+ else {
+ for (i = 1; i < cxt->nlabels; i++) {
+ if (*lb == cxt->labels[i - 1]) {
+ res = cxt->labels[i];
+ break;
+ }
+ }
+ }
+
+ *lb = res;
+ return res ? 0 : 1;
+}
+
int __fdisk_context_switch_label(struct fdisk_context *cxt,
struct fdisk_label *lb)
{
- if (!lb)
+ if (!lb || !cxt)
+ return -EINVAL;
+ if (lb->disabled) {
+ DBG(LABEL, dbgprint("*** attempt to switch to disabled label %s -- ignore!", lb->name));
return -EINVAL;
+ }
cxt->label = lb;
DBG(LABEL, dbgprint("--> switching context to %s!", lb->name));
return 0;
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index b03586fae..feaab3d0a 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -202,7 +202,8 @@ struct fdisk_label {
int flags; /* FDISK_LABEL_FL_* flags */
- unsigned int changed:1; /* label has been modified */
+ unsigned int changed:1, /* label has been modified */
+ disabled:1; /* this driver is disabled at all */
const struct fdisk_label_operations *op;
};
diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c
index aba2790cc..7f9c7d0e3 100644
--- a/libfdisk/src/label.c
+++ b/libfdisk/src/label.c
@@ -17,7 +17,10 @@ int fdisk_probe_labels(struct fdisk_context *cxt)
if (!lb->op->probe)
continue;
-
+ if (lb->disabled) {
+ DBG(LABEL, dbgprint("%s disabled -- ignore", lb->name));
+ continue;
+ }
DBG(LABEL, dbgprint("probing for %s", lb->name));
cxt->label = lb;
@@ -230,7 +233,7 @@ int fdisk_create_disklabel(struct fdisk_context *cxt, const char *name)
}
lb = fdisk_context_get_label(cxt, name);
- if (!lb)
+ if (!lb || lb->disabled)
return -EINVAL;
if (!lb->op->create)
return -ENOSYS;
@@ -436,3 +439,19 @@ int fdisk_label_is_changed(struct fdisk_label *lb)
assert(lb);
return lb ? lb->changed : 0;
}
+
+void fdisk_label_set_disabled(struct fdisk_label *lb, int disabled)
+{
+ assert(lb);
+
+ DBG(LABEL, dbgprint("%s label %s",
+ lb->name,
+ disabled ? "DISABLED" : "ENABLED"));
+ lb->disabled = disabled ? 1 : 0;
+}
+
+int fdisk_label_is_disabled(struct fdisk_label *lb)
+{
+ assert(lb);
+ return lb ? lb->disabled : 0;
+}
diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h
index 7ad356067..cd856d70d 100644
--- a/libfdisk/src/libfdisk.h
+++ b/libfdisk/src/libfdisk.h
@@ -87,6 +87,7 @@ extern int fdisk_context_deassign_device(struct fdisk_context *cxt);
extern struct fdisk_label *fdisk_context_get_label(struct fdisk_context *cxt,
const char *name);
+extern int fdisk_context_next_label(struct fdisk_context *cxt, struct fdisk_label **lb);
extern int fdisk_context_switch_label(struct fdisk_context *cxt,
const char *name);
@@ -142,6 +143,9 @@ extern int fdisk_set_partition_type(struct fdisk_context *cxt, size_t partnum,
extern void fdisk_label_set_changed(struct fdisk_label *lb, int changed);
extern int fdisk_label_is_changed(struct fdisk_label *lb);
+extern void fdisk_label_set_disabled(struct fdisk_label *lb, int disabled);
+extern int fdisk_label_is_disabled(struct fdisk_label *lb);
+
extern int fdisk_partition_get_status(struct fdisk_context *cxt, size_t partnum, int *status);
extern int fdisk_partition_is_used(struct fdisk_context *cxt, size_t partnum);
extern int fdisk_partition_toggle_flag(struct fdisk_context *cxt, size_t partnum, unsigned long flag);