summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Evans <bde@FreeBSD.org>1996-04-19 19:22:29 +0000
committerBruce Evans <bde@FreeBSD.org>1996-04-19 19:22:29 +0000
commit3f6456427801e44f8c7c7cfab450718c759faa51 (patch)
tree959f37cc9ce2d775f5499d5afe347e6ec4a1e9f9
parente0150c8ff774c3e217c636046b73c7b8559150a1 (diff)
Notes
-rw-r--r--sys/kern/subr_diskslice.c65
1 files changed, 55 insertions, 10 deletions
diff --git a/sys/kern/subr_diskslice.c b/sys/kern/subr_diskslice.c
index 2ee0e9a3e1fd..16af2b6b8dc7 100644
--- a/sys/kern/subr_diskslice.c
+++ b/sys/kern/subr_diskslice.c
@@ -43,7 +43,7 @@
* from: wd.c,v 1.55 1994/10/22 01:57:12 phk Exp $
* from: @(#)ufs_disksubr.c 7.16 (Berkeley) 5/4/91
* from: ufs_disksubr.c,v 1.8 1994/06/07 01:21:39 phk Exp $
- * $Id: subr_diskslice.c,v 1.23 1996/04/05 19:12:01 scrappy Exp $
+ * $Id: subr_diskslice.c,v 1.24 1996/04/07 14:32:14 bde Exp $
*/
#include <sys/param.h>
@@ -73,7 +73,10 @@ static volatile bool_t ds_debug;
static void dsiodone __P((struct buf *bp));
static char *fixlabel __P((char *sname, struct diskslice *sp,
struct disklabel *lp, int writeflag));
-static void free_label __P((struct diskslices *ssp, int slice));
+static void free_ds_label __P((struct diskslices *ssp, int slice));
+#ifdef DEVFS
+static void free_ds_labeldevs __P((struct diskslices *ssp, int slice));
+#endif
static void partition_info __P((char *sname, int part, struct partition *pp));
static void slice_info __P((char *sname, struct diskslice *sp));
static void set_ds_bad __P((struct diskslices *ssp, int slice,
@@ -83,6 +86,8 @@ static void set_ds_label __P((struct diskslices *ssp, int slice,
#ifdef DEVFS
static void set_ds_labeldevs __P((char *dname, dev_t dev,
struct diskslices *ssp));
+static void set_ds_labeldevs_unaliased __P((char *dname, dev_t dev,
+ struct diskslices *ssp));
#endif
static void set_ds_wlabel __P((struct diskslices *ssp, int slice,
int wlabel));
@@ -277,7 +282,7 @@ dsgone(sspp)
if (sp->ds_cdev != NULL)
devfs_remove_dev(sp->ds_cdev);
#endif
- free_label(ssp, slice);
+ free_ds_label(ssp, slice);
}
free(ssp, M_DEVBUF);
*sspp = NULL;
@@ -373,7 +378,7 @@ dsioctl(dname, dev, cmd, data, flags, sspp, strat, setgeom)
free(lp, M_DEVBUF);
return (error);
}
- free_label(ssp, slice);
+ free_ds_label(ssp, slice);
set_ds_label(ssp, slice, lp);
#ifdef DEVFS
set_ds_labeldevs(dname, dev, ssp);
@@ -766,7 +771,7 @@ dssize(dev, sspp, dopen, dclose)
}
static void
-free_label(ssp, slice)
+free_ds_label(ssp, slice)
struct diskslices *ssp;
int slice;
{
@@ -775,10 +780,34 @@ free_label(ssp, slice)
struct diskslice *sp;
sp = &ssp->dss_slices[slice];
- if (sp->ds_label == NULL)
- return;
lp = sp->ds_label;
+ if (lp == NULL)
+ return;
#ifdef DEVFS
+ free_ds_labeldevs(ssp, slice);
+ if (slice == COMPATIBILITY_SLICE)
+ free_ds_labeldevs(ssp, ssp->dss_first_bsd_slice);
+ else if (slice == ssp->dss_first_bsd_slice)
+ free_ds_labeldevs(ssp, COMPATIBILITY_SLICE);
+#endif
+ free(lp, M_DEVBUF);
+ set_ds_label(ssp, slice, (struct disklabel *)NULL);
+}
+
+#ifdef DEVFS
+static void
+free_ds_labeldevs(ssp, slice)
+ struct diskslices *ssp;
+ int slice;
+{
+ struct disklabel *lp;
+ int part;
+ struct diskslice *sp;
+
+ sp = &ssp->dss_slices[slice];
+ lp = sp->ds_label;
+ if (lp == NULL)
+ return;
for (part = 0; part < lp->d_npartitions; part++) {
if (sp->ds_bdevs[part] != NULL) {
devfs_remove_dev(sp->ds_bdevs[part]);
@@ -789,10 +818,8 @@ free_label(ssp, slice)
sp->ds_cdevs[part] = NULL;
}
}
-#endif
- free(lp, M_DEVBUF);
- set_ds_label(ssp, slice, (struct disklabel *)NULL);
}
+#endif
static char *
fixlabel(sname, sp, lp, writeflag)
@@ -939,6 +966,24 @@ set_ds_labeldevs(dname, dev, ssp)
dev_t dev;
struct diskslices *ssp;
{
+ int slice;
+
+ set_ds_labeldevs_unaliased(dname, dev, ssp);
+ slice = dkslice(dev);
+ if (slice == COMPATIBILITY_SLICE)
+ set_ds_labeldevs_unaliased(dname,
+ dkmodslice(dev, ssp->dss_first_bsd_slice), ssp);
+ else if (slice == ssp->dss_first_bsd_slice)
+ set_ds_labeldevs_unaliased(dname,
+ dkmodslice(dev, COMPATIBILITY_SLICE), ssp);
+}
+
+static void
+set_ds_labeldevs_unaliased(dname, dev, ssp)
+ char *dname;
+ dev_t dev;
+ struct diskslices *ssp;
+{
struct disklabel *lp;
int mynor;
int part;