version 1.67.2.1, 2014/08/20 00:03:35 |
version 1.67.2.2, 2017/12/03 11:36:58 |
Line 65 __KERNEL_RCSID(0, "$NetBSD$"); |
|
Line 65 __KERNEL_RCSID(0, "$NetBSD$"); |
|
|
|
#include <dev/md.h> |
#include <dev/md.h> |
|
|
|
#include "ioconf.h" |
/* |
/* |
* The user-space functionality is included by default. |
* The user-space functionality is included by default. |
* Use `options MEMORY_DISK_SERVER=0' to turn it off. |
* Use `options MEMORY_DISK_SERVER=0' to turn it off. |
Line 93 struct md_softc { |
|
Line 94 struct md_softc { |
|
#define sc_size sc_md.md_size |
#define sc_size sc_md.md_size |
#define sc_type sc_md.md_type |
#define sc_type sc_md.md_type |
|
|
void mdattach(int); |
|
|
|
static void md_attach(device_t, device_t, void *); |
static void md_attach(device_t, device_t, void *); |
static int md_detach(device_t, int); |
static int md_detach(device_t, int); |
|
|
Line 132 const struct cdevsw md_cdevsw = { |
|
Line 131 const struct cdevsw md_cdevsw = { |
|
.d_flag = D_DISK |
.d_flag = D_DISK |
}; |
}; |
|
|
static struct dkdriver mddkdriver = { mdstrategy, NULL }; |
static struct dkdriver mddkdriver = { |
|
.d_strategy = mdstrategy |
|
}; |
|
|
extern struct cfdriver md_cd; |
|
CFATTACH_DECL3_NEW(md, sizeof(struct md_softc), |
CFATTACH_DECL3_NEW(md, sizeof(struct md_softc), |
0, md_attach, md_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); |
0, md_attach, md_detach, NULL, NULL, NULL, DVF_DETACH_SHUTDOWN); |
|
|
Line 413 mdstrategy(struct buf *bp) |
|
Line 413 mdstrategy(struct buf *bp) |
|
|
|
sc = device_lookup_private(&md_cd, MD_UNIT(bp->b_dev)); |
sc = device_lookup_private(&md_cd, MD_UNIT(bp->b_dev)); |
|
|
mutex_enter(&sc->sc_lock); |
|
|
|
if (sc == NULL || sc->sc_type == MD_UNCONFIGURED) { |
if (sc == NULL || sc->sc_type == MD_UNCONFIGURED) { |
bp->b_error = ENXIO; |
bp->b_error = ENXIO; |
goto done; |
goto done; |
} |
} |
|
|
|
mutex_enter(&sc->sc_lock); |
|
|
switch (sc->sc_type) { |
switch (sc->sc_type) { |
#if MEMORY_DISK_SERVER |
#if MEMORY_DISK_SERVER |
case MD_UMEM_SERVER: |
case MD_UMEM_SERVER: |
Line 462 mdstrategy(struct buf *bp) |
|
Line 462 mdstrategy(struct buf *bp) |
|
bp->b_error = EIO; |
bp->b_error = EIO; |
break; |
break; |
} |
} |
|
mutex_exit(&sc->sc_lock); |
|
|
done: |
done: |
mutex_exit(&sc->sc_lock); |
|
|
|
biodone(bp); |
biodone(bp); |
} |
} |
Line 474 mdioctl(dev_t dev, u_long cmd, void *dat |
|
Line 474 mdioctl(dev_t dev, u_long cmd, void *dat |
|
{ |
{ |
struct md_softc *sc; |
struct md_softc *sc; |
struct md_conf *umd; |
struct md_conf *umd; |
struct disklabel *lp; |
|
struct partinfo *pp; |
|
int error; |
int error; |
|
|
if ((sc = device_lookup_private(&md_cd, MD_UNIT(dev))) == NULL) |
if ((sc = device_lookup_private(&md_cd, MD_UNIT(dev))) == NULL) |
Line 483 mdioctl(dev_t dev, u_long cmd, void *dat |
|
Line 481 mdioctl(dev_t dev, u_long cmd, void *dat |
|
|
|
mutex_enter(&sc->sc_lock); |
mutex_enter(&sc->sc_lock); |
if (sc->sc_type != MD_UNCONFIGURED) { |
if (sc->sc_type != MD_UNCONFIGURED) { |
switch (cmd) { |
error = disk_ioctl(&sc->sc_dkdev, dev, cmd, data, flag, l); |
case DIOCGDINFO: |
if (error != EPASSTHROUGH) { |
lp = (struct disklabel *)data; |
|
*lp = *sc->sc_dkdev.dk_label; |
|
mutex_exit(&sc->sc_lock); |
|
return 0; |
|
|
|
case DIOCGPART: |
|
pp = (struct partinfo *)data; |
|
pp->disklab = sc->sc_dkdev.dk_label; |
|
pp->part = |
|
&sc->sc_dkdev.dk_label->d_partitions[DISKPART(dev)]; |
|
mutex_exit(&sc->sc_lock); |
mutex_exit(&sc->sc_lock); |
return 0; |
return 0; |
} |
} |
Line 539 mdioctl(dev_t dev, u_long cmd, void *dat |
|
Line 527 mdioctl(dev_t dev, u_long cmd, void *dat |
|
static void |
static void |
md_set_disklabel(struct md_softc *sc) |
md_set_disklabel(struct md_softc *sc) |
{ |
{ |
|
struct disk_geom *dg = &sc->sc_dkdev.dk_geom; |
struct disklabel *lp = sc->sc_dkdev.dk_label; |
struct disklabel *lp = sc->sc_dkdev.dk_label; |
struct partition *pp; |
struct partition *pp; |
|
|
Line 558 md_set_disklabel(struct md_softc *sc) |
|
Line 547 md_set_disklabel(struct md_softc *sc) |
|
lp->d_secpercyl = lp->d_ntracks*lp->d_nsectors; |
lp->d_secpercyl = lp->d_ntracks*lp->d_nsectors; |
|
|
strncpy(lp->d_typename, md_cd.cd_name, sizeof(lp->d_typename)); |
strncpy(lp->d_typename, md_cd.cd_name, sizeof(lp->d_typename)); |
lp->d_type = DTYPE_UNKNOWN; |
lp->d_type = DKTYPE_MD; |
strncpy(lp->d_packname, "fictitious", sizeof(lp->d_packname)); |
strncpy(lp->d_packname, "fictitious", sizeof(lp->d_packname)); |
lp->d_rpm = 3600; |
lp->d_rpm = 3600; |
lp->d_interleave = 1; |
lp->d_interleave = 1; |
Line 578 md_set_disklabel(struct md_softc *sc) |
|
Line 567 md_set_disklabel(struct md_softc *sc) |
|
lp->d_magic = DISKMAGIC; |
lp->d_magic = DISKMAGIC; |
lp->d_magic2 = DISKMAGIC; |
lp->d_magic2 = DISKMAGIC; |
lp->d_checksum = dkcksum(lp); |
lp->d_checksum = dkcksum(lp); |
|
|
|
memset(dg, 0, sizeof(*dg)); |
|
|
|
dg->dg_secsize = lp->d_secsize; |
|
dg->dg_secperunit = lp->d_secperunit; |
|
dg->dg_nsectors = lp->d_nsectors; |
|
dg->dg_ntracks = lp->d_ntracks = 64;; |
|
dg->dg_ncylinders = lp->d_ncylinders; |
|
|
|
disk_set_info(sc->sc_dev, &sc->sc_dkdev, NULL); |
} |
} |
|
|
/* |
/* |