diff options
author | Karel Zak | 2013-10-09 16:02:33 +0200 |
---|---|---|
committer | Karel Zak | 2013-10-09 16:02:33 +0200 |
commit | 7a188aedbf4468e9753200716ec845a00dd8b30e (patch) | |
tree | cbdf161b040688bc81cd1d6b1369d311a25569c6 /libfdisk | |
parent | cytune: fix glush typo in cytune (diff) | |
download | kernel-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.c | 29 | ||||
-rw-r--r-- | libfdisk/src/fdiskP.h | 3 | ||||
-rw-r--r-- | libfdisk/src/label.c | 23 | ||||
-rw-r--r-- | libfdisk/src/libfdisk.h | 4 |
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); |