geom_ccd.c (e620a1cbed83659da9ffb5141a053d1ee3a4b552) geom_ccd.c (b2dfb1f906d8c8e59539eef1c054963dab103cd5)
1/* $Id: ccd.c,v 1.35 1998/07/04 22:30:13 julian Exp $ */
1/* $Id: ccd.c,v 1.36 1998/08/19 10:50:32 sos Exp $ */
2
3/* $NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ */
4
5/*
6 * Copyright (c) 1995 Jason R. Thorpe.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without

--- 88 unchanged lines hidden (view full) ---

98#include <sys/malloc.h>
99#include <sys/namei.h>
100#include <sys/conf.h>
101#include <sys/stat.h>
102#include <sys/sysctl.h>
103#include <sys/disklabel.h>
104#include <ufs/ffs/fs.h>
105#include <sys/device.h>
2
3/* $NetBSD: ccd.c,v 1.22 1995/12/08 19:13:26 thorpej Exp $ */
4
5/*
6 * Copyright (c) 1995 Jason R. Thorpe.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without

--- 88 unchanged lines hidden (view full) ---

98#include <sys/malloc.h>
99#include <sys/namei.h>
100#include <sys/conf.h>
101#include <sys/stat.h>
102#include <sys/sysctl.h>
103#include <sys/disklabel.h>
104#include <ufs/ffs/fs.h>
105#include <sys/device.h>
106#include <sys/devicestat.h>
106#undef KERNEL /* XXX */
107#include <sys/disk.h>
108#define KERNEL
109#include <sys/fcntl.h>
110#include <sys/vnode.h>
111
112#include <sys/ccdvar.h>
113

--- 173 unchanged lines hidden (view full) ---

287 char tmppath[MAXPATHLEN];
288 int error;
289
290#ifdef DEBUG
291 if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
292 printf("ccdinit: unit %d\n", ccd->ccd_unit);
293#endif
294
107#undef KERNEL /* XXX */
108#include <sys/disk.h>
109#define KERNEL
110#include <sys/fcntl.h>
111#include <sys/vnode.h>
112
113#include <sys/ccdvar.h>
114

--- 173 unchanged lines hidden (view full) ---

288 char tmppath[MAXPATHLEN];
289 int error;
290
291#ifdef DEBUG
292 if (ccddebug & (CCDB_FOLLOW|CCDB_INIT))
293 printf("ccdinit: unit %d\n", ccd->ccd_unit);
294#endif
295
295#ifdef WORKING_DISK_STATISTICS /* XXX !! */
296 cs->sc_dk = ccd->ccd_dk;
297#endif
298 cs->sc_size = 0;
299 cs->sc_ileave = ccd->ccd_interleave;
300 cs->sc_nccdisks = ccd->ccd_ndev;
301
302 /* Allocate space for the component info. */
303 cs->sc_cinfo = malloc(cs->sc_nccdisks * sizeof(struct ccdcinfo),
304 M_DEVBUF, M_WAITOK);
305

--- 170 unchanged lines hidden (view full) ---

476 * Create pseudo-geometry based on 1MB cylinders. It's
477 * pretty close.
478 */
479 ccg->ccg_secsize = maxsecsize;
480 ccg->ccg_ntracks = 1;
481 ccg->ccg_nsectors = 1024 * (1024 / ccg->ccg_secsize);
482 ccg->ccg_ncylinders = cs->sc_size / ccg->ccg_nsectors;
483
296 cs->sc_size = 0;
297 cs->sc_ileave = ccd->ccd_interleave;
298 cs->sc_nccdisks = ccd->ccd_ndev;
299
300 /* Allocate space for the component info. */
301 cs->sc_cinfo = malloc(cs->sc_nccdisks * sizeof(struct ccdcinfo),
302 M_DEVBUF, M_WAITOK);
303

--- 170 unchanged lines hidden (view full) ---

474 * Create pseudo-geometry based on 1MB cylinders. It's
475 * pretty close.
476 */
477 ccg->ccg_secsize = maxsecsize;
478 ccg->ccg_ntracks = 1;
479 ccg->ccg_nsectors = 1024 * (1024 / ccg->ccg_secsize);
480 ccg->ccg_ncylinders = cs->sc_size / ccg->ccg_nsectors;
481
484#ifdef WORKING_DISK_STATISTICS /* XXX !! */
485 if (ccd->ccd_dk >= 0)
486 dk_wpms[ccd->ccd_dk] = 32 * (60 * DEV_BSIZE / 2); /* XXX */
487#endif
482 /*
483 * Add an devstat entry for this device.
484 */
485 devstat_add_entry(&cs->device_stats, "ccd", ccd->ccd_unit,
486 ccg->ccg_secsize, DEVSTAT_ALL_SUPPORTED,
487 DEVSTAT_TYPE_ASC0 |DEVSTAT_TYPE_IF_OTHER);
488
489 cs->sc_flags |= CCDF_INITED;
490 cs->sc_cflags = ccd->ccd_flags; /* So we can find out later... */
491 cs->sc_unit = ccd->ccd_unit;
492 return (0);
493}
494
495static void

--- 275 unchanged lines hidden (view full) ---

771 daddr_t bn;
772 struct partition *pp;
773
774#ifdef DEBUG
775 if (ccddebug & CCDB_FOLLOW)
776 printf("ccdstart(%x, %x)\n", cs, bp);
777#endif
778
488
489 cs->sc_flags |= CCDF_INITED;
490 cs->sc_cflags = ccd->ccd_flags; /* So we can find out later... */
491 cs->sc_unit = ccd->ccd_unit;
492 return (0);
493}
494
495static void

--- 275 unchanged lines hidden (view full) ---

771 daddr_t bn;
772 struct partition *pp;
773
774#ifdef DEBUG
775 if (ccddebug & CCDB_FOLLOW)
776 printf("ccdstart(%x, %x)\n", cs, bp);
777#endif
778
779#ifdef WORKING_DISK_STATISTICS /* XXX !! */
780 /*
781 * Instrumentation (not very meaningful)
782 */
783 cs->sc_nactive++;
784 if (cs->sc_dk >= 0) {
785 dk_busy |= 1 << cs->sc_dk;
786 dk_xfer[cs->sc_dk]++;
787 dk_wds[cs->sc_dk] += bp->b_bcount >> 6;
788 }
789#endif
779 /* Record the transaction start */
780 devstat_start_transaction(&cs->device_stats);
790
791 /*
792 * Translate the partition-relative block number to an absolute.
793 */
794 bn = bp->b_blkno;
795 if (ccdpart(bp->b_dev) != RAW_PART) {
796 pp = &cs->sc_dkdev.dk_label.d_partitions[ccdpart(bp->b_dev)];
797 bn += pp->p_offset;

--- 106 unchanged lines hidden (view full) ---

904 cbp->cb_buf.b_iodone = (void (*)(struct buf *))ccdiodone;
905 cbp->cb_buf.b_proc = bp->b_proc;
906 cbp->cb_buf.b_dev = ci->ci_dev; /* XXX */
907 cbp->cb_buf.b_blkno = cbn + cboff + CCD_OFFSET;
908 cbp->cb_buf.b_offset = dbtob(cbn + cboff + CCD_OFFSET);
909 cbp->cb_buf.b_data = addr;
910 cbp->cb_buf.b_vp = ci->ci_vp;
911 LIST_INIT(&cbp->cb_buf.b_dep);
781
782 /*
783 * Translate the partition-relative block number to an absolute.
784 */
785 bn = bp->b_blkno;
786 if (ccdpart(bp->b_dev) != RAW_PART) {
787 pp = &cs->sc_dkdev.dk_label.d_partitions[ccdpart(bp->b_dev)];
788 bn += pp->p_offset;

--- 106 unchanged lines hidden (view full) ---

895 cbp->cb_buf.b_iodone = (void (*)(struct buf *))ccdiodone;
896 cbp->cb_buf.b_proc = bp->b_proc;
897 cbp->cb_buf.b_dev = ci->ci_dev; /* XXX */
898 cbp->cb_buf.b_blkno = cbn + cboff + CCD_OFFSET;
899 cbp->cb_buf.b_offset = dbtob(cbn + cboff + CCD_OFFSET);
900 cbp->cb_buf.b_data = addr;
901 cbp->cb_buf.b_vp = ci->ci_vp;
902 LIST_INIT(&cbp->cb_buf.b_dep);
903 cbp->cb_buf.b_resid = 0;
912 if (cs->sc_ileave == 0)
913 cbp->cb_buf.b_bcount = dbtob(ci->ci_size - cbn);
914 else
915 cbp->cb_buf.b_bcount = dbtob(cs->sc_ileave - cboff);
916 if (cbp->cb_buf.b_bcount > bcount)
917 cbp->cb_buf.b_bcount = bcount;
918
919 cbp->cb_buf.b_bufsize = cbp->cb_buf.b_bcount;

--- 38 unchanged lines hidden (view full) ---

958{
959#ifdef DEBUG
960 if (ccddebug & CCDB_FOLLOW)
961 printf("ccdintr(%x, %x)\n", cs, bp);
962#endif
963 /*
964 * Request is done for better or worse, wakeup the top half.
965 */
904 if (cs->sc_ileave == 0)
905 cbp->cb_buf.b_bcount = dbtob(ci->ci_size - cbn);
906 else
907 cbp->cb_buf.b_bcount = dbtob(cs->sc_ileave - cboff);
908 if (cbp->cb_buf.b_bcount > bcount)
909 cbp->cb_buf.b_bcount = bcount;
910
911 cbp->cb_buf.b_bufsize = cbp->cb_buf.b_bcount;

--- 38 unchanged lines hidden (view full) ---

950{
951#ifdef DEBUG
952 if (ccddebug & CCDB_FOLLOW)
953 printf("ccdintr(%x, %x)\n", cs, bp);
954#endif
955 /*
956 * Request is done for better or worse, wakeup the top half.
957 */
966#ifdef WORKING_DISK_STATISTICS /* XXX !! */
967 --cs->sc_nactive;
968#ifdef DIAGNOSTIC
969 if (cs->sc_nactive < 0)
970 panic("ccdintr: ccd%d: sc_nactive < 0", cs->sc_unit);
971#endif
958 /* Record device statistics */
959 devstat_end_transaction(&cs->device_stats,
960 bp->b_bcount - bp->b_resid,
961 (bp->b_flags & B_ORDERED) ?
962 DEVSTAT_TAG_ORDERED : DEVSTAT_TAG_SIMPLE,
963 (bp->b_flags & B_READ) ? DEVSTAT_READ :
964 DEVSTAT_WRITE);
972
965
973 if (cs->sc_nactive == 0 && cs->sc_dk >= 0)
974 dk_busy &= ~(1 << cs->sc_dk);
975#endif
976 if (bp->b_flags & B_ERROR)
977 bp->b_resid = bp->b_bcount;
978 biodone(bp);
979}
980
981/*
982 * Called at interrupt time.
983 * Mark the component as done and if all components are done,

--- 66 unchanged lines hidden (view full) ---

1050 int unit = ccdunit(dev);
1051 int i, j, lookedup = 0, error = 0;
1052 int part, pmask, s;
1053 struct ccd_softc *cs;
1054 struct ccd_ioctl *ccio = (struct ccd_ioctl *)data;
1055 struct ccddevice ccd;
1056 char **cpp;
1057 struct vnode **vpp;
966 if (bp->b_flags & B_ERROR)
967 bp->b_resid = bp->b_bcount;
968 biodone(bp);
969}
970
971/*
972 * Called at interrupt time.
973 * Mark the component as done and if all components are done,

--- 66 unchanged lines hidden (view full) ---

1040 int unit = ccdunit(dev);
1041 int i, j, lookedup = 0, error = 0;
1042 int part, pmask, s;
1043 struct ccd_softc *cs;
1044 struct ccd_ioctl *ccio = (struct ccd_ioctl *)data;
1045 struct ccddevice ccd;
1046 char **cpp;
1047 struct vnode **vpp;
1058#ifdef WORKING_DISK_STATISTICS /* XXX !! */
1059 extern int dkn;
1060#endif
1061
1062 if (unit >= numccd)
1063 return (ENXIO);
1064 cs = &ccd_softc[unit];
1065
1066 bzero(&ccd, sizeof(ccd));
1067
1068 switch (cmd) {

--- 69 unchanged lines hidden (view full) ---

1138 return (error);
1139 }
1140 ++lookedup;
1141 }
1142 ccd.ccd_cpp = cpp;
1143 ccd.ccd_vpp = vpp;
1144 ccd.ccd_ndev = ccio->ccio_ndisks;
1145
1048
1049 if (unit >= numccd)
1050 return (ENXIO);
1051 cs = &ccd_softc[unit];
1052
1053 bzero(&ccd, sizeof(ccd));
1054
1055 switch (cmd) {

--- 69 unchanged lines hidden (view full) ---

1125 return (error);
1126 }
1127 ++lookedup;
1128 }
1129 ccd.ccd_cpp = cpp;
1130 ccd.ccd_vpp = vpp;
1131 ccd.ccd_ndev = ccio->ccio_ndisks;
1132
1146#ifdef WORKING_DISK_STATISTICS /* XXX !! */
1147 /*
1133 /*
1148 * Assign disk index first so that init routine
1149 * can use it (saves having the driver drag around
1150 * the ccddevice pointer just to set up the dk_*
1151 * info in the open routine).
1152 */
1153 if (dkn < DK_NDRIVE)
1154 ccd.ccd_dk = dkn++;
1155 else
1156 ccd.ccd_dk = -1;
1157#endif
1158
1159 /*
1160 * Initialize the ccd. Fills in the softc for us.
1161 */
1162 if (error = ccdinit(&ccd, cpp, p)) {
1134 * Initialize the ccd. Fills in the softc for us.
1135 */
1136 if (error = ccdinit(&ccd, cpp, p)) {
1163#ifdef WORKING_DISK_STATISTICS /* XXX !! */
1164 if (ccd.ccd_dk >= 0)
1165 --dkn;
1166#endif
1167 for (j = 0; j < lookedup; ++j)
1168 (void)vn_close(vpp[j], FREAD|FWRITE,
1169 p->p_ucred, p);
1170 bzero(&ccd_softc[unit], sizeof(struct ccd_softc));
1171 free(vpp, M_DEVBUF);
1172 free(cpp, M_DEVBUF);
1173 ccdunlock(cs);
1174 return (error);

--- 383 unchanged lines hidden ---
1137 for (j = 0; j < lookedup; ++j)
1138 (void)vn_close(vpp[j], FREAD|FWRITE,
1139 p->p_ucred, p);
1140 bzero(&ccd_softc[unit], sizeof(struct ccd_softc));
1141 free(vpp, M_DEVBUF);
1142 free(cpp, M_DEVBUF);
1143 ccdunlock(cs);
1144 return (error);

--- 383 unchanged lines hidden ---