summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_diskslice.c
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1998-07-30 15:16:06 +0000
committerbde <bde@FreeBSD.org>1998-07-30 15:16:06 +0000
commit2c362dc181b2013d9ce19d506a6fd532076fb722 (patch)
treec2df5b29bba20de2b98999f17767275415afeaf5 /sys/kern/subr_diskslice.c
parent524b03458c184ad22eb4f862e1bfbb8c7729c0f4 (diff)
downloadFreeBSD-src-2c362dc181b2013d9ce19d506a6fd532076fb722.zip
FreeBSD-src-2c362dc181b2013d9ce19d506a6fd532076fb722.tar.gz
Added a flags arg to dsopen() and updated drivers. The DSO_ONESLICE
and DSO_NOLABELS flags prevent searching for slices and labels respectively. Current drivers don't set these flags. When DSO_NOLABELS is set, the in-core label for the whole disk is cloned to create an in-core label for each slice. This gives the correct result (a good in-core label for the compatibility slice) if DSO_ONESLICE is set or only one slice is found, but usually gives broken labels otherwise, so DSO_ONESLICE should be set if DSO_NOLABELS is set.
Diffstat (limited to 'sys/kern/subr_diskslice.c')
-rw-r--r--sys/kern/subr_diskslice.c38
1 files changed, 24 insertions, 14 deletions
diff --git a/sys/kern/subr_diskslice.c b/sys/kern/subr_diskslice.c
index 0b2e13d..644f136 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.54 1998/07/29 08:24:23 bde Exp $
+ * $Id: subr_diskslice.c,v 1.55 1998/07/29 11:15:48 bde Exp $
*/
#include "opt_devfs.h"
@@ -507,8 +507,8 @@ dsioctl(dname, dev, cmd, data, flags, sspp, strat, setgeom)
error = dsopen(dname, dev,
ssp->dss_slices[WHOLE_DISK_SLICE].ds_copenmask
& (1 << RAW_PART) ? S_IFCHR : S_IFBLK,
- sspp, lp, strat, setgeom, ssp->dss_bdevsw,
- ssp->dss_cdevsw);
+ ssp->dss_oflags, sspp, lp, strat, setgeom,
+ ssp->dss_bdevsw, ssp->dss_cdevsw);
if (error != 0) {
free(lp, M_DEVBUF);
*sspp = ssp;
@@ -528,8 +528,9 @@ dsioctl(dname, dev, cmd, data, flags, sspp, strat, setgeom)
error = dsopen(dname,
dkmodslice(dkmodpart(dev, part),
slice),
- S_IFBLK, sspp, lp, strat,
- setgeom, ssp->dss_bdevsw,
+ S_IFBLK, ssp->dss_oflags, sspp,
+ lp, strat, setgeom,
+ ssp->dss_bdevsw,
ssp->dss_cdevsw);
if (error != 0) {
/* XXX should free devfs toks. */
@@ -546,8 +547,9 @@ dsioctl(dname, dev, cmd, data, flags, sspp, strat, setgeom)
error = dsopen(dname,
dkmodslice(dkmodpart(dev, part),
slice),
- S_IFCHR, sspp, lp, strat,
- setgeom, ssp->dss_bdevsw,
+ S_IFCHR, ssp->dss_oflags, sspp,
+ lp, strat, setgeom,
+ ssp->dss_bdevsw,
ssp->dss_cdevsw);
if (error != 0) {
/* XXX should free devfs toks. */
@@ -652,6 +654,7 @@ dsmakeslicestruct(nslices, lp)
ssp->dss_cdevsw = NULL;
ssp->dss_first_bsd_slice = COMPATIBILITY_SLICE;
ssp->dss_nslices = nslices;
+ ssp->dss_oflags = 0;
ssp->dss_secmult = lp->d_secsize / DEV_BSIZE;
if (ssp->dss_secmult & (ssp->dss_secmult - 1))
ssp->dss_secshift = -1;
@@ -693,10 +696,11 @@ dsname(dname, unit, slice, part, partname)
* strategy routine must be special to allow activity.
*/
int
-dsopen(dname, dev, mode, sspp, lp, strat, setgeom, bdevsw, cdevsw)
+dsopen(dname, dev, mode, flags, sspp, lp, strat, setgeom, bdevsw, cdevsw)
char *dname;
dev_t dev;
int mode;
+ u_int flags;
struct diskslices **sspp;
struct disklabel *lp;
d_strategy_t *strat;
@@ -741,13 +745,16 @@ dsopen(dname, dev, mode, sspp, lp, strat, setgeom, bdevsw, cdevsw)
*/
*sspp = dsmakeslicestruct(BASE_SLICE, lp);
- TRACE(("dsinit\n"));
- error = dsinit(dname, dev, strat, lp, sspp);
- if (error != 0) {
- dsgone(sspp);
- return (error);
+ if (!(flags & DSO_ONESLICE)) {
+ TRACE(("dsinit\n"));
+ error = dsinit(dname, dev, strat, lp, sspp);
+ if (error != 0) {
+ dsgone(sspp);
+ return (error);
+ }
}
ssp = *sspp;
+ ssp->dss_oflags = flags;
#ifdef DEVFS
ssp->dss_bdevsw = bdevsw;
ssp->dss_cdevsw = cdevsw;
@@ -820,7 +827,10 @@ dsopen(dname, dev, mode, sspp, lp, strat, setgeom, bdevsw, cdevsw)
set_ds_wlabel(ssp, slice, TRUE); /* XXX invert */
lp1 = clone_label(lp);
TRACE(("readdisklabel\n"));
- msg = readdisklabel(dev1, strat, lp1);
+ if (flags & DSO_NOLABELS)
+ msg = NULL;
+ else
+ msg = readdisklabel(dev1, strat, lp1);
#if 0 /* XXX */
if (msg == NULL && setgeom != NULL && setgeom(lp1) != 0)
msg = "setgeom failed";
OpenPOWER on IntegriCloud