1 1.48 hannken /* $NetBSD: sysvbfs_vfsops.c,v 1.48 2022/05/03 07:34:38 hannken Exp $ */ 2 1.1 tsutsui 3 1.1 tsutsui /*- 4 1.1 tsutsui * Copyright (c) 2004 The NetBSD Foundation, Inc. 5 1.1 tsutsui * All rights reserved. 6 1.1 tsutsui * 7 1.1 tsutsui * This code is derived from software contributed to The NetBSD Foundation 8 1.1 tsutsui * by UCHIYAMA Yasushi. 9 1.1 tsutsui * 10 1.1 tsutsui * Redistribution and use in source and binary forms, with or without 11 1.1 tsutsui * modification, are permitted provided that the following conditions 12 1.1 tsutsui * are met: 13 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright 14 1.1 tsutsui * notice, this list of conditions and the following disclaimer. 15 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the 17 1.1 tsutsui * documentation and/or other materials provided with the distribution. 18 1.1 tsutsui * 19 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 tsutsui * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 tsutsui * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 tsutsui * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 tsutsui * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 tsutsui * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 tsutsui * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 tsutsui * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 tsutsui * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 tsutsui * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 tsutsui * POSSIBILITY OF SUCH DAMAGE. 30 1.1 tsutsui */ 31 1.1 tsutsui 32 1.1 tsutsui #include <sys/cdefs.h> 33 1.48 hannken __KERNEL_RCSID(0, "$NetBSD: sysvbfs_vfsops.c,v 1.48 2022/05/03 07:34:38 hannken Exp $"); 34 1.1 tsutsui 35 1.1 tsutsui #include <sys/types.h> 36 1.1 tsutsui #include <sys/param.h> 37 1.1 tsutsui #include <sys/systm.h> 38 1.1 tsutsui #include <sys/pool.h> 39 1.1 tsutsui #include <sys/time.h> 40 1.1 tsutsui #include <sys/ucred.h> 41 1.1 tsutsui #include <sys/mount.h> 42 1.1 tsutsui #include <sys/fcntl.h> 43 1.1 tsutsui #include <sys/malloc.h> 44 1.4 yamt #include <sys/kauth.h> 45 1.14 ad #include <sys/proc.h> 46 1.1 tsutsui 47 1.1 tsutsui /* v-node */ 48 1.1 tsutsui #include <sys/namei.h> 49 1.1 tsutsui #include <sys/vnode.h> 50 1.1 tsutsui /* devsw */ 51 1.1 tsutsui #include <sys/conf.h> 52 1.1 tsutsui 53 1.1 tsutsui #include <fs/sysvbfs/sysvbfs.h> /* external interface */ 54 1.1 tsutsui #include <fs/sysvbfs/bfs.h> /* internal interface */ 55 1.1 tsutsui 56 1.1 tsutsui #ifdef SYSVBFS_VNOPS_DEBUG 57 1.1 tsutsui #define DPRINTF(fmt, args...) printf(fmt, ##args) 58 1.1 tsutsui #else 59 1.1 tsutsui #define DPRINTF(arg...) ((void)0) 60 1.1 tsutsui #endif 61 1.1 tsutsui 62 1.11 pooka MALLOC_JUSTDEFINE(M_SYSVBFS_VFS, "sysvbfs vfs", "sysvbfs vfs structures"); 63 1.1 tsutsui 64 1.11 pooka struct pool sysvbfs_node_pool; 65 1.1 tsutsui 66 1.1 tsutsui int sysvbfs_mountfs(struct vnode *, struct mount *, struct lwp *); 67 1.1 tsutsui 68 1.1 tsutsui int 69 1.18 pooka sysvbfs_mount(struct mount *mp, const char *path, void *data, size_t *data_len) 70 1.1 tsutsui { 71 1.18 pooka struct lwp *l = curlwp; 72 1.12 dsl struct sysvbfs_args *args = data; 73 1.1 tsutsui struct sysvbfs_mount *bmp = NULL; 74 1.1 tsutsui struct vnode *devvp = NULL; 75 1.40 joerg int error = 0; 76 1.8 thorpej bool update; 77 1.1 tsutsui 78 1.20 perry DPRINTF("%s: mnt_flag=%x\n", __func__, mp->mnt_flag); 79 1.1 tsutsui 80 1.43 maxv if (args == NULL) 81 1.43 maxv return EINVAL; 82 1.12 dsl if (*data_len < sizeof *args) 83 1.12 dsl return EINVAL; 84 1.12 dsl 85 1.1 tsutsui if (mp->mnt_flag & MNT_GETARGS) { 86 1.42 mlelstv if ((bmp = (struct sysvbfs_mount *)mp->mnt_data) == NULL) 87 1.1 tsutsui return EIO; 88 1.12 dsl args->fspec = NULL; 89 1.12 dsl *data_len = sizeof *args; 90 1.12 dsl return 0; 91 1.1 tsutsui } 92 1.1 tsutsui 93 1.1 tsutsui 94 1.20 perry DPRINTF("%s: args->fspec=%s\n", __func__, args->fspec); 95 1.1 tsutsui update = mp->mnt_flag & MNT_UPDATE; 96 1.12 dsl if (args->fspec == NULL) { 97 1.1 tsutsui /* nothing to do. */ 98 1.1 tsutsui return EINVAL; 99 1.1 tsutsui } 100 1.1 tsutsui 101 1.12 dsl if (args->fspec != NULL) { 102 1.1 tsutsui /* Look up the name and verify that it's sane. */ 103 1.30 dholland error = namei_simple_user(args->fspec, 104 1.30 dholland NSM_FOLLOW_NOEMULROOT, &devvp); 105 1.30 dholland if (error != 0) 106 1.1 tsutsui return (error); 107 1.1 tsutsui 108 1.1 tsutsui if (!update) { 109 1.1 tsutsui /* 110 1.1 tsutsui * Be sure this is a valid block device 111 1.1 tsutsui */ 112 1.1 tsutsui if (devvp->v_type != VBLK) 113 1.1 tsutsui error = ENOTBLK; 114 1.22 ad else if (bdevsw_lookup(devvp->v_rdev) == NULL) 115 1.1 tsutsui error = ENXIO; 116 1.1 tsutsui } else { 117 1.1 tsutsui /* 118 1.1 tsutsui * Be sure we're still naming the same device 119 1.1 tsutsui * used for our initial mount 120 1.1 tsutsui */ 121 1.42 mlelstv bmp = (struct sysvbfs_mount *)mp->mnt_data; 122 1.1 tsutsui if (devvp != bmp->devvp) 123 1.1 tsutsui error = EINVAL; 124 1.1 tsutsui } 125 1.1 tsutsui } 126 1.1 tsutsui 127 1.1 tsutsui /* 128 1.1 tsutsui * If mount by non-root, then verify that user has necessary 129 1.1 tsutsui * permissions on the device. 130 1.29 elad * 131 1.29 elad * Permission to update a mount is checked higher, so here we presume 132 1.29 elad * updating the mount is okay (for example, as far as securelevel goes) 133 1.29 elad * which leaves us with the normal check. 134 1.1 tsutsui */ 135 1.29 elad if (error == 0) { 136 1.1 tsutsui int accessmode = VREAD; 137 1.1 tsutsui if (update ? 138 1.1 tsutsui (mp->mnt_iflag & IMNT_WANTRDWR) != 0 : 139 1.1 tsutsui (mp->mnt_flag & MNT_RDONLY) == 0) 140 1.1 tsutsui accessmode |= VWRITE; 141 1.39 elad 142 1.48 hannken vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); 143 1.39 elad error = kauth_authorize_system(l->l_cred, KAUTH_SYSTEM_MOUNT, 144 1.39 elad KAUTH_REQ_SYSTEM_MOUNT_DEVICE, mp, devvp, 145 1.39 elad KAUTH_ARG(accessmode)); 146 1.48 hannken VOP_UNLOCK(devvp); 147 1.1 tsutsui } 148 1.1 tsutsui 149 1.1 tsutsui if (error) { 150 1.1 tsutsui vrele(devvp); 151 1.1 tsutsui return error; 152 1.1 tsutsui } 153 1.1 tsutsui 154 1.1 tsutsui if (!update) { 155 1.1 tsutsui if ((error = sysvbfs_mountfs(devvp, mp, l)) != 0) { 156 1.1 tsutsui vrele(devvp); 157 1.1 tsutsui return error; 158 1.1 tsutsui } 159 1.1 tsutsui } else if (mp->mnt_flag & MNT_RDONLY) { 160 1.1 tsutsui /* XXX: r/w -> read only */ 161 1.1 tsutsui } 162 1.1 tsutsui 163 1.12 dsl return set_statvfs_info(path, UIO_USERSPACE, args->fspec, UIO_USERSPACE, 164 1.13 pooka mp->mnt_op->vfs_name, mp, l); 165 1.1 tsutsui } 166 1.1 tsutsui 167 1.1 tsutsui int 168 1.1 tsutsui sysvbfs_mountfs(struct vnode *devvp, struct mount *mp, struct lwp *l) 169 1.1 tsutsui { 170 1.6 ad kauth_cred_t cred = l->l_cred; 171 1.1 tsutsui struct sysvbfs_mount *bmp; 172 1.26 pooka int error, oflags; 173 1.1 tsutsui 174 1.1 tsutsui vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY); 175 1.1 tsutsui error = vinvalbuf(devvp, V_SAVE, cred, l, 0, 0); 176 1.1 tsutsui if (error) 177 1.31 pooka goto out; 178 1.1 tsutsui 179 1.1 tsutsui /* Open block device */ 180 1.26 pooka oflags = FREAD; 181 1.26 pooka if ((mp->mnt_flag & MNT_RDONLY) == 0) 182 1.26 pooka oflags |= FWRITE; 183 1.26 pooka if ((error = VOP_OPEN(devvp, oflags, NOCRED)) != 0) 184 1.31 pooka goto out; 185 1.1 tsutsui 186 1.38 christos bmp = malloc(sizeof(*bmp), M_SYSVBFS_VFS, M_WAITOK | M_ZERO); 187 1.1 tsutsui bmp->devvp = devvp; 188 1.1 tsutsui bmp->mountp = mp; 189 1.1 tsutsui if ((error = sysvbfs_bfs_init(&bmp->bfs, devvp)) != 0) { 190 1.1 tsutsui free(bmp, M_SYSVBFS_VFS); 191 1.44 justin VOP_CLOSE(devvp, oflags, NOCRED); 192 1.31 pooka goto out; 193 1.1 tsutsui } 194 1.1 tsutsui 195 1.1 tsutsui mp->mnt_data = bmp; 196 1.1 tsutsui mp->mnt_stat.f_fsidx.__fsid_val[0] = (long)devvp->v_rdev; 197 1.1 tsutsui mp->mnt_stat.f_fsidx.__fsid_val[1] = makefstype(MOUNT_SYSVBFS); 198 1.1 tsutsui mp->mnt_stat.f_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0]; 199 1.33 njoly mp->mnt_stat.f_namemax = BFS_FILENAME_MAXLEN; 200 1.1 tsutsui mp->mnt_flag |= MNT_LOCAL; 201 1.10 tsutsui mp->mnt_dev_bshift = BFS_BSHIFT; 202 1.1 tsutsui mp->mnt_fs_bshift = BFS_BSHIFT; 203 1.1 tsutsui 204 1.31 pooka out: 205 1.32 hannken VOP_UNLOCK(devvp); 206 1.31 pooka return error; 207 1.1 tsutsui } 208 1.1 tsutsui 209 1.1 tsutsui int 210 1.18 pooka sysvbfs_start(struct mount *mp, int flags) 211 1.1 tsutsui { 212 1.1 tsutsui 213 1.20 perry DPRINTF("%s:\n", __func__); 214 1.1 tsutsui /* Nothing to do. */ 215 1.1 tsutsui return 0; 216 1.1 tsutsui } 217 1.1 tsutsui 218 1.1 tsutsui int 219 1.18 pooka sysvbfs_unmount(struct mount *mp, int mntflags) 220 1.1 tsutsui { 221 1.1 tsutsui struct sysvbfs_mount *bmp = (void *)mp->mnt_data; 222 1.1 tsutsui int error; 223 1.1 tsutsui 224 1.20 perry DPRINTF("%s: %p\n", __func__, bmp); 225 1.1 tsutsui 226 1.1 tsutsui if ((error = vflush(mp, NULLVP, 227 1.1 tsutsui mntflags & MNT_FORCE ? FORCECLOSE : 0)) != 0) 228 1.1 tsutsui return error; 229 1.1 tsutsui 230 1.1 tsutsui vn_lock(bmp->devvp, LK_EXCLUSIVE | LK_RETRY); 231 1.18 pooka error = VOP_CLOSE(bmp->devvp, FREAD, NOCRED); 232 1.1 tsutsui vput(bmp->devvp); 233 1.1 tsutsui 234 1.1 tsutsui sysvbfs_bfs_fini(bmp->bfs); 235 1.1 tsutsui 236 1.1 tsutsui free(bmp, M_SYSVBFS_VFS); 237 1.1 tsutsui mp->mnt_data = NULL; 238 1.1 tsutsui mp->mnt_flag &= ~MNT_LOCAL; 239 1.1 tsutsui 240 1.1 tsutsui return 0; 241 1.1 tsutsui } 242 1.1 tsutsui 243 1.1 tsutsui int 244 1.47 ad sysvbfs_root(struct mount *mp, int lktype, struct vnode **vpp) 245 1.1 tsutsui { 246 1.1 tsutsui struct vnode *vp; 247 1.1 tsutsui int error; 248 1.1 tsutsui 249 1.20 perry DPRINTF("%s:\n", __func__); 250 1.47 ad if ((error = VFS_VGET(mp, BFS_ROOT_INODE, lktype, &vp)) != 0) 251 1.1 tsutsui return error; 252 1.1 tsutsui *vpp = vp; 253 1.1 tsutsui 254 1.1 tsutsui return 0; 255 1.1 tsutsui } 256 1.1 tsutsui 257 1.1 tsutsui int 258 1.18 pooka sysvbfs_statvfs(struct mount *mp, struct statvfs *f) 259 1.1 tsutsui { 260 1.1 tsutsui struct sysvbfs_mount *bmp = mp->mnt_data; 261 1.1 tsutsui struct bfs *bfs = bmp->bfs; 262 1.1 tsutsui int free_block; 263 1.1 tsutsui size_t data_block; 264 1.1 tsutsui 265 1.1 tsutsui data_block = (bfs->data_end - bfs->data_start) >> BFS_BSHIFT; 266 1.1 tsutsui if (bfs_inode_alloc(bfs, 0, 0, &free_block) != 0) 267 1.1 tsutsui free_block = 0; 268 1.1 tsutsui else 269 1.1 tsutsui free_block = (bfs->data_end >> BFS_BSHIFT) - free_block; 270 1.1 tsutsui 271 1.20 perry DPRINTF("%s: %d %d %d\n", __func__, bfs->data_start, 272 1.1 tsutsui bfs->data_end, free_block); 273 1.1 tsutsui 274 1.1 tsutsui f->f_bsize = BFS_BSIZE; 275 1.1 tsutsui f->f_frsize = BFS_BSIZE; 276 1.1 tsutsui f->f_iosize = BFS_BSIZE; 277 1.1 tsutsui f->f_blocks = data_block; 278 1.1 tsutsui f->f_bfree = free_block; 279 1.1 tsutsui f->f_bavail = f->f_bfree; 280 1.1 tsutsui f->f_bresvd = 0; 281 1.41 agc f->f_files = bfs->max_inode; 282 1.41 agc f->f_ffree = bfs->max_inode - bfs->n_inode; 283 1.1 tsutsui f->f_favail = f->f_ffree; 284 1.1 tsutsui f->f_fresvd = 0; 285 1.1 tsutsui copy_statvfs_info(f, mp); 286 1.1 tsutsui 287 1.1 tsutsui return 0; 288 1.1 tsutsui } 289 1.1 tsutsui 290 1.1 tsutsui int 291 1.18 pooka sysvbfs_sync(struct mount *mp, int waitfor, kauth_cred_t cred) 292 1.1 tsutsui { 293 1.45 hannken struct vnode_iterator *marker; 294 1.45 hannken struct vnode *vp; 295 1.1 tsutsui int err, error; 296 1.1 tsutsui 297 1.20 perry DPRINTF("%s:\n", __func__); 298 1.1 tsutsui error = 0; 299 1.45 hannken vfs_vnode_iterator_init(mp, &marker); 300 1.45 hannken while ((vp = vfs_vnode_iterator_next(marker, NULL, NULL)) != NULL) { 301 1.45 hannken err = vn_lock(vp, LK_EXCLUSIVE); 302 1.45 hannken if (err) { 303 1.45 hannken vrele(vp); 304 1.45 hannken continue; 305 1.1 tsutsui } 306 1.45 hannken err = VOP_FSYNC(vp, cred, FSYNC_WAIT, 0, 0); 307 1.45 hannken vput(vp); 308 1.1 tsutsui if (err != 0) 309 1.1 tsutsui error = err; 310 1.1 tsutsui } 311 1.45 hannken vfs_vnode_iterator_destroy(marker); 312 1.1 tsutsui 313 1.1 tsutsui return error; 314 1.1 tsutsui } 315 1.1 tsutsui 316 1.1 tsutsui int 317 1.45 hannken sysvbfs_loadvnode(struct mount *mp, struct vnode *vp, 318 1.45 hannken const void *key, size_t key_len, const void **new_key) 319 1.1 tsutsui { 320 1.45 hannken struct sysvbfs_mount *bmp; 321 1.45 hannken struct bfs *bfs; 322 1.1 tsutsui struct sysvbfs_node *bnode; 323 1.1 tsutsui struct bfs_inode *inode; 324 1.45 hannken uint16_t ino; 325 1.45 hannken 326 1.45 hannken KASSERT(key_len == sizeof(ino)); 327 1.45 hannken memcpy(&ino, key, key_len); 328 1.45 hannken 329 1.45 hannken DPRINTF("%s: i-node=%u\n", __func__, ino); 330 1.45 hannken 331 1.45 hannken bmp = mp->mnt_data; 332 1.45 hannken bfs = bmp->bfs; 333 1.1 tsutsui 334 1.1 tsutsui /* Lookup requested i-node */ 335 1.1 tsutsui if (!bfs_inode_lookup(bfs, ino, &inode)) { 336 1.37 njoly DPRINTF("%s: bfs_inode_lookup failed.\n", __func__); 337 1.1 tsutsui return ENOENT; 338 1.1 tsutsui } 339 1.28 pooka 340 1.45 hannken bnode = pool_get(&sysvbfs_node_pool, PR_WAITOK); 341 1.46 hannken memset(bnode, 0, sizeof(*bnode)); 342 1.1 tsutsui 343 1.45 hannken vp->v_tag = VT_SYSVBFS; 344 1.45 hannken vp->v_op = sysvbfs_vnodeop_p; 345 1.45 hannken vp->v_data = bnode; 346 1.45 hannken if (ino == BFS_ROOT_INODE) { /* BFS is flat filesystem */ 347 1.45 hannken vp->v_type = VDIR; 348 1.45 hannken vp->v_vflag |= VV_ROOT; 349 1.45 hannken } else { 350 1.45 hannken vp->v_type = VREG; 351 1.1 tsutsui } 352 1.1 tsutsui 353 1.1 tsutsui bnode->vnode = vp; 354 1.1 tsutsui bnode->bmp = bmp; 355 1.1 tsutsui bnode->inode = inode; 356 1.1 tsutsui bnode->lockf = NULL; /* advlock */ 357 1.1 tsutsui 358 1.45 hannken genfs_node_init(vp, &sysvbfs_genfsops); 359 1.45 hannken uvm_vnp_setsize(vp, bfs_file_size(inode)); 360 1.45 hannken 361 1.45 hannken *new_key = &bnode->inode->number; 362 1.45 hannken 363 1.45 hannken return 0; 364 1.45 hannken } 365 1.45 hannken 366 1.45 hannken int 367 1.47 ad sysvbfs_vget(struct mount *mp, ino_t ino, int lktype, struct vnode **vpp) 368 1.45 hannken { 369 1.45 hannken int error; 370 1.45 hannken uint16_t number; 371 1.45 hannken struct vnode *vp; 372 1.45 hannken 373 1.45 hannken KASSERT(ino <= UINT16_MAX); 374 1.45 hannken number = ino; 375 1.45 hannken 376 1.45 hannken DPRINTF("%s: i-node=%u\n", __func__, number); 377 1.45 hannken 378 1.45 hannken error = vcache_get(mp, &number, sizeof(number), &vp); 379 1.45 hannken if (error) 380 1.45 hannken return error; 381 1.47 ad error = vn_lock(vp, lktype); 382 1.45 hannken if (error) { 383 1.45 hannken vrele(vp); 384 1.45 hannken return error; 385 1.1 tsutsui } 386 1.1 tsutsui 387 1.1 tsutsui *vpp = vp; 388 1.1 tsutsui 389 1.1 tsutsui return 0; 390 1.1 tsutsui } 391 1.1 tsutsui 392 1.1 tsutsui int 393 1.47 ad sysvbfs_fhtovp(struct mount *mp, struct fid *fid, int lktype, 394 1.47 ad struct vnode **vpp) 395 1.1 tsutsui { 396 1.1 tsutsui 397 1.20 perry DPRINTF("%s:\n", __func__); 398 1.1 tsutsui /* notyet */ 399 1.1 tsutsui return EOPNOTSUPP; 400 1.1 tsutsui } 401 1.1 tsutsui 402 1.1 tsutsui int 403 1.5 martin sysvbfs_vptofh(struct vnode *vpp, struct fid *fid, size_t *fh_size) 404 1.1 tsutsui { 405 1.1 tsutsui 406 1.20 perry DPRINTF("%s:\n", __func__); 407 1.1 tsutsui /* notyet */ 408 1.1 tsutsui return EOPNOTSUPP; 409 1.1 tsutsui } 410 1.1 tsutsui 411 1.11 pooka MALLOC_DECLARE(M_BFS); 412 1.11 pooka MALLOC_DECLARE(M_SYSVBFS_VNODE); 413 1.11 pooka 414 1.1 tsutsui void 415 1.1 tsutsui sysvbfs_init(void) 416 1.1 tsutsui { 417 1.1 tsutsui 418 1.20 perry DPRINTF("%s:\n", __func__); 419 1.11 pooka malloc_type_attach(M_SYSVBFS_VFS); 420 1.11 pooka malloc_type_attach(M_BFS); 421 1.11 pooka malloc_type_attach(M_SYSVBFS_VNODE); 422 1.11 pooka pool_init(&sysvbfs_node_pool, sizeof(struct sysvbfs_node), 0, 0, 0, 423 1.11 pooka "sysvbfs_node_pool", &pool_allocator_nointr, IPL_NONE); 424 1.1 tsutsui } 425 1.1 tsutsui 426 1.1 tsutsui void 427 1.1 tsutsui sysvbfs_reinit(void) 428 1.1 tsutsui { 429 1.1 tsutsui 430 1.1 tsutsui /* Nothing to do. */ 431 1.20 perry DPRINTF("%s:\n", __func__); 432 1.1 tsutsui } 433 1.1 tsutsui 434 1.1 tsutsui void 435 1.1 tsutsui sysvbfs_done(void) 436 1.1 tsutsui { 437 1.1 tsutsui 438 1.20 perry DPRINTF("%s:\n", __func__); 439 1.1 tsutsui pool_destroy(&sysvbfs_node_pool); 440 1.11 pooka malloc_type_detach(M_BFS); 441 1.11 pooka malloc_type_detach(M_SYSVBFS_VFS); 442 1.11 pooka malloc_type_detach(M_SYSVBFS_VNODE); 443 1.1 tsutsui } 444 1.1 tsutsui 445 1.1 tsutsui int 446 1.1 tsutsui sysvbfs_gop_alloc(struct vnode *vp, off_t off, off_t len, int flags, 447 1.3 elad kauth_cred_t cred) 448 1.1 tsutsui { 449 1.1 tsutsui 450 1.1 tsutsui return 0; 451 1.1 tsutsui } 452