| @@ -71,26 +71,27 @@ | | | @@ -71,26 +71,27 @@ |
71 | #include <sys/buf.h> | | 71 | #include <sys/buf.h> |
72 | #include <sys/sched.h> | | 72 | #include <sys/sched.h> |
73 | #include <sys/acl.h> | | 73 | #include <sys/acl.h> |
74 | #include <sys/extdirent.h> | | 74 | #include <sys/extdirent.h> |
75 | | | 75 | |
76 | #ifdef __FreeBSD__ | | 76 | #ifdef __FreeBSD__ |
77 | #include <sys/kidmap.h> | | 77 | #include <sys/kidmap.h> |
78 | #include <sys/bio.h> | | 78 | #include <sys/bio.h> |
79 | #include <vm/vm_param.h> | | 79 | #include <vm/vm_param.h> |
80 | #endif | | 80 | #endif |
81 | | | 81 | |
82 | #ifdef __NetBSD__ | | 82 | #ifdef __NetBSD__ |
83 | #include <dev/mm.h> | | 83 | #include <dev/mm.h> |
| | | 84 | #include <miscfs/fifofs/fifo.h> |
84 | #include <miscfs/genfs/genfs.h> | | 85 | #include <miscfs/genfs/genfs.h> |
85 | #include <miscfs/genfs/genfs_node.h> | | 86 | #include <miscfs/genfs/genfs_node.h> |
86 | #include <uvm/uvm_extern.h> | | 87 | #include <uvm/uvm_extern.h> |
87 | #include <sys/fstrans.h> | | 88 | #include <sys/fstrans.h> |
88 | #include <sys/malloc.h> | | 89 | #include <sys/malloc.h> |
89 | | | 90 | |
90 | uint_t zfs_putpage_key; | | 91 | uint_t zfs_putpage_key; |
91 | #endif | | 92 | #endif |
92 | | | 93 | |
93 | /* | | 94 | /* |
94 | * Programming rules. | | 95 | * Programming rules. |
95 | * | | 96 | * |
96 | * Each vnode op performs some logical unit of work. To do this, the ZPL must | | 97 | * Each vnode op performs some logical unit of work. To do this, the ZPL must |
| @@ -5062,36 +5063,59 @@ static int | | | @@ -5062,36 +5063,59 @@ static int |
5062 | zfs_netbsd_ioctl(void *v) | | 5063 | zfs_netbsd_ioctl(void *v) |
5063 | { | | 5064 | { |
5064 | struct vop_ioctl_args *ap = v; | | 5065 | struct vop_ioctl_args *ap = v; |
5065 | | | 5066 | |
5066 | return (zfs_ioctl(ap->a_vp, ap->a_command, (intptr_t)ap->a_data, | | 5067 | return (zfs_ioctl(ap->a_vp, ap->a_command, (intptr_t)ap->a_data, |
5067 | ap->a_fflag, ap->a_cred, NULL, NULL)); | | 5068 | ap->a_fflag, ap->a_cred, NULL, NULL)); |
5068 | } | | 5069 | } |
5069 | | | 5070 | |
5070 | | | 5071 | |
5071 | static int | | 5072 | static int |
5072 | zfs_netbsd_read(void *v) | | 5073 | zfs_netbsd_read(void *v) |
5073 | { | | 5074 | { |
5074 | struct vop_read_args *ap = v; | | 5075 | struct vop_read_args *ap = v; |
| | | 5076 | vnode_t *vp = ap->a_vp; |
| | | 5077 | znode_t *zp = VTOZ(vp); |
5075 | | | 5078 | |
5076 | return (zfs_read(ap->a_vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL)); | | 5079 | switch (vp->v_type) { |
| | | 5080 | case VBLK: |
| | | 5081 | case VCHR: |
| | | 5082 | ZFS_ACCESSTIME_STAMP(zp->z_zfsvfs, zp); |
| | | 5083 | return (VOCALL(spec_vnodeop_p, VOFFSET(vop_read), ap)); |
| | | 5084 | case VFIFO: |
| | | 5085 | ZFS_ACCESSTIME_STAMP(zp->z_zfsvfs, zp); |
| | | 5086 | return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_read), ap)); |
| | | 5087 | } |
| | | 5088 | |
| | | 5089 | return (zfs_read(vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL)); |
5077 | } | | 5090 | } |
5078 | | | 5091 | |
5079 | static int | | 5092 | static int |
5080 | zfs_netbsd_write(void *v) | | 5093 | zfs_netbsd_write(void *v) |
5081 | { | | 5094 | { |
5082 | struct vop_write_args *ap = v; | | 5095 | struct vop_write_args *ap = v; |
| | | 5096 | vnode_t *vp = ap->a_vp; |
5083 | | | 5097 | |
5084 | return (zfs_write(ap->a_vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL)); | | 5098 | switch (vp->v_type) { |
| | | 5099 | case VBLK: |
| | | 5100 | case VCHR: |
| | | 5101 | GOP_MARKUPDATE(vp, GOP_UPDATE_MODIFIED); |
| | | 5102 | return (VOCALL(spec_vnodeop_p, VOFFSET(vop_write), ap)); |
| | | 5103 | case VFIFO: |
| | | 5104 | GOP_MARKUPDATE(vp, GOP_UPDATE_MODIFIED); |
| | | 5105 | return (VOCALL(fifo_vnodeop_p, VOFFSET(vop_write), ap)); |
| | | 5106 | } |
| | | 5107 | |
| | | 5108 | return (zfs_write(vp, ap->a_uio, ioflags(ap->a_ioflag), ap->a_cred, NULL)); |
5085 | } | | 5109 | } |
5086 | | | 5110 | |
5087 | static int | | 5111 | static int |
5088 | zfs_netbsd_access(void *v) | | 5112 | zfs_netbsd_access(void *v) |
5089 | { | | 5113 | { |
5090 | struct vop_access_args /* { | | 5114 | struct vop_access_args /* { |
5091 | struct vnode *a_vp; | | 5115 | struct vnode *a_vp; |
5092 | int a_mode; | | 5116 | int a_mode; |
5093 | kauth_cred_t a_cred; | | 5117 | kauth_cred_t a_cred; |
5094 | } */ *ap = v; | | 5118 | } */ *ap = v; |
5095 | struct vnode *vp = ap->a_vp; | | 5119 | struct vnode *vp = ap->a_vp; |
5096 | int mode = ap->a_mode; | | 5120 | int mode = ap->a_mode; |
5097 | mode_t zfs_mode = 0; | | 5121 | mode_t zfs_mode = 0; |
| @@ -5268,26 +5292,64 @@ zfs_netbsd_create(void *v) | | | @@ -5268,26 +5292,64 @@ zfs_netbsd_create(void *v) |
5268 | /* XXX !EXCL is wrong here... */ | | 5292 | /* XXX !EXCL is wrong here... */ |
5269 | error = zfs_create(dvp, nm, vap, !EXCL, mode, vpp, cnp->cn_cred, NULL); | | 5293 | error = zfs_create(dvp, nm, vap, !EXCL, mode, vpp, cnp->cn_cred, NULL); |
5270 | | | 5294 | |
5271 | PNBUF_PUT(nm); | | 5295 | PNBUF_PUT(nm); |
5272 | | | 5296 | |
5273 | KASSERT((error == 0) == (*vpp != NULL)); | | 5297 | KASSERT((error == 0) == (*vpp != NULL)); |
5274 | KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); | | 5298 | KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); |
5275 | VOP_UNLOCK(*vpp, 0); | | 5299 | VOP_UNLOCK(*vpp, 0); |
5276 | | | 5300 | |
5277 | return (error); | | 5301 | return (error); |
5278 | } | | 5302 | } |
5279 | | | 5303 | |
5280 | static int | | 5304 | static int |
| | | 5305 | zfs_netbsd_mknod(void *v) |
| | | 5306 | { |
| | | 5307 | struct vop_mknod_v3_args /* { |
| | | 5308 | struct vnode *a_dvp; |
| | | 5309 | struct vnode **a_vpp; |
| | | 5310 | struct componentname *a_cnp; |
| | | 5311 | struct vattr *a_vap; |
| | | 5312 | } */ *ap = v; |
| | | 5313 | struct vnode *dvp = ap->a_dvp; |
| | | 5314 | struct vnode **vpp = ap->a_vpp; |
| | | 5315 | struct componentname *cnp = ap->a_cnp; |
| | | 5316 | struct vattr *vap = ap->a_vap; |
| | | 5317 | char *nm; |
| | | 5318 | int mode; |
| | | 5319 | int error; |
| | | 5320 | |
| | | 5321 | KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); |
| | | 5322 | |
| | | 5323 | vattr_init_mask(vap); |
| | | 5324 | mode = vap->va_mode & ALLPERMS; |
| | | 5325 | |
| | | 5326 | /* ZFS wants a null-terminated name. */ |
| | | 5327 | nm = PNBUF_GET(); |
| | | 5328 | (void)strlcpy(nm, cnp->cn_nameptr, cnp->cn_namelen + 1); |
| | | 5329 | |
| | | 5330 | /* XXX !EXCL is wrong here... */ |
| | | 5331 | error = zfs_create(dvp, nm, vap, !EXCL, mode, vpp, cnp->cn_cred, NULL); |
| | | 5332 | |
| | | 5333 | PNBUF_PUT(nm); |
| | | 5334 | |
| | | 5335 | KASSERT((error == 0) == (*vpp != NULL)); |
| | | 5336 | KASSERT(VOP_ISLOCKED(dvp) == LK_EXCLUSIVE); |
| | | 5337 | VOP_UNLOCK(*vpp, 0); |
| | | 5338 | |
| | | 5339 | return (error); |
| | | 5340 | } |
| | | 5341 | |
| | | 5342 | static int |
5281 | zfs_netbsd_remove(void *v) | | 5343 | zfs_netbsd_remove(void *v) |
5282 | { | | 5344 | { |
5283 | struct vop_remove_v2_args /* { | | 5345 | struct vop_remove_v2_args /* { |
5284 | struct vnode *a_dvp; | | 5346 | struct vnode *a_dvp; |
5285 | struct vnode *a_vp; | | 5347 | struct vnode *a_vp; |
5286 | struct componentname *a_cnp; | | 5348 | struct componentname *a_cnp; |
5287 | } */ *ap = v; | | 5349 | } */ *ap = v; |
5288 | struct vnode *dvp = ap->a_dvp; | | 5350 | struct vnode *dvp = ap->a_dvp; |
5289 | struct vnode *vp = ap->a_vp; | | 5351 | struct vnode *vp = ap->a_vp; |
5290 | struct componentname *cnp = ap->a_cnp; | | 5352 | struct componentname *cnp = ap->a_cnp; |
5291 | char *nm; | | 5353 | char *nm; |
5292 | int error; | | 5354 | int error; |
5293 | | | 5355 | |
| @@ -6139,26 +6201,27 @@ const struct genfs_ops zfs_genfsops = { | | | @@ -6139,26 +6201,27 @@ const struct genfs_ops zfs_genfsops = { |
6139 | | | 6201 | |
6140 | #define zfs_netbsd_lock genfs_lock | | 6202 | #define zfs_netbsd_lock genfs_lock |
6141 | #define zfs_netbsd_unlock genfs_unlock | | 6203 | #define zfs_netbsd_unlock genfs_unlock |
6142 | #define zfs_netbsd_islocked genfs_islocked | | 6204 | #define zfs_netbsd_islocked genfs_islocked |
6143 | #define zfs_netbsd_seek genfs_seek | | 6205 | #define zfs_netbsd_seek genfs_seek |
6144 | #define zfs_netbsd_mmap genfs_mmap | | 6206 | #define zfs_netbsd_mmap genfs_mmap |
6145 | #define zfs_netbsd_fcntl genfs_fcntl | | 6207 | #define zfs_netbsd_fcntl genfs_fcntl |
6146 | | | 6208 | |
6147 | int (**zfs_vnodeop_p)(void *); | | 6209 | int (**zfs_vnodeop_p)(void *); |
6148 | const struct vnodeopv_entry_desc zfs_vnodeop_entries[] = { | | 6210 | const struct vnodeopv_entry_desc zfs_vnodeop_entries[] = { |
6149 | { &vop_default_desc, vn_default_error }, | | 6211 | { &vop_default_desc, vn_default_error }, |
6150 | { &vop_lookup_desc, zfs_netbsd_lookup }, | | 6212 | { &vop_lookup_desc, zfs_netbsd_lookup }, |
6151 | { &vop_create_desc, zfs_netbsd_create }, | | 6213 | { &vop_create_desc, zfs_netbsd_create }, |
| | | 6214 | { &vop_mknod_desc, zfs_netbsd_mknod }, |
6152 | { &vop_open_desc, zfs_netbsd_open }, | | 6215 | { &vop_open_desc, zfs_netbsd_open }, |
6153 | { &vop_close_desc, zfs_netbsd_close }, | | 6216 | { &vop_close_desc, zfs_netbsd_close }, |
6154 | { &vop_access_desc, zfs_netbsd_access }, | | 6217 | { &vop_access_desc, zfs_netbsd_access }, |
6155 | { &vop_getattr_desc, zfs_netbsd_getattr }, | | 6218 | { &vop_getattr_desc, zfs_netbsd_getattr }, |
6156 | { &vop_setattr_desc, zfs_netbsd_setattr }, | | 6219 | { &vop_setattr_desc, zfs_netbsd_setattr }, |
6157 | { &vop_read_desc, zfs_netbsd_read }, | | 6220 | { &vop_read_desc, zfs_netbsd_read }, |
6158 | { &vop_write_desc, zfs_netbsd_write }, | | 6221 | { &vop_write_desc, zfs_netbsd_write }, |
6159 | { &vop_ioctl_desc, zfs_netbsd_ioctl }, | | 6222 | { &vop_ioctl_desc, zfs_netbsd_ioctl }, |
6160 | { &vop_fsync_desc, zfs_netbsd_fsync }, | | 6223 | { &vop_fsync_desc, zfs_netbsd_fsync }, |
6161 | { &vop_remove_desc, zfs_netbsd_remove }, | | 6224 | { &vop_remove_desc, zfs_netbsd_remove }, |
6162 | { &vop_link_desc, zfs_netbsd_link }, | | 6225 | { &vop_link_desc, zfs_netbsd_link }, |
6163 | { &vop_lock_desc, zfs_netbsd_lock }, | | 6226 | { &vop_lock_desc, zfs_netbsd_lock }, |
6164 | { &vop_unlock_desc, zfs_netbsd_unlock }, | | 6227 | { &vop_unlock_desc, zfs_netbsd_unlock }, |
| @@ -6175,14 +6238,97 @@ const struct vnodeopv_entry_desc zfs_vno | | | @@ -6175,14 +6238,97 @@ const struct vnodeopv_entry_desc zfs_vno |
6175 | { &vop_getpages_desc, zfs_netbsd_getpages }, | | 6238 | { &vop_getpages_desc, zfs_netbsd_getpages }, |
6176 | { &vop_putpages_desc, zfs_netbsd_putpages }, | | 6239 | { &vop_putpages_desc, zfs_netbsd_putpages }, |
6177 | { &vop_mmap_desc, zfs_netbsd_mmap }, | | 6240 | { &vop_mmap_desc, zfs_netbsd_mmap }, |
6178 | { &vop_islocked_desc, zfs_netbsd_islocked }, | | 6241 | { &vop_islocked_desc, zfs_netbsd_islocked }, |
6179 | { &vop_advlock_desc, zfs_netbsd_advlock }, | | 6242 | { &vop_advlock_desc, zfs_netbsd_advlock }, |
6180 | { &vop_print_desc, zfs_netbsd_print }, | | 6243 | { &vop_print_desc, zfs_netbsd_print }, |
6181 | { &vop_fcntl_desc, zfs_netbsd_fcntl }, | | 6244 | { &vop_fcntl_desc, zfs_netbsd_fcntl }, |
6182 | { NULL, NULL } | | 6245 | { NULL, NULL } |
6183 | }; | | 6246 | }; |
6184 | | | 6247 | |
6185 | const struct vnodeopv_desc zfs_vnodeop_opv_desc = | | 6248 | const struct vnodeopv_desc zfs_vnodeop_opv_desc = |
6186 | { &zfs_vnodeop_p, zfs_vnodeop_entries }; | | 6249 | { &zfs_vnodeop_p, zfs_vnodeop_entries }; |
6187 | | | 6250 | |
| | | 6251 | int (**zfs_specop_p)(void *); |
| | | 6252 | const struct vnodeopv_entry_desc zfs_specop_entries[] = { |
| | | 6253 | { &vop_default_desc, vn_default_error }, |
| | | 6254 | { &vop_lookup_desc, spec_lookup }, |
| | | 6255 | { &vop_create_desc, spec_create }, |
| | | 6256 | { &vop_mknod_desc, spec_mknod }, |
| | | 6257 | { &vop_open_desc, spec_open }, |
| | | 6258 | { &vop_close_desc, spec_close }, |
| | | 6259 | { &vop_access_desc, zfs_netbsd_access }, |
| | | 6260 | { &vop_getattr_desc, zfs_netbsd_getattr }, |
| | | 6261 | { &vop_setattr_desc, zfs_netbsd_setattr }, |
| | | 6262 | { &vop_read_desc, /**/zfs_netbsd_read }, |
| | | 6263 | { &vop_write_desc, /**/zfs_netbsd_write }, |
| | | 6264 | { &vop_ioctl_desc, spec_ioctl }, |
| | | 6265 | { &vop_fsync_desc, zfs_netbsd_fsync }, |
| | | 6266 | { &vop_remove_desc, spec_remove }, |
| | | 6267 | { &vop_link_desc, spec_link }, |
| | | 6268 | { &vop_lock_desc, zfs_netbsd_lock }, |
| | | 6269 | { &vop_unlock_desc, zfs_netbsd_unlock }, |
| | | 6270 | { &vop_rename_desc, spec_rename }, |
| | | 6271 | { &vop_mkdir_desc, spec_mkdir }, |
| | | 6272 | { &vop_rmdir_desc, spec_rmdir }, |
| | | 6273 | { &vop_symlink_desc, spec_symlink }, |
| | | 6274 | { &vop_readdir_desc, spec_readdir }, |
| | | 6275 | { &vop_readlink_desc, spec_readlink }, |
| | | 6276 | { &vop_inactive_desc, zfs_netbsd_inactive }, |
| | | 6277 | { &vop_reclaim_desc, zfs_netbsd_reclaim }, |
| | | 6278 | { &vop_pathconf_desc, spec_pathconf }, |
| | | 6279 | { &vop_seek_desc, spec_seek }, |
| | | 6280 | { &vop_getpages_desc, spec_getpages }, |
| | | 6281 | { &vop_putpages_desc, spec_putpages }, |
| | | 6282 | { &vop_mmap_desc, spec_mmap }, |
| | | 6283 | { &vop_islocked_desc, zfs_netbsd_islocked }, |
| | | 6284 | { &vop_advlock_desc, spec_advlock }, |
| | | 6285 | { &vop_print_desc, zfs_netbsd_print }, |
| | | 6286 | { &vop_fcntl_desc, zfs_netbsd_fcntl }, |
| | | 6287 | { NULL, NULL } |
| | | 6288 | }; |
| | | 6289 | |
| | | 6290 | const struct vnodeopv_desc zfs_specop_opv_desc = |
| | | 6291 | { &zfs_specop_p, zfs_specop_entries }; |
| | | 6292 | |
| | | 6293 | int (**zfs_fifoop_p)(void *); |
| | | 6294 | const struct vnodeopv_entry_desc zfs_fifoop_entries[] = { |
| | | 6295 | { &vop_default_desc, vn_default_error }, |
| | | 6296 | { &vop_lookup_desc, vn_fifo_bypass }, |
| | | 6297 | { &vop_create_desc, vn_fifo_bypass }, |
| | | 6298 | { &vop_mknod_desc, vn_fifo_bypass }, |
| | | 6299 | { &vop_open_desc, vn_fifo_bypass }, |
| | | 6300 | { &vop_close_desc, vn_fifo_bypass }, |
| | | 6301 | { &vop_access_desc, zfs_netbsd_access }, |
| | | 6302 | { &vop_getattr_desc, zfs_netbsd_getattr }, |
| | | 6303 | { &vop_setattr_desc, zfs_netbsd_setattr }, |
| | | 6304 | { &vop_read_desc, /**/zfs_netbsd_read }, |
| | | 6305 | { &vop_write_desc, /**/zfs_netbsd_write }, |
| | | 6306 | { &vop_ioctl_desc, vn_fifo_bypass }, |
| | | 6307 | { &vop_fsync_desc, zfs_netbsd_fsync }, |
| | | 6308 | { &vop_remove_desc, vn_fifo_bypass }, |
| | | 6309 | { &vop_link_desc, vn_fifo_bypass }, |
| | | 6310 | { &vop_lock_desc, zfs_netbsd_lock }, |
| | | 6311 | { &vop_unlock_desc, zfs_netbsd_unlock }, |
| | | 6312 | { &vop_rename_desc, vn_fifo_bypass }, |
| | | 6313 | { &vop_mkdir_desc, vn_fifo_bypass }, |
| | | 6314 | { &vop_rmdir_desc, vn_fifo_bypass }, |
| | | 6315 | { &vop_symlink_desc, vn_fifo_bypass }, |
| | | 6316 | { &vop_readdir_desc, vn_fifo_bypass }, |
| | | 6317 | { &vop_readlink_desc, vn_fifo_bypass }, |
| | | 6318 | { &vop_inactive_desc, zfs_netbsd_inactive }, |
| | | 6319 | { &vop_reclaim_desc, zfs_netbsd_reclaim }, |
| | | 6320 | { &vop_pathconf_desc, vn_fifo_bypass }, |
| | | 6321 | { &vop_seek_desc, vn_fifo_bypass }, |
| | | 6322 | { &vop_putpages_desc, vn_fifo_bypass }, |
| | | 6323 | { &vop_mmap_desc, vn_fifo_bypass }, |
| | | 6324 | { &vop_islocked_desc, zfs_netbsd_islocked }, |
| | | 6325 | { &vop_advlock_desc, vn_fifo_bypass }, |
| | | 6326 | { &vop_print_desc, zfs_netbsd_print }, |
| | | 6327 | { &vop_fcntl_desc, zfs_netbsd_fcntl }, |
| | | 6328 | { NULL, NULL } |
| | | 6329 | }; |
| | | 6330 | |
| | | 6331 | const struct vnodeopv_desc zfs_fifoop_opv_desc = |
| | | 6332 | { &zfs_fifoop_p, zfs_fifoop_entries }; |
| | | 6333 | |
6188 | #endif /* __NetBSD__ */ | | 6334 | #endif /* __NetBSD__ */ |