summaryrefslogtreecommitdiffstats
path: root/libfdisk
diff options
context:
space:
mode:
authorKarel Zak2014-04-18 13:26:08 +0200
committerKarel Zak2014-04-18 13:26:08 +0200
commitdd7ba604631ce57f194f56dfb71414e42d914a21 (patch)
tree180cd564eb416092521b48da0c06c24e2a6e8de4 /libfdisk
parentnsenter: add + to getopt_long() (diff)
downloadkernel-qcow2-util-linux-dd7ba604631ce57f194f56dfb71414e42d914a21.tar.gz
kernel-qcow2-util-linux-dd7ba604631ce57f194f56dfb71414e42d914a21.tar.xz
kernel-qcow2-util-linux-dd7ba604631ce57f194f56dfb71414e42d914a21.zip
libfdisk: add partitions reorder operation to label API
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk')
-rw-r--r--libfdisk/src/dos.c3
-rw-r--r--libfdisk/src/fdiskP.h4
-rw-r--r--libfdisk/src/label.c18
-rw-r--r--libfdisk/src/libfdisk.h3
4 files changed, 25 insertions, 3 deletions
diff --git a/libfdisk/src/dos.c b/libfdisk/src/dos.c
index b68765bb1..645410cbd 100644
--- a/libfdisk/src/dos.c
+++ b/libfdisk/src/dos.c
@@ -1803,7 +1803,7 @@ again:
DBG(LABEL, print_chain_of_logicals(cxt));
}
-int fdisk_dos_fix_order(struct fdisk_context *cxt)
+static int dos_reorder(struct fdisk_context *cxt)
{
struct pte *pei, *pek;
size_t i,k;
@@ -1990,6 +1990,7 @@ static const struct fdisk_label_operations dos_operations =
.create = dos_create_disklabel,
.locate = dos_locate_disklabel,
.list = dos_list_disklabel,
+ .reorder = dos_reorder,
.get_id = dos_get_disklabel_id,
.set_id = dos_set_disklabel_id,
diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
index f966d0a68..f5b4bb8ed 100644
--- a/libfdisk/src/fdiskP.h
+++ b/libfdisk/src/fdiskP.h
@@ -182,10 +182,12 @@ struct fdisk_label_operations {
int (*verify)(struct fdisk_context *cxt);
/* create new disk label */
int (*create)(struct fdisk_context *cxt);
- /* list partition table */
+ /* list disklabel details */
int (*list)(struct fdisk_context *cxt);
/* returns offset and size of the 'n' part of the PT */
int (*locate)(struct fdisk_context *cxt, int n, const char **name, off_t *offset, size_t *size);
+ /* reorder partitions */
+ int (*reorder)(struct fdisk_context *cxt);
/* get disk label ID */
int (*get_id)(struct fdisk_context *cxt, char **id);
diff --git a/libfdisk/src/label.c b/libfdisk/src/label.c
index 9c6fcc5b3..3881a2713 100644
--- a/libfdisk/src/label.c
+++ b/libfdisk/src/label.c
@@ -372,6 +372,24 @@ int fdisk_partition_toggle_flag(struct fdisk_context *cxt,
return rc;
}
+/**
+ * fdisk_reorder_partitions
+ * @cxt: fdisk context
+ *
+ * Sort partitions according to the partition start sector.
+ *
+ * Returns 0 on success, otherwise, a corresponding error.
+ */
+int fdisk_reorder_partitions(struct fdisk_context *cxt)
+{
+ if (!cxt || !cxt->label)
+ return -EINVAL;
+ if (!cxt->label->op->reorder)
+ return -ENOSYS;
+
+ return cxt->label->op->reorder(cxt);
+}
+
/*
* Resets the current used label driver to initial state
*/
diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h
index b44451da6..4143d9bc3 100644
--- a/libfdisk/src/libfdisk.h
+++ b/libfdisk/src/libfdisk.h
@@ -224,6 +224,8 @@ extern int fdisk_partition_end_follow_default(struct fdisk_partition *pa, int en
extern int fdisk_dump_partition(struct fdisk_partition *pa, FILE *f);
+extern int fdisk_reorder_partitions(struct fdisk_context *cxt);
+
/* table.c */
extern struct fdisk_table *fdisk_new_table(void);
extern int fdisk_reset_table(struct fdisk_table *tb);
@@ -324,7 +326,6 @@ extern struct dos_partition *fdisk_dos_get_partition(
struct fdisk_context *cxt,
size_t i);
-extern int fdisk_dos_fix_order(struct fdisk_context *cxt);
extern int fdisk_dos_move_begin(struct fdisk_context *cxt, size_t i);
#define DOS_FLAG_ACTIVE 1