summaryrefslogtreecommitdiffstats
path: root/sbin/bsdlabel/bsdlabel.c
diff options
context:
space:
mode:
authorjh <jh@FreeBSD.org>2010-08-27 11:08:11 +0000
committerjh <jh@FreeBSD.org>2010-08-27 11:08:11 +0000
commitb83dbc103837ee7970d861f4a706f7eca5b921c8 (patch)
tree9e6002e33ffcd90ef9f362be5ced518a82f01041 /sbin/bsdlabel/bsdlabel.c
parenta2e990f16810ffe11477daf9ef5446ca2e736212 (diff)
downloadFreeBSD-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/bsdlabel.c')
-rw-r--r--sbin/bsdlabel/bsdlabel.c33
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();
OpenPOWER on IntegriCloud