diff options
author | jh <jh@FreeBSD.org> | 2010-08-27 11:08:11 +0000 |
---|---|---|
committer | jh <jh@FreeBSD.org> | 2010-08-27 11:08:11 +0000 |
commit | b83dbc103837ee7970d861f4a706f7eca5b921c8 (patch) | |
tree | 9e6002e33ffcd90ef9f362be5ced518a82f01041 /sbin/bsdlabel | |
parent | a2e990f16810ffe11477daf9ef5446ca2e736212 (diff) | |
download | FreeBSD-src-b83dbc103837ee7970d861f4a706f7eca5b921c8.zip FreeBSD-src-b83dbc103837ee7970d861f4a706f7eca5b921c8.tar.gz |
Don't attempt to write label with GEOM_BSD based method if the class is
not available. This improves error reporting when bsdlabel(8) is unable
to open a device for writing. If GEOM_BSD was unavailable, only a rather
obscure error message "Class not found" was printed.
PR: bin/58390
Reviewed by: ae
Discussed with: marcel
MFC after: 1 month
Diffstat (limited to 'sbin/bsdlabel')
-rw-r--r-- | sbin/bsdlabel/bsdlabel.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/sbin/bsdlabel/bsdlabel.c b/sbin/bsdlabel/bsdlabel.c index fb1d8b0..b671821 100644 --- a/sbin/bsdlabel/bsdlabel.c +++ b/sbin/bsdlabel/bsdlabel.c @@ -80,6 +80,7 @@ __FBSDID("$FreeBSD$"); #include "pathnames.h" static void makelabel(const char *, struct disklabel *); +static int geom_bsd_available(void); static int writelabel(void); static int readlabel(int flag); static void display(FILE *, const struct disklabel *); @@ -379,10 +380,33 @@ readboot(void) } static int +geom_bsd_available(void) +{ + struct gclass *class; + struct gmesh mesh; + int error; + + error = geom_gettree(&mesh); + if (error != 0) + errc(1, error, "Cannot get GEOM tree"); + + LIST_FOREACH(class, &mesh.lg_class, lg_class) { + if (strcmp(class->lg_name, "BSD") == 0) { + geom_deletetree(&mesh); + return (1); + } + } + + geom_deletetree(&mesh); + + return (0); +} + +static int writelabel(void) { uint64_t *p, sum; - int i, fd; + int i, fd, serrno; struct gctl_req *grq; char const *errstr; struct disklabel *lp = &lab; @@ -416,6 +440,13 @@ writelabel(void) if (is_file) { warn("cannot open file %s for writing label", specname); return(1); + } else + serrno = errno; + + /* Give up if GEOM_BSD is not available. */ + if (geom_bsd_available() == 0) { + warnc(serrno, "%s", specname); + return (1); } grq = gctl_get_handle(); |