* [PATCH 03/10] fdisk: API: add fdisk_label_change
@ 2012-07-22 17:05 Davidlohr Bueso
2012-07-24 9:47 ` Bernhard Voelker
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: Davidlohr Bueso @ 2012-07-22 17:05 UTC (permalink / raw)
To: Karel Zak, Petr Uzel; +Cc: util-linux
From: Davidlohr Bueso <dave@gnu.org>
A new fdisk_label_change() function is added for situations when the disk label is
changed (ie: creating a new sun label). This function only updates the label pointer
in the context to use the newly specified label type.
Signed-off-by: Davidlohr Bueso <dave@gnu.org>
---
fdisks/fdisk.h | 2 ++
fdisks/fdiskdoslabel.c | 1 +
fdisks/fdisksgilabel.c | 2 ++
fdisks/fdisksunlabel.c | 1 +
fdisks/utils.c | 37 +++++++++++++++++++++++++++++++++++++
5 files changed, 43 insertions(+), 0 deletions(-)
diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h
index d716824..d7e85f5 100644
--- a/fdisks/fdisk.h
+++ b/fdisks/fdisk.h
@@ -104,6 +104,7 @@ enum fdisk_error {
FDISK_ERROR_WRITE,
FDISK_ERROR_IOCTL,
FDISK_ERROR_PROBE,
+ FDISK_ERROR_NOLABEL,
FDISK_ERROR_UNKNOWN
};
@@ -164,6 +165,7 @@ extern void fdisk_mbr_zeroize(struct fdisk_context *cxt);
extern void fdisk_geom_set_cyls(struct fdisk_context *cxt);
extern const char *fdisk_error_name(enum fdisk_error errcode);
extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode);
+extern int fdisk_label_change(struct fdisk_context *cxt, const char *name);
/* prototypes for fdisk.c */
extern char *disk_device, *line_ptr;
diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c
index 535afdc..9b9b23a 100644
--- a/fdisks/fdiskdoslabel.c
+++ b/fdisks/fdiskdoslabel.c
@@ -230,6 +230,7 @@ void create_doslabel(struct fdisk_context *cxt)
dos_init(cxt);
fdisk_mbr_zeroize(cxt);
+ fdisk_label_change(cxt, "dos");
set_all_unchanged();
set_changed(0);
diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c
index e38d98f..6001038 100644
--- a/fdisks/fdisksgilabel.c
+++ b/fdisks/fdisksgilabel.c
@@ -780,6 +780,8 @@ create_sgilabel(struct fdisk_context *cxt)
}
fdisk_mbr_zeroize(cxt);
+ fdisk_label_change(cxt, "sgi");
+
sgilabel->magic = SSWAP32(SGI_LABEL_MAGIC);
sgilabel->boot_part = SSWAP16(0);
sgilabel->swap_part = SSWAP16(1);
diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c
index 4123806..b63335c 100644
--- a/fdisks/fdisksunlabel.c
+++ b/fdisks/fdisksunlabel.c
@@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt)
init();
fdisk_mbr_zeroize(cxt);
+ fdisk_label_change(cxt, "sun");
sunlabel->magic = SSWAP16(SUN_LABEL_MAGIC);
sunlabel->sanity = SSWAP32(SUN_LABEL_SANE);
diff --git a/fdisks/utils.c b/fdisks/utils.c
index cf9484c..48dedfb 100644
--- a/fdisks/utils.c
+++ b/fdisks/utils.c
@@ -44,6 +44,43 @@ static const struct fdisk_label *labels[] =
&mac_label,
};
+/**
+ * fdisk_label_change:
+ * @cxt: fdisk context
+ * @name: new label name
+ *
+ * Updates the disk label type to the one specified by @name.
+ *
+ * Returns 0 on success, otherwise, a corresponding error.
+ */
+int fdisk_label_change(struct fdisk_context *cxt, const char *name)
+{
+ int i;
+
+ if (!cxt || !cxt->label || !name)
+ return FDISK_ERROR_UNKNOWN;
+
+ /* not really changing the label */
+ if (!strncmp(name, cxt->label->name, strlen(name)))
+ goto done;
+
+ for (i = 0; i < ARRAY_SIZE(labels); i++) {
+ if (strncmp(name, labels[i]->name, strlen(name)))
+ continue;
+
+ /* found the new label */
+ memset(cxt->label, 0, sizeof(struct fdisk_label));
+ memcpy(cxt->label, labels[i], sizeof(struct fdisk_label));
+ DBG(LABEL, dbgprint("changing to a %s label\n", labels[i]->name));
+ goto done;
+ }
+
+ /* couldn't find the requested label type */
+ return FDISK_ERROR_NOLABEL;
+done:
+ return 0;
+}
+
static int __probe_labels(struct fdisk_context *cxt)
{
int i, rc = 0;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 11+ messages in thread* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-22 17:05 [PATCH 03/10] fdisk: API: add fdisk_label_change Davidlohr Bueso @ 2012-07-24 9:47 ` Bernhard Voelker 2012-07-24 9:56 ` Petr Uzel 2012-07-24 9:52 ` Petr Uzel 2012-07-24 11:35 ` Karel Zak 2 siblings, 1 reply; 11+ messages in thread From: Bernhard Voelker @ 2012-07-24 9:47 UTC (permalink / raw) To: dave; +Cc: Karel Zak, Petr Uzel, util-linux On 07/22/2012 07:05 PM, Davidlohr Bueso wrote: > --- a/fdisks/fdisksunlabel.c > +++ b/fdisks/fdisksunlabel.c > @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) > > init(); > fdisk_mbr_zeroize(cxt); > + fdisk_label_change(cxt, "sun"); > ... > +int fdisk_label_change(struct fdisk_context *cxt, const char *name) > +{ > + int i; > + > + if (!cxt || !cxt->label || !name) > + return FDISK_ERROR_UNKNOWN; > + > + /* not really changing the label */ > + if (!strncmp(name, cxt->label->name, strlen(name))) > + goto done; > + > + for (i = 0; i < ARRAY_SIZE(labels); i++) { > + if (strncmp(name, labels[i]->name, strlen(name))) > + continue; Shouldn't we use something else than hardcoded "sun"|"dos"|"sgi"|... strings here? (See also "[PATCH 08/10] fdisk: API: add create disklabel to label operations".) Have a nice day, Berny ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-24 9:47 ` Bernhard Voelker @ 2012-07-24 9:56 ` Petr Uzel 2012-07-24 10:32 ` Bernhard Voelker 0 siblings, 1 reply; 11+ messages in thread From: Petr Uzel @ 2012-07-24 9:56 UTC (permalink / raw) To: Bernhard Voelker; +Cc: dave, util-linux [-- Attachment #1: Type: text/plain, Size: 1454 bytes --] On Tue, Jul 24, 2012 at 11:47:53AM +0200, Bernhard Voelker wrote: > > > On 07/22/2012 07:05 PM, Davidlohr Bueso wrote: > > --- a/fdisks/fdisksunlabel.c > > +++ b/fdisks/fdisksunlabel.c > > @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) > > > > init(); > > fdisk_mbr_zeroize(cxt); > > + fdisk_label_change(cxt, "sun"); > > > > ... > > > +int fdisk_label_change(struct fdisk_context *cxt, const char *name) > > +{ > > + int i; > > + > > + if (!cxt || !cxt->label || !name) > > + return FDISK_ERROR_UNKNOWN; > > + > > + /* not really changing the label */ > > + if (!strncmp(name, cxt->label->name, strlen(name))) > > + goto done; > > + > > + for (i = 0; i < ARRAY_SIZE(labels); i++) { > > + if (strncmp(name, labels[i]->name, strlen(name))) > > + continue; > > Shouldn't we use something else than hardcoded "sun"|"dos"|"sgi"|... > strings here? What's the problem with these strings? I think these are well recognized with clear meaning. What alternative do you propose? Thanks, Petr > (See also "[PATCH 08/10] fdisk: API: add create disklabel > to label operations".) > > Have a nice day, > Berny > -- > To unsubscribe from this list: send the line "unsubscribe util-linux" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Petr -- Petr Uzel IRC: ptr_uzl @ freenode [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-24 9:56 ` Petr Uzel @ 2012-07-24 10:32 ` Bernhard Voelker 2012-07-24 10:39 ` Davidlohr Bueso 0 siblings, 1 reply; 11+ messages in thread From: Bernhard Voelker @ 2012-07-24 10:32 UTC (permalink / raw) To: dave, util-linux On 07/24/2012 11:56 AM, Petr Uzel wrote: > On Tue, Jul 24, 2012 at 11:47:53AM +0200, Bernhard Voelker wrote: >> >> >> On 07/22/2012 07:05 PM, Davidlohr Bueso wrote: >>> --- a/fdisks/fdisksunlabel.c >>> +++ b/fdisks/fdisksunlabel.c >>> @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) >>> >>> init(); >>> fdisk_mbr_zeroize(cxt); >>> + fdisk_label_change(cxt, "sun"); >>> >> >> >> Shouldn't we use something else than hardcoded "sun"|"dos"|"sgi"|... >> strings here? > > What's the problem with these strings? I think these are well > recognized with clear meaning. What alternative do you propose? Sorry, I should've proposed this already in my first mail: - fdisk_label_change(cxt, "sun"); + fdisk_label_change(cxt, sun_label.name); It's already defined ;-) Have a nice day, Berny ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-24 10:32 ` Bernhard Voelker @ 2012-07-24 10:39 ` Davidlohr Bueso 2012-07-24 10:42 ` Petr Uzel 0 siblings, 1 reply; 11+ messages in thread From: Davidlohr Bueso @ 2012-07-24 10:39 UTC (permalink / raw) To: Bernhard Voelker; +Cc: util-linux On Tue, 2012-07-24 at 12:32 +0200, Bernhard Voelker wrote: > > On 07/24/2012 11:56 AM, Petr Uzel wrote: > > On Tue, Jul 24, 2012 at 11:47:53AM +0200, Bernhard Voelker wrote: > >> > >> > >> On 07/22/2012 07:05 PM, Davidlohr Bueso wrote: > >>> --- a/fdisks/fdisksunlabel.c > >>> +++ b/fdisks/fdisksunlabel.c > >>> @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) > >>> > >>> init(); > >>> fdisk_mbr_zeroize(cxt); > >>> + fdisk_label_change(cxt, "sun"); > >>> > >> > > >> > >> Shouldn't we use something else than hardcoded "sun"|"dos"|"sgi"|... > >> strings here? > > > > What's the problem with these strings? I think these are well > > recognized with clear meaning. What alternative do you propose? > > Sorry, I should've proposed this already in my first mail: > > - fdisk_label_change(cxt, "sun"); > + fdisk_label_change(cxt, sun_label.name); > I'm planning on adding the disklabel type (numeric) to the context structure in a near future, so we'd then have two ways of identifying labels. I really do not see much difference between numbers and strings - this is not a performance critical program. Thanks, Davidlohr > It's already defined ;-) > > Have a nice day, > Berny > > -- > To unsubscribe from this list: send the line "unsubscribe util-linux" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-24 10:39 ` Davidlohr Bueso @ 2012-07-24 10:42 ` Petr Uzel 2012-07-24 10:47 ` Bernhard Voelker 0 siblings, 1 reply; 11+ messages in thread From: Petr Uzel @ 2012-07-24 10:42 UTC (permalink / raw) To: Davidlohr Bueso; +Cc: Bernhard Voelker, util-linux [-- Attachment #1: Type: text/plain, Size: 922 bytes --] On Tue, Jul 24, 2012 at 12:39:07PM +0200, Davidlohr Bueso wrote: > > >> Shouldn't we use something else than hardcoded "sun"|"dos"|"sgi"|... > > >> strings here? > > > > > > What's the problem with these strings? I think these are well > > > recognized with clear meaning. What alternative do you propose? > > > > Sorry, I should've proposed this already in my first mail: > > > > - fdisk_label_change(cxt, "sun"); > > + fdisk_label_change(cxt, sun_label.name); Ah, right. Deduplicating the strings makes sense, IMO. > I'm planning on adding the disklabel type (numeric) to the context > structure in a near future, so we'd then have two ways of identifying > labels. I really do not see much difference between numbers and strings > - this is not a performance critical program. The concern here is not speed, but maintainability ;) Best, Petr -- Petr Uzel IRC: ptr_uzl @ freenode [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-24 10:42 ` Petr Uzel @ 2012-07-24 10:47 ` Bernhard Voelker 0 siblings, 0 replies; 11+ messages in thread From: Bernhard Voelker @ 2012-07-24 10:47 UTC (permalink / raw) To: Davidlohr Bueso, util-linux On 07/24/2012 12:42 PM, Petr Uzel wrote: > On Tue, Jul 24, 2012 at 12:39:07PM +0200, Davidlohr Bueso wrote: >>>>> Shouldn't we use something else than hardcoded "sun"|"dos"|"sgi"|... >>>>> strings here? >>>> >>>> What's the problem with these strings? I think these are well >>>> recognized with clear meaning. What alternative do you propose? >>> >>> Sorry, I should've proposed this already in my first mail: >>> >>> - fdisk_label_change(cxt, "sun"); >>> + fdisk_label_change(cxt, sun_label.name); > > Ah, right. Deduplicating the strings makes sense, IMO. > >> I'm planning on adding the disklabel type (numeric) to the context >> structure in a near future, so we'd then have two ways of identifying >> labels. I really do not see much difference between numbers and strings >> - this is not a performance critical program. > > The concern here is not speed, but maintainability ;) Right ... and to save a bit size of the binary (well, not too much in this case) ;-) Have a nice day, Berny ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-22 17:05 [PATCH 03/10] fdisk: API: add fdisk_label_change Davidlohr Bueso 2012-07-24 9:47 ` Bernhard Voelker @ 2012-07-24 9:52 ` Petr Uzel 2012-07-24 10:41 ` Davidlohr Bueso 2012-07-24 11:35 ` Karel Zak 2 siblings, 1 reply; 11+ messages in thread From: Petr Uzel @ 2012-07-24 9:52 UTC (permalink / raw) To: util-linux; +Cc: Davidlohr Bueso [-- Attachment #1: Type: text/plain, Size: 4433 bytes --] On Sun, Jul 22, 2012 at 07:05:04PM +0200, Davidlohr Bueso wrote: > From: Davidlohr Bueso <dave@gnu.org> > > A new fdisk_label_change() function is added for situations when the disk label is > changed (ie: creating a new sun label). This function only updates the label pointer > in the context to use the newly specified label type. Why can't we just call __probe_labels() after creating new label, e.g. in soon-to-be introduced fdisk_label_create()? > > Signed-off-by: Davidlohr Bueso <dave@gnu.org> > --- > fdisks/fdisk.h | 2 ++ > fdisks/fdiskdoslabel.c | 1 + > fdisks/fdisksgilabel.c | 2 ++ > fdisks/fdisksunlabel.c | 1 + > fdisks/utils.c | 37 +++++++++++++++++++++++++++++++++++++ > 5 files changed, 43 insertions(+), 0 deletions(-) > > diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h > index d716824..d7e85f5 100644 > --- a/fdisks/fdisk.h > +++ b/fdisks/fdisk.h > @@ -104,6 +104,7 @@ enum fdisk_error { > FDISK_ERROR_WRITE, > FDISK_ERROR_IOCTL, > FDISK_ERROR_PROBE, > + FDISK_ERROR_NOLABEL, > FDISK_ERROR_UNKNOWN > }; > > @@ -164,6 +165,7 @@ extern void fdisk_mbr_zeroize(struct fdisk_context *cxt); > extern void fdisk_geom_set_cyls(struct fdisk_context *cxt); > extern const char *fdisk_error_name(enum fdisk_error errcode); > extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode); > +extern int fdisk_label_change(struct fdisk_context *cxt, const char *name); > > /* prototypes for fdisk.c */ > extern char *disk_device, *line_ptr; > diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c > index 535afdc..9b9b23a 100644 > --- a/fdisks/fdiskdoslabel.c > +++ b/fdisks/fdiskdoslabel.c > @@ -230,6 +230,7 @@ void create_doslabel(struct fdisk_context *cxt) > > dos_init(cxt); > fdisk_mbr_zeroize(cxt); > + fdisk_label_change(cxt, "dos"); > set_all_unchanged(); > set_changed(0); > > diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c > index e38d98f..6001038 100644 > --- a/fdisks/fdisksgilabel.c > +++ b/fdisks/fdisksgilabel.c > @@ -780,6 +780,8 @@ create_sgilabel(struct fdisk_context *cxt) > } > > fdisk_mbr_zeroize(cxt); > + fdisk_label_change(cxt, "sgi"); > + > sgilabel->magic = SSWAP32(SGI_LABEL_MAGIC); > sgilabel->boot_part = SSWAP16(0); > sgilabel->swap_part = SSWAP16(1); > diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c > index 4123806..b63335c 100644 > --- a/fdisks/fdisksunlabel.c > +++ b/fdisks/fdisksunlabel.c > @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) > > init(); > fdisk_mbr_zeroize(cxt); > + fdisk_label_change(cxt, "sun"); > > sunlabel->magic = SSWAP16(SUN_LABEL_MAGIC); > sunlabel->sanity = SSWAP32(SUN_LABEL_SANE); > diff --git a/fdisks/utils.c b/fdisks/utils.c > index cf9484c..48dedfb 100644 > --- a/fdisks/utils.c > +++ b/fdisks/utils.c > @@ -44,6 +44,43 @@ static const struct fdisk_label *labels[] = > &mac_label, > }; > > +/** > + * fdisk_label_change: > + * @cxt: fdisk context > + * @name: new label name > + * > + * Updates the disk label type to the one specified by @name. > + * > + * Returns 0 on success, otherwise, a corresponding error. > + */ > +int fdisk_label_change(struct fdisk_context *cxt, const char *name) > +{ > + int i; > + > + if (!cxt || !cxt->label || !name) > + return FDISK_ERROR_UNKNOWN; > + > + /* not really changing the label */ > + if (!strncmp(name, cxt->label->name, strlen(name))) > + goto done; > + > + for (i = 0; i < ARRAY_SIZE(labels); i++) { > + if (strncmp(name, labels[i]->name, strlen(name))) > + continue; > + > + /* found the new label */ > + memset(cxt->label, 0, sizeof(struct fdisk_label)); > + memcpy(cxt->label, labels[i], sizeof(struct fdisk_label)); > + DBG(LABEL, dbgprint("changing to a %s label\n", labels[i]->name)); > + goto done; > + } > + > + /* couldn't find the requested label type */ > + return FDISK_ERROR_NOLABEL; > +done: > + return 0; > +} > + > static int __probe_labels(struct fdisk_context *cxt) > { > int i, rc = 0; > -- > 1.7.4.1 > > > > > -- > To unsubscribe from this list: send the line "unsubscribe util-linux" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Petr -- Petr Uzel IRC: ptr_uzl @ freenode [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-24 9:52 ` Petr Uzel @ 2012-07-24 10:41 ` Davidlohr Bueso 2012-07-24 10:52 ` Petr Uzel 0 siblings, 1 reply; 11+ messages in thread From: Davidlohr Bueso @ 2012-07-24 10:41 UTC (permalink / raw) To: Petr Uzel; +Cc: util-linux On Tue, 2012-07-24 at 11:52 +0200, Petr Uzel wrote: > On Sun, Jul 22, 2012 at 07:05:04PM +0200, Davidlohr Bueso wrote: > > From: Davidlohr Bueso <dave@gnu.org> > > > > A new fdisk_label_change() function is added for situations when the disk label is > > changed (ie: creating a new sun label). This function only updates the label pointer > > in the context to use the newly specified label type. > > Why can't we just call __probe_labels() after creating new label, e.g. > in soon-to-be introduced fdisk_label_create()? Because this way we give users extra functionality in the API. There should be a way of changing label types on the fly, and since we don't export __probe_labels(), this is the other option. Thanks, Davidlohr > > > > > Signed-off-by: Davidlohr Bueso <dave@gnu.org> > > --- > > fdisks/fdisk.h | 2 ++ > > fdisks/fdiskdoslabel.c | 1 + > > fdisks/fdisksgilabel.c | 2 ++ > > fdisks/fdisksunlabel.c | 1 + > > fdisks/utils.c | 37 +++++++++++++++++++++++++++++++++++++ > > 5 files changed, 43 insertions(+), 0 deletions(-) > > > > diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h > > index d716824..d7e85f5 100644 > > --- a/fdisks/fdisk.h > > +++ b/fdisks/fdisk.h > > @@ -104,6 +104,7 @@ enum fdisk_error { > > FDISK_ERROR_WRITE, > > FDISK_ERROR_IOCTL, > > FDISK_ERROR_PROBE, > > + FDISK_ERROR_NOLABEL, > > FDISK_ERROR_UNKNOWN > > }; > > > > @@ -164,6 +165,7 @@ extern void fdisk_mbr_zeroize(struct fdisk_context *cxt); > > extern void fdisk_geom_set_cyls(struct fdisk_context *cxt); > > extern const char *fdisk_error_name(enum fdisk_error errcode); > > extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode); > > +extern int fdisk_label_change(struct fdisk_context *cxt, const char *name); > > > > /* prototypes for fdisk.c */ > > extern char *disk_device, *line_ptr; > > diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c > > index 535afdc..9b9b23a 100644 > > --- a/fdisks/fdiskdoslabel.c > > +++ b/fdisks/fdiskdoslabel.c > > @@ -230,6 +230,7 @@ void create_doslabel(struct fdisk_context *cxt) > > > > dos_init(cxt); > > fdisk_mbr_zeroize(cxt); > > + fdisk_label_change(cxt, "dos"); > > set_all_unchanged(); > > set_changed(0); > > > > diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c > > index e38d98f..6001038 100644 > > --- a/fdisks/fdisksgilabel.c > > +++ b/fdisks/fdisksgilabel.c > > @@ -780,6 +780,8 @@ create_sgilabel(struct fdisk_context *cxt) > > } > > > > fdisk_mbr_zeroize(cxt); > > + fdisk_label_change(cxt, "sgi"); > > + > > sgilabel->magic = SSWAP32(SGI_LABEL_MAGIC); > > sgilabel->boot_part = SSWAP16(0); > > sgilabel->swap_part = SSWAP16(1); > > diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c > > index 4123806..b63335c 100644 > > --- a/fdisks/fdisksunlabel.c > > +++ b/fdisks/fdisksunlabel.c > > @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) > > > > init(); > > fdisk_mbr_zeroize(cxt); > > + fdisk_label_change(cxt, "sun"); > > > > sunlabel->magic = SSWAP16(SUN_LABEL_MAGIC); > > sunlabel->sanity = SSWAP32(SUN_LABEL_SANE); > > diff --git a/fdisks/utils.c b/fdisks/utils.c > > index cf9484c..48dedfb 100644 > > --- a/fdisks/utils.c > > +++ b/fdisks/utils.c > > @@ -44,6 +44,43 @@ static const struct fdisk_label *labels[] = > > &mac_label, > > }; > > > > +/** > > + * fdisk_label_change: > > + * @cxt: fdisk context > > + * @name: new label name > > + * > > + * Updates the disk label type to the one specified by @name. > > + * > > + * Returns 0 on success, otherwise, a corresponding error. > > + */ > > +int fdisk_label_change(struct fdisk_context *cxt, const char *name) > > +{ > > + int i; > > + > > + if (!cxt || !cxt->label || !name) > > + return FDISK_ERROR_UNKNOWN; > > + > > + /* not really changing the label */ > > + if (!strncmp(name, cxt->label->name, strlen(name))) > > + goto done; > > + > > + for (i = 0; i < ARRAY_SIZE(labels); i++) { > > + if (strncmp(name, labels[i]->name, strlen(name))) > > + continue; > > + > > + /* found the new label */ > > + memset(cxt->label, 0, sizeof(struct fdisk_label)); > > + memcpy(cxt->label, labels[i], sizeof(struct fdisk_label)); > > + DBG(LABEL, dbgprint("changing to a %s label\n", labels[i]->name)); > > + goto done; > > + } > > + > > + /* couldn't find the requested label type */ > > + return FDISK_ERROR_NOLABEL; > > +done: > > + return 0; > > +} > > + > > static int __probe_labels(struct fdisk_context *cxt) > > { > > int i, rc = 0; > > -- > > 1.7.4.1 > > > > > > > > > > -- > > To unsubscribe from this list: send the line "unsubscribe util-linux" in > > the body of a message to majordomo@vger.kernel.org > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > Petr > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-24 10:41 ` Davidlohr Bueso @ 2012-07-24 10:52 ` Petr Uzel 0 siblings, 0 replies; 11+ messages in thread From: Petr Uzel @ 2012-07-24 10:52 UTC (permalink / raw) To: Davidlohr Bueso; +Cc: util-linux [-- Attachment #1: Type: text/plain, Size: 5640 bytes --] On Tue, Jul 24, 2012 at 12:41:50PM +0200, Davidlohr Bueso wrote: > On Tue, 2012-07-24 at 11:52 +0200, Petr Uzel wrote: > > On Sun, Jul 22, 2012 at 07:05:04PM +0200, Davidlohr Bueso wrote: > > > From: Davidlohr Bueso <dave@gnu.org> > > > > > > A new fdisk_label_change() function is added for situations when the disk label is > > > changed (ie: creating a new sun label). This function only updates the label pointer > > > in the context to use the newly specified label type. > > > > Why can't we just call __probe_labels() after creating new label, e.g. > > in soon-to-be introduced fdisk_label_create()? > > Because this way we give users extra functionality in the API. There > should be a way of changing label types on the fly, and since we don't > export __probe_labels(), this is the other option. What operation could change label type besides creating a new label? > > Thanks, > Davidlohr > > > > > > > > > Signed-off-by: Davidlohr Bueso <dave@gnu.org> > > > --- > > > fdisks/fdisk.h | 2 ++ > > > fdisks/fdiskdoslabel.c | 1 + > > > fdisks/fdisksgilabel.c | 2 ++ > > > fdisks/fdisksunlabel.c | 1 + > > > fdisks/utils.c | 37 +++++++++++++++++++++++++++++++++++++ > > > 5 files changed, 43 insertions(+), 0 deletions(-) > > > > > > diff --git a/fdisks/fdisk.h b/fdisks/fdisk.h > > > index d716824..d7e85f5 100644 > > > --- a/fdisks/fdisk.h > > > +++ b/fdisks/fdisk.h > > > @@ -104,6 +104,7 @@ enum fdisk_error { > > > FDISK_ERROR_WRITE, > > > FDISK_ERROR_IOCTL, > > > FDISK_ERROR_PROBE, > > > + FDISK_ERROR_NOLABEL, > > > FDISK_ERROR_UNKNOWN > > > }; > > > > > > @@ -164,6 +165,7 @@ extern void fdisk_mbr_zeroize(struct fdisk_context *cxt); > > > extern void fdisk_geom_set_cyls(struct fdisk_context *cxt); > > > extern const char *fdisk_error_name(enum fdisk_error errcode); > > > extern void fdisk_error_fatal(struct fdisk_context *cxt, enum fdisk_error errcode); > > > +extern int fdisk_label_change(struct fdisk_context *cxt, const char *name); > > > > > > /* prototypes for fdisk.c */ > > > extern char *disk_device, *line_ptr; > > > diff --git a/fdisks/fdiskdoslabel.c b/fdisks/fdiskdoslabel.c > > > index 535afdc..9b9b23a 100644 > > > --- a/fdisks/fdiskdoslabel.c > > > +++ b/fdisks/fdiskdoslabel.c > > > @@ -230,6 +230,7 @@ void create_doslabel(struct fdisk_context *cxt) > > > > > > dos_init(cxt); > > > fdisk_mbr_zeroize(cxt); > > > + fdisk_label_change(cxt, "dos"); > > > set_all_unchanged(); > > > set_changed(0); > > > > > > diff --git a/fdisks/fdisksgilabel.c b/fdisks/fdisksgilabel.c > > > index e38d98f..6001038 100644 > > > --- a/fdisks/fdisksgilabel.c > > > +++ b/fdisks/fdisksgilabel.c > > > @@ -780,6 +780,8 @@ create_sgilabel(struct fdisk_context *cxt) > > > } > > > > > > fdisk_mbr_zeroize(cxt); > > > + fdisk_label_change(cxt, "sgi"); > > > + > > > sgilabel->magic = SSWAP32(SGI_LABEL_MAGIC); > > > sgilabel->boot_part = SSWAP16(0); > > > sgilabel->swap_part = SSWAP16(1); > > > diff --git a/fdisks/fdisksunlabel.c b/fdisks/fdisksunlabel.c > > > index 4123806..b63335c 100644 > > > --- a/fdisks/fdisksunlabel.c > > > +++ b/fdisks/fdisksunlabel.c > > > @@ -161,6 +161,7 @@ void create_sunlabel(struct fdisk_context *cxt) > > > > > > init(); > > > fdisk_mbr_zeroize(cxt); > > > + fdisk_label_change(cxt, "sun"); > > > > > > sunlabel->magic = SSWAP16(SUN_LABEL_MAGIC); > > > sunlabel->sanity = SSWAP32(SUN_LABEL_SANE); > > > diff --git a/fdisks/utils.c b/fdisks/utils.c > > > index cf9484c..48dedfb 100644 > > > --- a/fdisks/utils.c > > > +++ b/fdisks/utils.c > > > @@ -44,6 +44,43 @@ static const struct fdisk_label *labels[] = > > > &mac_label, > > > }; > > > > > > +/** > > > + * fdisk_label_change: > > > + * @cxt: fdisk context > > > + * @name: new label name > > > + * > > > + * Updates the disk label type to the one specified by @name. > > > + * > > > + * Returns 0 on success, otherwise, a corresponding error. > > > + */ > > > +int fdisk_label_change(struct fdisk_context *cxt, const char *name) > > > +{ > > > + int i; > > > + > > > + if (!cxt || !cxt->label || !name) > > > + return FDISK_ERROR_UNKNOWN; > > > + > > > + /* not really changing the label */ > > > + if (!strncmp(name, cxt->label->name, strlen(name))) > > > + goto done; > > > + > > > + for (i = 0; i < ARRAY_SIZE(labels); i++) { > > > + if (strncmp(name, labels[i]->name, strlen(name))) > > > + continue; > > > + > > > + /* found the new label */ > > > + memset(cxt->label, 0, sizeof(struct fdisk_label)); > > > + memcpy(cxt->label, labels[i], sizeof(struct fdisk_label)); > > > + DBG(LABEL, dbgprint("changing to a %s label\n", labels[i]->name)); > > > + goto done; > > > + } > > > + > > > + /* couldn't find the requested label type */ > > > + return FDISK_ERROR_NOLABEL; > > > +done: > > > + return 0; > > > +} > > > + > > > static int __probe_labels(struct fdisk_context *cxt) > > > { > > > int i, rc = 0; > > > -- > > > 1.7.4.1 > > > > > > > > > > > > > > > -- > > > To unsubscribe from this list: send the line "unsubscribe util-linux" in > > > the body of a message to majordomo@vger.kernel.org > > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > > Petr > > > > > -- > To unsubscribe from this list: send the line "unsubscribe util-linux" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html Petr -- Petr Uzel IRC: ptr_uzl @ freenode [-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --] ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 03/10] fdisk: API: add fdisk_label_change 2012-07-22 17:05 [PATCH 03/10] fdisk: API: add fdisk_label_change Davidlohr Bueso 2012-07-24 9:47 ` Bernhard Voelker 2012-07-24 9:52 ` Petr Uzel @ 2012-07-24 11:35 ` Karel Zak 2 siblings, 0 replies; 11+ messages in thread From: Karel Zak @ 2012-07-24 11:35 UTC (permalink / raw) To: Davidlohr Bueso; +Cc: Petr Uzel, util-linux On Sun, Jul 22, 2012 at 07:05:04PM +0200, Davidlohr Bueso wrote: > 5 files changed, 43 insertions(+), 0 deletions(-) Not applied, it seems unnecessary. I have temporary added fdisk_create_default_disklabel, but the final code (the current master) contains your fdisk_create_disklabel() where NULL name means a default disk label. I have renamed many functions :-) It seems better to use fdisk_create_disklabel() than fdisk_label_create() fdisk_add_partition() than fdisk_label_partition_new() .. etc. > + /* not really changing the label */ > + if (!strncmp(name, cxt->label->name, strlen(name))) > + goto done; BTW, I don't see a problem with strings -- very probably we will use strings in user interface, and add extra layer to translate strings to IDs seems like unnecessary optimization and complexity. > + for (i = 0; i < ARRAY_SIZE(labels); i++) { > + if (strncmp(name, labels[i]->name, strlen(name))) > + continue; > + > + /* found the new label */ > + memset(cxt->label, 0, sizeof(struct fdisk_label)); > + memcpy(cxt->label, labels[i], sizeof(struct fdisk_label)); > + DBG(LABEL, dbgprint("changing to a %s label\n", labels[i]->name)); > + goto done; > + } Oh no, let's use labels[] as constant array and cxt->label as const struct pointer. The list of functions does not have to be modifiable, and cxt->label = labels[i]; is definitely better than memcpy(). Note that it's will probably necessary to add void *labeldata; to fdisk_context for label private data. (For example to kill MBRbuffer_changed or another DOS specific global variables.) Karel -- Karel Zak <kzak@redhat.com> http://karelzak.blogspot.com ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2012-07-24 11:36 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-07-22 17:05 [PATCH 03/10] fdisk: API: add fdisk_label_change Davidlohr Bueso 2012-07-24 9:47 ` Bernhard Voelker 2012-07-24 9:56 ` Petr Uzel 2012-07-24 10:32 ` Bernhard Voelker 2012-07-24 10:39 ` Davidlohr Bueso 2012-07-24 10:42 ` Petr Uzel 2012-07-24 10:47 ` Bernhard Voelker 2012-07-24 9:52 ` Petr Uzel 2012-07-24 10:41 ` Davidlohr Bueso 2012-07-24 10:52 ` Petr Uzel 2012-07-24 11:35 ` Karel Zak
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).