Merge from vendor branch NTPD:
[dragonfly.git] / sys / vfs / coda / coda_fbsd.c
1 /*
2  * 
3  *             Coda: an Experimental Distributed File System
4  *                              Release 3.1
5  * 
6  *           Copyright (c) 1987-1998 Carnegie Mellon University
7  *                          All Rights Reserved
8  * 
9  * Permission  to  use, copy, modify and distribute this software and its
10  * documentation is hereby granted,  provided  that  both  the  copyright
11  * notice  and  this  permission  notice  appear  in  all  copies  of the
12  * software, derivative works or  modified  versions,  and  any  portions
13  * thereof, and that both notices appear in supporting documentation, and
14  * that credit is given to Carnegie Mellon University  in  all  documents
15  * and publicity pertaining to direct or indirect use of this code or its
16  * derivatives.
17  * 
18  * CODA IS AN EXPERIMENTAL SOFTWARE SYSTEM AND IS  KNOWN  TO  HAVE  BUGS,
19  * SOME  OF  WHICH MAY HAVE SERIOUS CONSEQUENCES.  CARNEGIE MELLON ALLOWS
20  * FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.   CARNEGIE  MELLON
21  * DISCLAIMS  ANY  LIABILITY  OF  ANY  KIND  FOR  ANY  DAMAGES WHATSOEVER
22  * RESULTING DIRECTLY OR INDIRECTLY FROM THE USE OF THIS SOFTWARE  OR  OF
23  * ANY DERIVATIVE WORK.
24  * 
25  * Carnegie  Mellon  encourages  users  of  this  software  to return any
26  * improvements or extensions that  they  make,  and  to  grant  Carnegie
27  * Mellon the rights to redistribute these changes without encumbrance.
28  * 
29  *      @(#) src/sys/coda/coda_fbsd.cr,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $
30  * $FreeBSD: src/sys/coda/coda_fbsd.c,v 1.18 1999/09/25 18:23:43 phk Exp $
31  * $DragonFly: src/sys/vfs/coda/Attic/coda_fbsd.c,v 1.8 2004/11/12 00:09:28 dillon Exp $
32  * 
33  */
34
35 #include "use_vcoda.h"
36
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/kernel.h>
40 #include <sys/proc.h>
41 #include <sys/malloc.h>
42 #include <sys/fcntl.h>
43 #include <sys/ucred.h>
44 #include <sys/vnode.h>
45 #include <sys/conf.h>
46
47 #include <vm/vm.h>
48 #include <vm/vnode_pager.h>
49
50 #include "coda.h"
51 #include "cnode.h"
52 #include "coda_vnops.h"
53 #include "coda_psdev.h"
54
55 /* 
56    From: "Jordan K. Hubbard" <jkh@time.cdrom.com>
57    Subject: Re: New 3.0 SNAPshot CDROM about ready for production.. 
58    To: "Robert.V.Baron" <rvb@GLUCK.CODA.CS.CMU.EDU>
59    Date: Fri, 20 Feb 1998 15:57:01 -0800
60
61    > Also I need a character device major number. (and might want to reserve
62    > a block of 10 syscalls.)
63
64    Just one char device number?  No block devices?  Very well, cdev 93 is yours!
65 */
66
67 #define VC_DEV_NO      93
68
69 static struct cdevsw codadevsw = {
70         /* name */      "Coda",
71         /* maj */       VC_DEV_NO,
72         /* flags */     0,
73         /* port */      NULL,
74         /* clone */     NULL,
75
76         /* open */      vc_nb_open,
77         /* close */     vc_nb_close,
78         /* read */      vc_nb_read,
79         /* write */     vc_nb_write,
80         /* ioctl */     vc_nb_ioctl,
81         /* poll */      vc_nb_poll,
82         /* mmap */      nommap,
83         /* strategy */  nostrategy,
84         /* dump */      nodump,
85         /* psize */     nopsize
86 };
87
88 int     vcdebug = 1;
89 #define VCDEBUG if (vcdebug) printf
90
91 static int
92 codadev_modevent(module_t mod, int type, void *data)
93 {
94         switch (type) {
95         case MOD_LOAD:
96                 cdevsw_add(&codadevsw, 0, 0);
97                 break;
98         case MOD_UNLOAD:
99                 cdevsw_remove(&codadevsw, 0, 0);
100                 break;
101         default:
102                 break;
103         }
104         return 0;
105 }
106 static moduledata_t codadev_mod = {
107         "codadev",
108         codadev_modevent,
109         NULL
110 };
111 DECLARE_MODULE(codadev, codadev_mod, SI_SUB_DRIVERS, SI_ORDER_MIDDLE+VC_DEV_NO);
112
113 int
114 coda_fbsd_getpages(void *v)
115 {
116     struct vop_getpages_args *ap = v;
117     int ret = 0;
118
119 #if     1
120         /* ??? a_offset */
121         ret = vnode_pager_generic_getpages(ap->a_vp, ap->a_m, ap->a_count,
122                 ap->a_reqpage);
123         return ret;
124 #else
125   {
126     struct vnode *vp = ap->a_vp;
127     struct cnode *cp = VTOC(vp);
128     struct vnode *cfvp = cp->c_ovp;
129     int opened_internally = 0;
130     struct ucred *cred = (struct ucred *) 0;
131     struct proc *p = curproc;
132     int error = 0;
133         
134     if (IS_CTL_VP(vp)) {
135         return(EINVAL);
136     }
137
138     /* Redirect the request to UFS. */
139
140     if (cfvp == NULL) {
141         opened_internally = 1;
142
143         error = VOP_OPEN(vp, FREAD, cred, NULL, p);
144 printf("coda_getp: Internally Opening %p\n", vp);
145
146         if (error) {
147             printf("coda_getpage: VOP_OPEN on container failed %d\n", error);
148                 return (error);
149         }
150         if (vp->v_type == VREG) {
151             error = vfs_object_create(vp, p, cred);
152             if (error != 0) {
153                 printf("coda_getpage: vfs_object_create() returns %d\n", error);
154                 vput(vp);
155                 return(error);
156             }
157         }
158
159         cfvp = cp->c_ovp;
160     } else {
161 printf("coda_getp: has container %p\n", cfvp);
162     }
163
164 printf("coda_fbsd_getpages: using container ");
165 /*
166     error = vnode_pager_generic_getpages(cfvp, ap->a_m, ap->a_count,
167         ap->a_reqpage);
168 */
169     error = VOP_GETPAGES(cfvp, ap->a_m, ap->a_count,
170         ap->a_reqpage, ap->a_offset);
171 printf("error = %d\n", error);
172
173     /* Do an internal close if necessary. */
174     if (opened_internally) {
175         (void)VOP_CLOSE(vp, FREAD, cred, p);
176     }
177
178     return(error);
179   }
180 #endif
181 }
182
183 int
184 coda_fbsd_putpages(void *v)
185 {
186         struct vop_putpages_args *ap = v;
187
188         /*??? a_offset */
189         return vnode_pager_generic_putpages(ap->a_vp, ap->a_m, ap->a_count,
190                 ap->a_sync, ap->a_rtvals);
191 }