md.c (58345) | md.c (59249) |
---|---|
1/* 2 * ---------------------------------------------------------------------------- 3 * "THE BEER-WARE LICENSE" (Revision 42): 4 * <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you 5 * can do whatever you want with this stuff. If we meet some day, and you think 6 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7 * ---------------------------------------------------------------------------- 8 * | 1/* 2 * ---------------------------------------------------------------------------- 3 * "THE BEER-WARE LICENSE" (Revision 42): 4 * <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you 5 * can do whatever you want with this stuff. If we meet some day, and you think 6 * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp 7 * ---------------------------------------------------------------------------- 8 * |
9 * $FreeBSD: head/sys/dev/md/md.c 58345 2000-03-20 10:44:49Z phk $ | 9 * $FreeBSD: head/sys/dev/md/md.c 59249 2000-04-15 05:54:02Z phk $ |
10 * 11 */ 12 13#include "opt_mfs.h" /* We have adopted some tasks from MFS */ 14#include "opt_md.h" /* We have adopted some tasks from MFS */ 15 16#include <sys/param.h> 17#include <sys/systm.h> --- 58 unchanged lines hidden (view full) --- 76 /* psize */ nopsize, 77 /* flags */ D_DISK | D_CANFREE | D_MEMDISK, 78 /* bmaj */ BDEV_MAJOR 79}; 80 81struct md_s { 82 int unit; 83 struct devstat stats; | 10 * 11 */ 12 13#include "opt_mfs.h" /* We have adopted some tasks from MFS */ 14#include "opt_md.h" /* We have adopted some tasks from MFS */ 15 16#include <sys/param.h> 17#include <sys/systm.h> --- 58 unchanged lines hidden (view full) --- 76 /* psize */ nopsize, 77 /* flags */ D_DISK | D_CANFREE | D_MEMDISK, 78 /* bmaj */ BDEV_MAJOR 79}; 80 81struct md_s { 82 int unit; 83 struct devstat stats; |
84 struct buf_queue_head buf_queue; | 84 struct bio_queue_head bio_queue; |
85 struct disk disk; 86 dev_t dev; 87 int busy; 88 enum {MD_MALLOC, MD_PRELOAD} type; 89 unsigned nsect; 90 struct cdevsw devsw; 91 92 /* MD_MALLOC related fields */ --- 37 unchanged lines hidden (view full) --- 130 if (md_debug) 131 printf("mdioctl(%s %lx %p %x %p)\n", 132 devtoname(dev), cmd, addr, flags, p); 133 134 return (ENOIOCTL); 135} 136 137static void | 85 struct disk disk; 86 dev_t dev; 87 int busy; 88 enum {MD_MALLOC, MD_PRELOAD} type; 89 unsigned nsect; 90 struct cdevsw devsw; 91 92 /* MD_MALLOC related fields */ --- 37 unchanged lines hidden (view full) --- 130 if (md_debug) 131 printf("mdioctl(%s %lx %p %x %p)\n", 132 devtoname(dev), cmd, addr, flags, p); 133 134 return (ENOIOCTL); 135} 136 137static void |
138mdstrategy(struct buf *bp) | 138mdstrategy(struct bio *bp) |
139{ 140 struct md_s *sc; 141 142 if (md_debug > 1) | 139{ 140 struct md_s *sc; 141 142 if (md_debug > 1) |
143 printf("mdstrategy(%p) %s %lx, %d, %ld, %p)\n", 144 bp, devtoname(bp->b_dev), bp->b_flags, bp->b_blkno, 145 bp->b_bcount / DEV_BSIZE, bp->b_data); | 143 printf("mdstrategy(%p) %s %x, %d, %ld, %p)\n", 144 bp, devtoname(bp->bio_dev), bp->bio_flags, bp->bio_blkno, 145 bp->bio_bcount / DEV_BSIZE, bp->bio_data); |
146 | 146 |
147 sc = bp->b_dev->si_drv1; | 147 sc = bp->bio_dev->si_drv1; |
148 if (sc->type == MD_MALLOC) { 149 mdstrategy_malloc(bp); 150 } else { 151 mdstrategy_preload(bp); 152 } 153 return; 154} 155 156 157static void | 148 if (sc->type == MD_MALLOC) { 149 mdstrategy_malloc(bp); 150 } else { 151 mdstrategy_preload(bp); 152 } 153 return; 154} 155 156 157static void |
158mdstrategy_malloc(struct buf *bp) | 158mdstrategy_malloc(struct bio *bp) |
159{ 160 int s, i; 161 struct md_s *sc; 162 devstat_trans_flags dop; 163 u_char *secp, **secpp, *dst; 164 unsigned secno, nsec, secval, uc; 165 166 if (md_debug > 1) | 159{ 160 int s, i; 161 struct md_s *sc; 162 devstat_trans_flags dop; 163 u_char *secp, **secpp, *dst; 164 unsigned secno, nsec, secval, uc; 165 166 if (md_debug > 1) |
167 printf("mdstrategy_malloc(%p) %s %lx, %d, %ld, %p)\n", 168 bp, devtoname(bp->b_dev), bp->b_flags, bp->b_blkno, 169 bp->b_bcount / DEV_BSIZE, bp->b_data); | 167 printf("mdstrategy_malloc(%p) %s %x, %d, %ld, %p)\n", 168 bp, devtoname(bp->bio_dev), bp->bio_flags, bp->bio_blkno, 169 bp->bio_bcount / DEV_BSIZE, bp->bio_data); |
170 | 170 |
171 sc = bp->b_dev->si_drv1; | 171 sc = bp->bio_dev->si_drv1; |
172 173 s = splbio(); 174 | 172 173 s = splbio(); 174 |
175 bufqdisksort(&sc->buf_queue, bp); | 175 bioqdisksort(&sc->bio_queue, bp); |
176 177 if (sc->busy) { 178 splx(s); 179 return; 180 } 181 182 sc->busy++; 183 184 while (1) { | 176 177 if (sc->busy) { 178 splx(s); 179 return; 180 } 181 182 sc->busy++; 183 184 while (1) { |
185 bp = bufq_first(&sc->buf_queue); | 185 bp = bioq_first(&sc->bio_queue); |
186 if (bp) | 186 if (bp) |
187 bufq_remove(&sc->buf_queue, bp); | 187 bioq_remove(&sc->bio_queue, bp); |
188 splx(s); 189 if (!bp) 190 break; 191 192 devstat_start_transaction(&sc->stats); 193 | 188 splx(s); 189 if (!bp) 190 break; 191 192 devstat_start_transaction(&sc->stats); 193 |
194 if (bp->b_iocmd == BIO_DELETE) | 194 if (bp->bio_cmd == BIO_DELETE) |
195 dop = DEVSTAT_NO_DATA; | 195 dop = DEVSTAT_NO_DATA; |
196 else if (bp->b_iocmd == BIO_READ) | 196 else if (bp->bio_cmd == BIO_READ) |
197 dop = DEVSTAT_READ; 198 else 199 dop = DEVSTAT_WRITE; 200 | 197 dop = DEVSTAT_READ; 198 else 199 dop = DEVSTAT_WRITE; 200 |
201 nsec = bp->b_bcount / DEV_BSIZE; 202 secno = bp->b_pblkno; 203 dst = bp->b_data; | 201 nsec = bp->bio_bcount / DEV_BSIZE; 202 secno = bp->bio_pblkno; 203 dst = bp->bio_data; |
204 while (nsec--) { 205 206 if (secno < sc->nsecp) { 207 secpp = &sc->secp[secno]; 208 if ((u_int)*secpp > 255) { 209 secp = *secpp; 210 secval = 0; 211 } else { 212 secp = 0; 213 secval = (u_int) *secpp; 214 } 215 } else { 216 secpp = 0; 217 secp = 0; 218 secval = 0; 219 } 220 if (md_debug > 2) | 204 while (nsec--) { 205 206 if (secno < sc->nsecp) { 207 secpp = &sc->secp[secno]; 208 if ((u_int)*secpp > 255) { 209 secp = *secpp; 210 secval = 0; 211 } else { 212 secp = 0; 213 secval = (u_int) *secpp; 214 } 215 } else { 216 secpp = 0; 217 secp = 0; 218 secval = 0; 219 } 220 if (md_debug > 2) |
221 printf("%lx %p %p %d\n", bp->b_flags, secpp, secp, secval); | 221 printf("%x %p %p %d\n", 222 bp->bio_flags, secpp, secp, secval); |
222 | 223 |
223 if (bp->b_iocmd == BIO_DELETE) { | 224 if (bp->bio_cmd == BIO_DELETE) { |
224 if (secpp) { 225 if (secp) 226 FREE(secp, M_MDSECT); 227 *secpp = 0; 228 } | 225 if (secpp) { 226 if (secp) 227 FREE(secp, M_MDSECT); 228 *secpp = 0; 229 } |
229 } else if (bp->b_iocmd == BIO_READ) { | 230 } else if (bp->bio_cmd == BIO_READ) { |
230 if (secp) { 231 bcopy(secp, dst, DEV_BSIZE); 232 } else if (secval) { 233 for (i = 0; i < DEV_BSIZE; i++) 234 dst[i] = secval; 235 } else { 236 bzero(dst, DEV_BSIZE); 237 } --- 28 unchanged lines hidden (view full) --- 266 267 *secpp = secp; 268 } 269 } 270 } 271 secno++; 272 dst += DEV_BSIZE; 273 } | 231 if (secp) { 232 bcopy(secp, dst, DEV_BSIZE); 233 } else if (secval) { 234 for (i = 0; i < DEV_BSIZE; i++) 235 dst[i] = secval; 236 } else { 237 bzero(dst, DEV_BSIZE); 238 } --- 28 unchanged lines hidden (view full) --- 267 268 *secpp = secp; 269 } 270 } 271 } 272 secno++; 273 dst += DEV_BSIZE; 274 } |
274 bp->b_resid = 0; 275 devstat_end_transaction_buf(&sc->stats, bp); | 275 bp->bio_resid = 0; 276 devstat_end_transaction_bio(&sc->stats, bp); |
276 biodone(bp); 277 s = splbio(); 278 } 279 sc->busy = 0; 280 return; 281} 282 283 284static void | 277 biodone(bp); 278 s = splbio(); 279 } 280 sc->busy = 0; 281 return; 282} 283 284 285static void |
285mdstrategy_preload(struct buf *bp) | 286mdstrategy_preload(struct bio *bp) |
286{ 287 int s; 288 struct md_s *sc; 289 devstat_trans_flags dop; 290 291 if (md_debug > 1) | 287{ 288 int s; 289 struct md_s *sc; 290 devstat_trans_flags dop; 291 292 if (md_debug > 1) |
292 printf("mdstrategy_preload(%p) %s %lx, %d, %ld, %p)\n", 293 bp, devtoname(bp->b_dev), bp->b_flags, bp->b_blkno, 294 bp->b_bcount / DEV_BSIZE, bp->b_data); | 293 printf("mdstrategy_preload(%p) %s %x, %d, %ld, %p)\n", 294 bp, devtoname(bp->bio_dev), bp->bio_flags, bp->bio_blkno, 295 bp->bio_bcount / DEV_BSIZE, bp->bio_data); |
295 | 296 |
296 sc = bp->b_dev->si_drv1; | 297 sc = bp->bio_dev->si_drv1; |
297 298 s = splbio(); 299 | 298 299 s = splbio(); 300 |
300 bufqdisksort(&sc->buf_queue, bp); | 301 bioqdisksort(&sc->bio_queue, bp); |
301 302 if (sc->busy) { 303 splx(s); 304 return; 305 } 306 307 sc->busy++; 308 309 while (1) { | 302 303 if (sc->busy) { 304 splx(s); 305 return; 306 } 307 308 sc->busy++; 309 310 while (1) { |
310 bp = bufq_first(&sc->buf_queue); | 311 bp = bioq_first(&sc->bio_queue); |
311 if (bp) | 312 if (bp) |
312 bufq_remove(&sc->buf_queue, bp); | 313 bioq_remove(&sc->bio_queue, bp); |
313 splx(s); 314 if (!bp) 315 break; 316 317 devstat_start_transaction(&sc->stats); 318 | 314 splx(s); 315 if (!bp) 316 break; 317 318 devstat_start_transaction(&sc->stats); 319 |
319 if (bp->b_iocmd == BIO_DELETE) { | 320 if (bp->bio_cmd == BIO_DELETE) { |
320 dop = DEVSTAT_NO_DATA; | 321 dop = DEVSTAT_NO_DATA; |
321 } else if (bp->b_iocmd == BIO_READ) { | 322 } else if (bp->bio_cmd == BIO_READ) { |
322 dop = DEVSTAT_READ; | 323 dop = DEVSTAT_READ; |
323 bcopy(sc->pl_ptr + (bp->b_pblkno << DEV_BSHIFT), bp->b_data, bp->b_bcount); | 324 bcopy(sc->pl_ptr + (bp->bio_pblkno << DEV_BSHIFT), bp->bio_data, bp->bio_bcount); |
324 } else { 325 dop = DEVSTAT_WRITE; | 325 } else { 326 dop = DEVSTAT_WRITE; |
326 bcopy(bp->b_data, sc->pl_ptr + (bp->b_pblkno << DEV_BSHIFT), bp->b_bcount); | 327 bcopy(bp->bio_data, sc->pl_ptr + (bp->bio_pblkno << DEV_BSHIFT), bp->bio_bcount); |
327 } | 328 } |
328 bp->b_resid = 0; 329 devstat_end_transaction_buf(&sc->stats, bp); | 329 bp->bio_resid = 0; 330 devstat_end_transaction_bio(&sc->stats, bp); |
330 biodone(bp); 331 s = splbio(); 332 } 333 sc->busy = 0; 334 return; 335} 336 337static struct md_s * 338mdcreate(struct cdevsw *devsw) 339{ 340 struct md_s *sc; 341 342 MALLOC(sc, struct md_s *,sizeof(*sc), M_MD, M_WAITOK); 343 bzero(sc, sizeof(*sc)); 344 sc->unit = mdunits++; | 331 biodone(bp); 332 s = splbio(); 333 } 334 sc->busy = 0; 335 return; 336} 337 338static struct md_s * 339mdcreate(struct cdevsw *devsw) 340{ 341 struct md_s *sc; 342 343 MALLOC(sc, struct md_s *,sizeof(*sc), M_MD, M_WAITOK); 344 bzero(sc, sizeof(*sc)); 345 sc->unit = mdunits++; |
345 bufq_init(&sc->buf_queue); | 346 bioq_init(&sc->bio_queue); |
346 devstat_add_entry(&sc->stats, "md", sc->unit, DEV_BSIZE, 347 DEVSTAT_NO_ORDERED_TAGS, 348 DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER, 349 DEVSTAT_PRIORITY_OTHER); 350 sc->dev = disk_create(sc->unit, &sc->disk, 0, devsw, &sc->devsw); 351 sc->dev->si_drv1 = sc; 352 return (sc); 353} --- 76 unchanged lines hidden --- | 347 devstat_add_entry(&sc->stats, "md", sc->unit, DEV_BSIZE, 348 DEVSTAT_NO_ORDERED_TAGS, 349 DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER, 350 DEVSTAT_PRIORITY_OTHER); 351 sc->dev = disk_create(sc->unit, &sc->disk, 0, devsw, &sc->devsw); 352 sc->dev->si_drv1 = sc; 353 return (sc); 354} --- 76 unchanged lines hidden --- |