c15e0971d72ba5c40f9125f9a4c6a5aa37f61659
[dragonfly.git] / sys / vfs / specfs / spec_vnops.c
1 /*
2  * Copyright (c) 1989, 1993, 1995
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *      @(#)spec_vnops.c        8.14 (Berkeley) 5/21/95
34  * $FreeBSD: src/sys/miscfs/specfs/spec_vnops.c,v 1.131.2.4 2001/02/26 04:23:20 jlemon Exp $
35  * $DragonFly: src/sys/vfs/specfs/spec_vnops.c,v 1.58 2008/05/06 00:14:12 dillon Exp $
36  */
37
38 #include <sys/param.h>
39 #include <sys/proc.h>
40 #include <sys/systm.h>
41 #include <sys/kernel.h>
42 #include <sys/conf.h>
43 #include <sys/buf.h>
44 #include <sys/device.h>
45 #include <sys/mount.h>
46 #include <sys/vnode.h>
47 #include <sys/stat.h>
48 #include <sys/fcntl.h>
49 #include <sys/vmmeter.h>
50 #include <sys/bus.h>
51 #include <sys/tty.h>
52
53 #include <vm/vm.h>
54 #include <vm/vm_object.h>
55 #include <vm/vm_page.h>
56 #include <vm/vm_pager.h>
57
58 #include <machine/limits.h>
59
60 #include <sys/buf2.h>
61
62 #include <sys/thread2.h>
63
64 /*
65  * Specfs chained debugging (bitmask)
66  *
67  * 0 - disable debugging
68  * 1 - report chained I/Os
69  * 2 - force 4K chained I/Os
70  */
71 #define SPEC_CHAIN_DEBUG        0
72
73 static int      spec_advlock (struct vop_advlock_args *);  
74 static int      spec_bmap (struct vop_bmap_args *);
75 static int      spec_close (struct vop_close_args *);
76 static int      spec_freeblks (struct vop_freeblks_args *);
77 static int      spec_fsync (struct  vop_fsync_args *);
78 static int      spec_getpages (struct vop_getpages_args *);
79 static int      spec_inactive (struct  vop_inactive_args *);
80 static int      spec_ioctl (struct vop_ioctl_args *);
81 static int      spec_open (struct vop_open_args *);
82 static int      spec_poll (struct vop_poll_args *);
83 static int      spec_kqfilter (struct vop_kqfilter_args *);
84 static int      spec_print (struct vop_print_args *);
85 static int      spec_read (struct vop_read_args *);  
86 static int      spec_strategy (struct vop_strategy_args *);
87 static int      spec_write (struct vop_write_args *);
88 static void     spec_strategy_done(struct bio *nbio);
89 static int      spec_getattr (struct vop_getattr_args *);
90
91 struct vop_ops spec_vnode_vops = {
92         .vop_default =          vop_defaultop,
93         .vop_access =           (void *)vop_ebadf,
94         .vop_advlock =          spec_advlock,
95         .vop_bmap =             spec_bmap,
96         .vop_close =            spec_close,
97         .vop_old_create =       (void *)vop_panic,
98         .vop_freeblks =         spec_freeblks,
99         .vop_fsync =            spec_fsync,
100         .vop_getpages =         spec_getpages,
101         .vop_inactive =         spec_inactive,
102         .vop_ioctl =            spec_ioctl,
103         .vop_old_link =         (void *)vop_panic,
104         .vop_old_mkdir =        (void *)vop_panic,
105         .vop_old_mknod =        (void *)vop_panic,
106         .vop_open =             spec_open,
107         .vop_pathconf =         vop_stdpathconf,
108         .vop_poll =             spec_poll,
109         .vop_kqfilter =         spec_kqfilter,
110         .vop_print =            spec_print,
111         .vop_read =             spec_read,
112         .vop_readdir =          (void *)vop_panic,
113         .vop_readlink =         (void *)vop_panic,
114         .vop_reallocblks =      (void *)vop_panic,
115         .vop_reclaim =          (void *)vop_null,
116         .vop_old_remove =       (void *)vop_panic,
117         .vop_old_rename =       (void *)vop_panic,
118         .vop_old_rmdir =        (void *)vop_panic,
119         .vop_setattr =          (void *)vop_ebadf,
120         .vop_getattr =          spec_getattr,
121         .vop_strategy =         spec_strategy,
122         .vop_old_symlink =      (void *)vop_panic,
123         .vop_write =            spec_write
124 };
125
126 struct vop_ops *spec_vnode_vops_p = &spec_vnode_vops;
127
128 VNODEOP_SET(spec_vnode_vops);
129
130 extern int dev_ref_debug;
131
132 /*
133  * spec_vnoperate()
134  */
135 int
136 spec_vnoperate(struct vop_generic_args *ap)
137 {
138         return (VOCALL(&spec_vnode_vops, ap));
139 }
140
141 static void spec_getpages_iodone (struct bio *bio);
142
143 /*
144  * Open a special file.
145  *
146  * spec_open(struct vnode *a_vp, int a_mode, struct ucred *a_cred,
147  *           struct file *a_fp)
148  */
149 /* ARGSUSED */
150 static int
151 spec_open(struct vop_open_args *ap)
152 {
153         struct vnode *vp = ap->a_vp;
154         cdev_t dev;
155         int error;
156         const char *cp;
157
158         /*
159          * Don't allow open if fs is mounted -nodev.
160          */
161         if (vp->v_mount && (vp->v_mount->mnt_flag & MNT_NODEV))
162                 return (ENXIO);
163         if (vp->v_type == VBLK)
164                 return (ENXIO);
165
166         /*
167          * Resolve the device.  If the vnode is already open v_rdev may
168          * already be resolved.  However, if the device changes out from
169          * under us we report it (and, for now, we allow it).  Since
170          * v_release_rdev() zero's v_opencount, we have to save and restore
171          * it when replacing the rdev reference.
172          */
173         if (vp->v_rdev != NULL) {
174                 dev = get_dev(vp->v_umajor, vp->v_uminor);
175                 if (dev != vp->v_rdev) {
176                         int oc = vp->v_opencount;
177                         kprintf(
178                             "Warning: spec_open: dev %s was lost",
179                             vp->v_rdev->si_name);
180                         v_release_rdev(vp);
181                         error = v_associate_rdev(vp, 
182                                         get_dev(vp->v_umajor, vp->v_uminor));
183                         if (error) {
184                                 kprintf(", reacquisition failed\n");
185                         } else {
186                                 vp->v_opencount = oc;
187                                 kprintf(", reacquisition successful\n");
188                         }
189                 } else {
190                         error = 0;
191                 }
192         } else {
193                 error = v_associate_rdev(vp, get_dev(vp->v_umajor, vp->v_uminor));
194         }
195         if (error)
196                 return(error);
197
198         /*
199          * Prevent degenerate open/close sequences from nulling out rdev.
200          */
201         dev = vp->v_rdev;
202         KKASSERT(dev != NULL);
203
204         /*
205          * Make this field valid before any I/O in ->d_open.  XXX the
206          * device itself should probably be required to initialize
207          * this field in d_open.
208          */
209         if (!dev->si_iosize_max)
210                 dev->si_iosize_max = DFLTPHYS;
211
212         /*
213          * XXX: Disks get special billing here, but it is mostly wrong.
214          * XXX: diskpartitions can overlap and the real checks should
215          * XXX: take this into account, and consequently they need to
216          * XXX: live in the diskslicing code.  Some checks do.
217          */
218         if (vn_isdisk(vp, NULL) && ap->a_cred != FSCRED && 
219             (ap->a_mode & FWRITE)) {
220                 /*
221                  * Never allow opens for write if the device is mounted R/W
222                  */
223                 if (vp->v_rdev && vp->v_rdev->si_mountpoint &&
224                     !(vp->v_rdev->si_mountpoint->mnt_flag & MNT_RDONLY)) {
225                                 error = EBUSY;
226                                 goto done;
227                 }
228
229                 /*
230                  * When running in secure mode, do not allow opens
231                  * for writing if the device is mounted
232                  */
233                 if (securelevel >= 1 && vfs_mountedon(vp)) {
234                         error = EPERM;
235                         goto done;
236                 }
237
238                 /*
239                  * When running in very secure mode, do not allow
240                  * opens for writing of any devices.
241                  */
242                 if (securelevel >= 2) {
243                         error = EPERM;
244                         goto done;
245                 }
246         }
247
248         /* XXX: Special casing of ttys for deadfs.  Probably redundant */
249         if (dev_dflags(dev) & D_TTY)
250                 vp->v_flag |= VISTTY;
251
252         /*
253          * dev_dopen() is always called for each open.  dev_dclose() is
254          * only called for the last close unless D_TRACKCLOSE is set.
255          */
256         vn_unlock(vp);
257         error = dev_dopen(dev, ap->a_mode, S_IFCHR, ap->a_cred);
258         vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
259
260         if (error)
261                 goto done;
262
263         if (dev_dflags(dev) & D_TTY) {
264                 if (dev->si_tty) {
265                         struct tty *tp;
266                         tp = dev->si_tty;
267                         if (!tp->t_stop) {
268                                 kprintf("Warning:%s: no t_stop, using nottystop\n", devtoname(dev));
269                                 tp->t_stop = nottystop;
270                         }
271                 }
272         }
273
274         /*
275          * If this is 'disk' or disk-like device, associate a VM object
276          * with it.
277          */
278         if (vn_isdisk(vp, NULL)) {
279                 if (!dev->si_bsize_phys)
280                         dev->si_bsize_phys = DEV_BSIZE;
281                 vinitvmio(vp, IDX_TO_OFF(INT_MAX));
282         }
283         if ((dev_dflags(dev) & D_DISK) == 0) {
284                 cp = devtoname(dev);
285                 if (*cp == '#') {
286                         kprintf("WARNING: driver %s should register devices with make_dev() (cdev_t = \"%s\")\n",
287                             dev_dname(dev), cp);
288                 }
289         }
290
291         /*
292          * If we were handed a file pointer we may be able to install a
293          * shortcut which issues device read and write operations directly
294          * from the fileops rather then having to go through spec_read()
295          * and spec_write().
296          */
297         if (ap->a_fp)
298                 vn_setspecops(ap->a_fp);
299
300         if (dev_ref_debug)
301                 kprintf("spec_open: %s %d\n", dev->si_name, vp->v_opencount);
302 done:
303         if (error) {
304                 if (vp->v_opencount == 0)
305                         v_release_rdev(vp);
306         } else {
307                 vop_stdopen(ap);
308         }
309         return (error);
310 }
311
312 /*
313  * Vnode op for read
314  *
315  * spec_read(struct vnode *a_vp, struct uio *a_uio, int a_ioflag,
316  *           struct ucred *a_cred)
317  */
318 /* ARGSUSED */
319 static int
320 spec_read(struct vop_read_args *ap)
321 {
322         struct vnode *vp;
323         struct thread *td;
324         struct uio *uio;
325         cdev_t dev;
326         int error;
327
328         vp = ap->a_vp;
329         dev = vp->v_rdev;
330         uio = ap->a_uio;
331         td = uio->uio_td;
332
333         if (dev == NULL)                /* device was revoked */
334                 return (EBADF);
335         if (uio->uio_resid == 0)
336                 return (0);
337
338         vn_unlock(vp);
339         error = dev_dread(dev, uio, ap->a_ioflag);
340         vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
341         return (error);
342 }
343
344 /*
345  * Vnode op for write
346  *
347  * spec_write(struct vnode *a_vp, struct uio *a_uio, int a_ioflag,
348  *            struct ucred *a_cred)
349  */
350 /* ARGSUSED */
351 static int
352 spec_write(struct vop_write_args *ap)
353 {
354         struct vnode *vp;
355         struct thread *td;
356         struct uio *uio;
357         cdev_t dev;
358         int error;
359
360         vp = ap->a_vp;
361         dev = vp->v_rdev;
362         uio = ap->a_uio;
363         td = uio->uio_td;
364
365         KKASSERT(uio->uio_segflg != UIO_NOCOPY);
366
367         if (dev == NULL)                /* device was revoked */
368                 return (EBADF);
369
370         vn_unlock(vp);
371         error = dev_dwrite(dev, uio, ap->a_ioflag);
372         vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
373         return (error);
374 }
375
376 /*
377  * This call modifying an upper layer filesystem's idea of the owner only.
378  * It does NOT replace the upper layer filesystem's getattr.
379  *
380  * XXX spec_getattr() - TEMPORARY - remove when devfs is fully installed.
381  *                      This is a horrible hack.  The code will get confused
382  *                      if root chown's a tty device and then fails to chown
383  *                      it back after finishing with it.  Non-root chowns are
384  *                      strictly stored in the device and don't have the issue.
385  */
386 static int
387 spec_getattr (struct vop_getattr_args *ap)
388 {
389         struct vattr *vap = ap->a_vap;
390         struct vnode *vp = ap->a_vp;
391         cdev_t dev;
392
393         if (vp->v_type != VCHR)
394                 return (0);
395         if ((dev = vp->v_rdev) == NULL) {
396                 if ((dev = vp->v_rdev) == NULL)
397                         dev = get_dev(vp->v_umajor, vp->v_uminor);
398                 if (dev == NULL)
399                         return (0);
400         }
401         if (vap->va_uid == 0) {
402                 vap->va_uid = dev->si_uid;
403         }
404         return (0);
405 }
406
407 /*
408  * Device ioctl operation.
409  *
410  * spec_ioctl(struct vnode *a_vp, int a_command, caddr_t a_data,
411  *            int a_fflag, struct ucred *a_cred)
412  */
413 /* ARGSUSED */
414 static int
415 spec_ioctl(struct vop_ioctl_args *ap)
416 {
417         cdev_t dev;
418
419         if ((dev = ap->a_vp->v_rdev) == NULL)
420                 return (EBADF);         /* device was revoked */
421
422         return (dev_dioctl(dev, ap->a_command, ap->a_data,
423                     ap->a_fflag, ap->a_cred));
424 }
425
426 /*
427  * spec_poll(struct vnode *a_vp, int a_events, struct ucred *a_cred)
428  */
429 /* ARGSUSED */
430 static int
431 spec_poll(struct vop_poll_args *ap)
432 {
433         cdev_t dev;
434
435         if ((dev = ap->a_vp->v_rdev) == NULL)
436                 return (EBADF);         /* device was revoked */
437         return (dev_dpoll(dev, ap->a_events));
438 }
439
440 /*
441  * spec_kqfilter(struct vnode *a_vp, struct knote *a_kn)
442  */
443 /* ARGSUSED */
444 static int
445 spec_kqfilter(struct vop_kqfilter_args *ap)
446 {
447         cdev_t dev;
448
449         if ((dev = ap->a_vp->v_rdev) == NULL)
450                 return (EBADF);         /* device was revoked */
451         return (dev_dkqfilter(dev, ap->a_kn));
452 }
453
454 /*
455  * Synch buffers associated with a block device
456  *
457  * spec_fsync(struct vnode *a_vp, int a_waitfor)
458  */
459 /* ARGSUSED */
460 static int
461 spec_fsync(struct vop_fsync_args *ap)
462 {
463         struct vnode *vp = ap->a_vp;
464         int error;
465
466         if (!vn_isdisk(vp, NULL))
467                 return (0);
468
469         /*
470          * Flush all dirty buffers associated with a block device.
471          */
472         error = vfsync(vp, ap->a_waitfor, 10000, NULL, NULL);
473         return (error);
474 }
475
476 /*
477  * spec_inactive(struct vnode *a_vp)
478  */
479 static int
480 spec_inactive(struct vop_inactive_args *ap)
481 {
482         return (0);
483 }
484
485 /*
486  * Convert a vnode strategy call into a device strategy call.  Vnode strategy
487  * calls are not limited to device DMA limits so we have to deal with the
488  * case.
489  *
490  * spec_strategy(struct vnode *a_vp, struct bio *a_bio)
491  */
492 static int
493 spec_strategy(struct vop_strategy_args *ap)
494 {
495         struct bio *bio = ap->a_bio;
496         struct buf *bp = bio->bio_buf;
497         struct buf *nbp;
498         struct vnode *vp;
499         struct mount *mp;
500         int chunksize;
501         int maxiosize;
502
503         if (bp->b_cmd != BUF_CMD_READ && LIST_FIRST(&bp->b_dep) != NULL)
504                 buf_start(bp);
505
506         /*
507          * Collect statistics on synchronous and asynchronous read
508          * and write counts for disks that have associated filesystems.
509          */
510         vp = ap->a_vp;
511         KKASSERT(vp->v_rdev != NULL);   /* XXX */
512         if (vn_isdisk(vp, NULL) && (mp = vp->v_rdev->si_mountpoint) != NULL) {
513                 if (bp->b_cmd == BUF_CMD_READ) {
514                         if (bp->b_flags & B_ASYNC)
515                                 mp->mnt_stat.f_asyncreads++;
516                         else
517                                 mp->mnt_stat.f_syncreads++;
518                 } else {
519                         if (bp->b_flags & B_ASYNC)
520                                 mp->mnt_stat.f_asyncwrites++;
521                         else
522                                 mp->mnt_stat.f_syncwrites++;
523                 }
524         }
525
526         /*
527          * Device iosize limitations only apply to read and write.  Shortcut
528          * the I/O if it fits.
529          */
530         if ((maxiosize = vp->v_rdev->si_iosize_max) == 0) {
531                 kprintf("%s: si_iosize_max not set!\n", dev_dname(vp->v_rdev));
532                 maxiosize = MAXPHYS;
533         }
534 #if SPEC_CHAIN_DEBUG & 2
535         maxiosize = 4096;
536 #endif
537         if (bp->b_bcount <= maxiosize ||
538             (bp->b_cmd != BUF_CMD_READ && bp->b_cmd != BUF_CMD_WRITE)) {
539                 dev_dstrategy_chain(vp->v_rdev, bio);
540                 return (0);
541         }
542
543         /*
544          * Clone the buffer and set up an I/O chain to chunk up the I/O.
545          */
546         nbp = kmalloc(sizeof(*bp), M_DEVBUF, M_INTWAIT|M_ZERO);
547         initbufbio(nbp);
548         buf_dep_init(nbp);
549         BUF_LOCKINIT(nbp);
550         BUF_LOCK(nbp, LK_EXCLUSIVE);
551         BUF_KERNPROC(nbp);
552         nbp->b_vp = vp;
553         nbp->b_flags = B_PAGING | (bp->b_flags & B_BNOCLIP);
554         nbp->b_data = bp->b_data;
555         nbp->b_bio1.bio_done = spec_strategy_done;
556         nbp->b_bio1.bio_offset = bio->bio_offset;
557         nbp->b_bio1.bio_caller_info1.ptr = bio;
558
559         /*
560          * Start the first transfer
561          */
562         if (vn_isdisk(vp, NULL))
563                 chunksize = vp->v_rdev->si_bsize_phys;
564         else
565                 chunksize = DEV_BSIZE;
566         chunksize = maxiosize / chunksize * chunksize;
567 #if SPEC_CHAIN_DEBUG & 1
568         kprintf("spec_strategy chained I/O chunksize=%d\n", chunksize);
569 #endif
570         nbp->b_cmd = bp->b_cmd;
571         nbp->b_bcount = chunksize;
572         nbp->b_bufsize = chunksize;     /* used to detect a short I/O */
573         nbp->b_bio1.bio_caller_info2.index = chunksize;
574
575 #if SPEC_CHAIN_DEBUG & 1
576         kprintf("spec_strategy: chain %p offset %d/%d bcount %d\n",
577                 bp, 0, bp->b_bcount, nbp->b_bcount);
578 #endif
579
580         dev_dstrategy(vp->v_rdev, &nbp->b_bio1);
581         return (0);
582 }
583
584 /*
585  * Chunked up transfer completion routine - chain transfers until done
586  */
587 static
588 void
589 spec_strategy_done(struct bio *nbio)
590 {
591         struct buf *nbp = nbio->bio_buf;
592         struct bio *bio = nbio->bio_caller_info1.ptr;   /* original bio */
593         struct buf *bp = bio->bio_buf;                  /* original bp */
594         int chunksize = nbio->bio_caller_info2.index;   /* chunking */
595         int boffset = nbp->b_data - bp->b_data;
596
597         if (nbp->b_flags & B_ERROR) {
598                 /*
599                  * An error terminates the chain, propogate the error back
600                  * to the original bp
601                  */
602                 bp->b_flags |= B_ERROR;
603                 bp->b_error = nbp->b_error;
604                 bp->b_resid = bp->b_bcount - boffset +
605                               (nbp->b_bcount - nbp->b_resid);
606 #if SPEC_CHAIN_DEBUG & 1
607                 kprintf("spec_strategy: chain %p error %d bcount %d/%d\n",
608                         bp, bp->b_error, bp->b_bcount,
609                         bp->b_bcount - bp->b_resid);
610 #endif
611                 kfree(nbp, M_DEVBUF);
612                 biodone(bio);
613         } else if (nbp->b_resid) {
614                 /*
615                  * A short read or write terminates the chain
616                  */
617                 bp->b_error = nbp->b_error;
618                 bp->b_resid = bp->b_bcount - boffset +
619                               (nbp->b_bcount - nbp->b_resid);
620 #if SPEC_CHAIN_DEBUG & 1
621                 kprintf("spec_strategy: chain %p short read(1) bcount %d/%d\n",
622                         bp, bp->b_bcount - bp->b_resid, bp->b_bcount);
623 #endif
624                 kfree(nbp, M_DEVBUF);
625                 biodone(bio);
626         } else if (nbp->b_bcount != nbp->b_bufsize) {
627                 /*
628                  * A short read or write can also occur by truncating b_bcount
629                  */
630 #if SPEC_CHAIN_DEBUG & 1
631                 kprintf("spec_strategy: chain %p short read(2) bcount %d/%d\n",
632                         bp, nbp->b_bcount + boffset, bp->b_bcount);
633 #endif
634                 bp->b_error = 0;
635                 bp->b_bcount = nbp->b_bcount + boffset; 
636                 bp->b_resid = nbp->b_resid;
637                 kfree(nbp, M_DEVBUF);
638                 biodone(bio);
639         } else if (nbp->b_bcount + boffset == bp->b_bcount) {
640                 /*
641                  * No more data terminates the chain
642                  */
643 #if SPEC_CHAIN_DEBUG & 1
644                 kprintf("spec_strategy: chain %p finished bcount %d\n",
645                         bp, bp->b_bcount);
646 #endif
647                 bp->b_error = 0;
648                 bp->b_resid = 0;
649                 kfree(nbp, M_DEVBUF);
650                 biodone(bio);
651         } else {
652                 /*
653                  * Continue the chain
654                  */
655                 boffset += nbp->b_bcount;
656                 nbp->b_data = bp->b_data + boffset;
657                 nbp->b_bcount = bp->b_bcount - boffset;
658                 if (nbp->b_bcount > chunksize)
659                         nbp->b_bcount = chunksize;
660                 nbp->b_bio1.bio_done = spec_strategy_done;
661                 nbp->b_bio1.bio_offset = bio->bio_offset + boffset;
662
663 #if SPEC_CHAIN_DEBUG & 1
664                 kprintf("spec_strategy: chain %p offset %d/%d bcount %d\n",
665                         bp, boffset, bp->b_bcount, nbp->b_bcount);
666 #endif
667
668                 dev_dstrategy(nbp->b_vp->v_rdev, &nbp->b_bio1);
669         }
670 }
671
672 /*
673  * spec_freeblks(struct vnode *a_vp, daddr_t a_addr, daddr_t a_length)
674  */
675 static int
676 spec_freeblks(struct vop_freeblks_args *ap)
677 {
678         struct buf *bp;
679
680         /*
681          * XXX: This assumes that strategy does the deed right away.
682          * XXX: this may not be TRTTD.
683          */
684         KKASSERT(ap->a_vp->v_rdev != NULL);
685         if ((dev_dflags(ap->a_vp->v_rdev) & D_CANFREE) == 0)
686                 return (0);
687         bp = geteblk(ap->a_length);
688         bp->b_cmd = BUF_CMD_FREEBLKS;
689         bp->b_bio1.bio_offset = ap->a_offset;
690         bp->b_bcount = ap->a_length;
691         dev_dstrategy(ap->a_vp->v_rdev, &bp->b_bio1);
692         return (0);
693 }
694
695 /*
696  * Implement degenerate case where the block requested is the block
697  * returned, and assume that the entire device is contiguous in regards
698  * to the contiguous block range (runp and runb).
699  *
700  * spec_bmap(struct vnode *a_vp, off_t a_loffset,
701  *           off_t *a_doffsetp, int *a_runp, int *a_runb)
702  */
703 static int
704 spec_bmap(struct vop_bmap_args *ap)
705 {
706         if (ap->a_doffsetp != NULL)
707                 *ap->a_doffsetp = ap->a_loffset;
708         if (ap->a_runp != NULL)
709                 *ap->a_runp = MAXBSIZE;
710         if (ap->a_runb != NULL) {
711                 if (ap->a_loffset < MAXBSIZE)
712                         *ap->a_runb = (int)ap->a_loffset;
713                 else
714                         *ap->a_runb = MAXBSIZE;
715         }
716         return (0);
717 }
718
719 /*
720  * Device close routine
721  *
722  * spec_close(struct vnode *a_vp, int a_fflag)
723  *
724  * NOTE: The vnode may or may not be locked on call.
725  */
726 /* ARGSUSED */
727 static int
728 spec_close(struct vop_close_args *ap)
729 {
730         struct proc *p = curproc;
731         struct vnode *vp = ap->a_vp;
732         cdev_t dev = vp->v_rdev;
733         int error;
734         int needrelock;
735
736         /*
737          * A couple of hacks for devices and tty devices.  The
738          * vnode ref count cannot be used to figure out the
739          * last close, but we can use v_opencount now that
740          * revoke works properly.
741          *
742          * Detect the last close on a controlling terminal and clear
743          * the session (half-close).
744          */
745         if (dev)
746                 reference_dev(dev);
747
748         if (p && vp->v_opencount <= 1 && vp == p->p_session->s_ttyvp) {
749                 p->p_session->s_ttyvp = NULL;
750                 vrele(vp);
751         }
752
753         /*
754          * Vnodes can be opened and closed multiple times.  Do not really
755          * close the device unless (1) it is being closed forcibly,
756          * (2) the device wants to track closes, or (3) this is the last
757          * vnode doing its last close on the device.
758          *
759          * XXX the VXLOCK (force close) case can leave vnodes referencing
760          * a closed device.  This might not occur now that our revoke is
761          * fixed.
762          */
763         if (dev && ((vp->v_flag & VRECLAIMED) ||
764             (dev_dflags(dev) & D_TRACKCLOSE) ||
765             (vp->v_opencount == 1))) {
766                 needrelock = 0;
767                 if (vn_islocked(vp)) {
768                         needrelock = 1;
769                         vn_unlock(vp);
770                 }
771                 error = dev_dclose(dev, ap->a_fflag, S_IFCHR);
772                 if (needrelock)
773                         vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
774         } else {
775                 error = 0;
776         }
777
778         /*
779          * Track the actual opens and closes on the vnode.  The last close
780          * disassociates the rdev.  If the rdev is already disassociated or the
781          * opencount is already 0, the vnode might have been revoked and no
782          * further opencount tracking occurs.
783          */
784         if (dev) {
785                 if (dev_ref_debug) {
786                         kprintf("spec_close: %s %d\n",
787                                 dev->si_name, vp->v_opencount - 1);
788                 }
789                 if (vp->v_opencount == 1)
790                         v_release_rdev(vp);
791                 release_dev(dev);
792         }
793         if (vp->v_opencount > 0)
794                 vop_stdclose(ap);
795         return(error);
796 }
797
798 /*
799  * Print out the contents of a special device vnode.
800  *
801  * spec_print(struct vnode *a_vp)
802  */
803 static int
804 spec_print(struct vop_print_args *ap)
805 {
806         kprintf("tag VT_NON, dev %s\n", devtoname(ap->a_vp->v_rdev));
807         return (0);
808 }
809
810 /*
811  * Special device advisory byte-level locks.
812  *
813  * spec_advlock(struct vnode *a_vp, caddr_t a_id, int a_op,
814  *              struct flock *a_fl, int a_flags)
815  */
816 /* ARGSUSED */
817 static int
818 spec_advlock(struct vop_advlock_args *ap)
819 {
820         return ((ap->a_flags & F_POSIX) ? EINVAL : EOPNOTSUPP);
821 }
822
823 static void
824 spec_getpages_iodone(struct bio *bio)
825 {
826         bio->bio_buf->b_cmd = BUF_CMD_DONE;
827         wakeup(bio->bio_buf);
828 }
829
830 /*
831  * spec_getpages() - get pages associated with device vnode.
832  *
833  * Note that spec_read and spec_write do not use the buffer cache, so we
834  * must fully implement getpages here.
835  */
836 static int
837 spec_getpages(struct vop_getpages_args *ap)
838 {
839         vm_offset_t kva;
840         int error;
841         int i, pcount, size;
842         struct buf *bp;
843         vm_page_t m;
844         vm_ooffset_t offset;
845         int toff, nextoff, nread;
846         struct vnode *vp = ap->a_vp;
847         int blksiz;
848         int gotreqpage;
849
850         error = 0;
851         pcount = round_page(ap->a_count) / PAGE_SIZE;
852
853         /*
854          * Calculate the offset of the transfer and do sanity check.
855          */
856         offset = IDX_TO_OFF(ap->a_m[0]->pindex) + ap->a_offset;
857
858         /*
859          * Round up physical size for real devices.  We cannot round using
860          * v_mount's block size data because v_mount has nothing to do with
861          * the device.  i.e. it's usually '/dev'.  We need the physical block
862          * size for the device itself.
863          *
864          * We can't use v_rdev->si_mountpoint because it only exists when the
865          * block device is mounted.  However, we can use v_rdev.
866          */
867
868         if (vn_isdisk(vp, NULL))
869                 blksiz = vp->v_rdev->si_bsize_phys;
870         else
871                 blksiz = DEV_BSIZE;
872
873         size = (ap->a_count + blksiz - 1) & ~(blksiz - 1);
874
875         bp = getpbuf(NULL);
876         kva = (vm_offset_t)bp->b_data;
877
878         /*
879          * Map the pages to be read into the kva.
880          */
881         pmap_qenter(kva, ap->a_m, pcount);
882
883         /* Build a minimal buffer header. */
884         bp->b_cmd = BUF_CMD_READ;
885         bp->b_bcount = size;
886         bp->b_resid = 0;
887         bp->b_runningbufspace = size;
888         if (size) {
889                 runningbufspace += bp->b_runningbufspace;
890                 ++runningbufcount;
891         }
892
893         bp->b_bio1.bio_offset = offset;
894         bp->b_bio1.bio_done = spec_getpages_iodone;
895
896         mycpu->gd_cnt.v_vnodein++;
897         mycpu->gd_cnt.v_vnodepgsin += pcount;
898
899         /* Do the input. */
900         vn_strategy(ap->a_vp, &bp->b_bio1);
901
902         crit_enter();
903
904         /* We definitely need to be at splbio here. */
905         while (bp->b_cmd != BUF_CMD_DONE)
906                 tsleep(bp, 0, "spread", 0);
907
908         crit_exit();
909
910         if (bp->b_flags & B_ERROR) {
911                 if (bp->b_error)
912                         error = bp->b_error;
913                 else
914                         error = EIO;
915         }
916
917         /*
918          * If EOF is encountered we must zero-extend the result in order
919          * to ensure that the page does not contain garabge.  When no
920          * error occurs, an early EOF is indicated if b_bcount got truncated.
921          * b_resid is relative to b_bcount and should be 0, but some devices
922          * might indicate an EOF with b_resid instead of truncating b_bcount.
923          */
924         nread = bp->b_bcount - bp->b_resid;
925         if (nread < ap->a_count)
926                 bzero((caddr_t)kva + nread, ap->a_count - nread);
927         pmap_qremove(kva, pcount);
928
929         gotreqpage = 0;
930         for (i = 0, toff = 0; i < pcount; i++, toff = nextoff) {
931                 nextoff = toff + PAGE_SIZE;
932                 m = ap->a_m[i];
933
934                 m->flags &= ~PG_ZERO;
935
936                 if (nextoff <= nread) {
937                         m->valid = VM_PAGE_BITS_ALL;
938                         vm_page_undirty(m);
939                 } else if (toff < nread) {
940                         /*
941                          * Since this is a VM request, we have to supply the
942                          * unaligned offset to allow vm_page_set_validclean()
943                          * to zero sub-DEV_BSIZE'd portions of the page.
944                          */
945                         vm_page_set_validclean(m, 0, nread - toff);
946                 } else {
947                         m->valid = 0;
948                         vm_page_undirty(m);
949                 }
950
951                 if (i != ap->a_reqpage) {
952                         /*
953                          * Just in case someone was asking for this page we
954                          * now tell them that it is ok to use.
955                          */
956                         if (!error || (m->valid == VM_PAGE_BITS_ALL)) {
957                                 if (m->valid) {
958                                         if (m->flags & PG_WANTED) {
959                                                 vm_page_activate(m);
960                                         } else {
961                                                 vm_page_deactivate(m);
962                                         }
963                                         vm_page_wakeup(m);
964                                 } else {
965                                         vm_page_free(m);
966                                 }
967                         } else {
968                                 vm_page_free(m);
969                         }
970                 } else if (m->valid) {
971                         gotreqpage = 1;
972                         /*
973                          * Since this is a VM request, we need to make the
974                          * entire page presentable by zeroing invalid sections.
975                          */
976                         if (m->valid != VM_PAGE_BITS_ALL)
977                             vm_page_zero_invalid(m, FALSE);
978                 }
979         }
980         if (!gotreqpage) {
981                 m = ap->a_m[ap->a_reqpage];
982                 kprintf(
983             "spec_getpages:(%s) I/O read failure: (error=%d) bp %p vp %p\n",
984                         devtoname(vp->v_rdev), error, bp, bp->b_vp);
985                 kprintf(
986             "               size: %d, resid: %d, a_count: %d, valid: 0x%x\n",
987                     size, bp->b_resid, ap->a_count, m->valid);
988                 kprintf(
989             "               nread: %d, reqpage: %d, pindex: %lu, pcount: %d\n",
990                     nread, ap->a_reqpage, (u_long)m->pindex, pcount);
991                 /*
992                  * Free the buffer header back to the swap buffer pool.
993                  */
994                 relpbuf(bp, NULL);
995                 return VM_PAGER_ERROR;
996         }
997         /*
998          * Free the buffer header back to the swap buffer pool.
999          */
1000         relpbuf(bp, NULL);
1001         return VM_PAGER_OK;
1002 }