Deleted Added
full compact
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 ---