The partition's number is a read-only property because it doesn't make sense to change it directly. However, it is sometimes necessary to reset partition's number to default which tell's parted that the partition should have a new number assigned. An example of such case is removing partition from a disk and adding it back.
Related: rhbz#1166598 Signed-off-by: Vratislav Podzimek vpodzime@redhat.com --- include/docstrings/pydisk.h | 6 ++++++ include/pydisk.h | 1 + include/typeobjects/pydisk.h | 2 ++ src/parted/partition.py | 4 ++++ src/pydisk.c | 14 ++++++++++++++ 5 files changed, 27 insertions(+)
diff --git a/include/docstrings/pydisk.h b/include/docstrings/pydisk.h index 77a399f..f9f6f09 100644 --- a/include/docstrings/pydisk.h +++ b/include/docstrings/pydisk.h @@ -82,6 +82,12 @@ PyDoc_STRVAR(partition_get_path_doc, "level. For instance, on Linux this could return '/dev/sda' for a partition.\n" "If an error occurs, _ped.PartitionException is raised.");
+PyDoc_STRVAR(partition_reset_num_doc, +"reset_num(self) -> boolean\n\n" +"Reset the partition's number to value allowing it to be set correctly when\n" +"the partition is added to _ped.PartedDisk. The returned value means\n" +"success/failure"); + PyDoc_STRVAR(disk_duplicate_doc, "duplicate(self) -> Disk\n\n" "Return a new Disk that is a copy of self. This method raises\n" diff --git a/include/pydisk.h b/include/pydisk.h index a2bcc4f..5f69343 100644 --- a/include/pydisk.h +++ b/include/pydisk.h @@ -135,6 +135,7 @@ PyObject *py_ped_partition_set_name(_ped_Partition *, PyObject *); PyObject *py_ped_partition_get_name(_ped_Partition *, PyObject *); PyObject *py_ped_partition_is_busy(_ped_Partition *, PyObject *); PyObject *py_ped_partition_get_path(_ped_Partition *, PyObject *); +PyObject *py_ped_partition_reset_num(_ped_Partition *, PyObject *); PyObject *py_ped_partition_type_get_name(PyObject *, PyObject *); PyObject *py_ped_partition_flag_get_name(PyObject *, PyObject *); PyObject *py_ped_partition_flag_get_by_name(PyObject *, PyObject *); diff --git a/include/typeobjects/pydisk.h b/include/typeobjects/pydisk.h index 40e7d59..6839b1f 100644 --- a/include/typeobjects/pydisk.h +++ b/include/typeobjects/pydisk.h @@ -61,6 +61,8 @@ static PyMethodDef _ped_Partition_methods[] = { partition_is_busy_doc}, {"get_path", (PyCFunction) py_ped_partition_get_path, METH_VARARGS, partition_get_path_doc}, + {"reset_num", (PyCFunction) py_ped_partition_reset_num, METH_VARARGS, + partition_reset_num_doc}, {NULL} };
diff --git a/src/parted/partition.py b/src/parted/partition.py index 1649ba1..89cb673 100644 --- a/src/parted/partition.py +++ b/src/parted/partition.py @@ -248,6 +248,10 @@ class Partition(object): For internal module use only.""" return self.__partition
+ def resetNumber(self): + """Reset the partition's number to default""" + return self.__partition.reset_num() + # collect all partition flags and store them in a hash partitionFlag = {} __flag = _ped.partition_flag_next(0) diff --git a/src/pydisk.c b/src/pydisk.c index 4e70f55..f644a52 100644 --- a/src/pydisk.c +++ b/src/pydisk.c @@ -1364,6 +1364,20 @@ PyObject *py_ped_partition_get_path(_ped_Partition *s, PyObject *args) { return PyUnicode_FromString(ret); }
+PyObject *py_ped_partition_reset_num(_ped_Partition *s, PyObject *args) { + PedPartition *part = NULL; + + part = _ped_Partition2PedPartition(s); + if (part == NULL) { + Py_RETURN_FALSE; + } + + part->num = -1; + + Py_RETURN_TRUE; +} + + PyObject *py_ped_partition_type_get_name(PyObject *s, PyObject *args) { long type; char *ret = NULL;