1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 22/* All Rights Reserved */ 23 24/* 25 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 26 * Use is subject to license terms. 27 */ 28 29#ifndef _SYS_FS_NAMENODE_H 30#define _SYS_FS_NAMENODE_H 31 32#if defined(_KERNEL) 33#include <sys/vnode.h> 34#include <sys/vfs_opreg.h> 35#endif 36 37#ifdef __cplusplus 38extern "C" { 39#endif 40 41/* 42 * This structure is used to pass a file descriptor from user 43 * level to the kernel. It is first used by fattach() and then 44 * be NAMEFS. 45 */ 46struct namefd { 47 int fd; 48}; 49 50#if defined(_KERNEL) 51/* 52 * Each NAMEFS object is identified by a struct namenode/vnode pair. 53 */ 54struct namenode { 55 struct vnode *nm_vnode; /* represents mounted file desc. */ 56 int nm_flag; /* flags defined below */ 57 struct vattr nm_vattr; /* attributes of mounted file desc. */ 58 struct vnode *nm_filevp; /* file desc. prior to mounting */ 59 struct file *nm_filep; /* file pointer of nm_filevp */ 60 struct vnode *nm_mountpt; /* mount point prior to mounting */ 61 struct namenode *nm_nextp; /* next link in the linked list */ 62 kmutex_t nm_lock; /* protects nm_vattr */ 63}; 64 65/* 66 * Valid flags for namenodes. 67 */ 68#define NMNMNT 0x01 /* namenode not mounted */ 69 70/* 71 * Macros to convert a vnode to a namenode, and vice versa. 72 */ 73#define VTONM(vp) ((struct namenode *)((vp)->v_data)) 74#define NMTOV(nm) ((nm)->nm_vnode) 75 76#define NM_FILEVP_HASH_SIZE 64 77#define NM_FILEVP_HASH_MASK (NM_FILEVP_HASH_SIZE - 1) 78#define NM_FILEVP_HASH_SHIFT 7 79#define NM_FILEVP_HASH(vp) (&nm_filevp_hash[(((uintptr_t)vp) >> \ 80 NM_FILEVP_HASH_SHIFT) & NM_FILEVP_HASH_MASK]) 81 82extern struct namenode *nm_filevp_hash[NM_FILEVP_HASH_SIZE]; 83extern struct vfs namevfs; 84 85extern int nameinit(int, char *); 86extern int nm_unmountall(struct vnode *, struct cred *); 87extern void nameinsert(struct namenode *); 88extern void nameremove(struct namenode *); 89extern struct namenode *namefind(struct vnode *, struct vnode *); 90extern uint64_t namenodeno_alloc(void); 91extern void namenodeno_free(uint64_t); 92extern struct vnodeops *nm_vnodeops; 93extern const struct fs_operation_def nm_vnodeops_template[]; 94extern kmutex_t ntable_lock; 95 96#endif /* _KERNEL */ 97 98#ifdef __cplusplus 99} 100#endif 101 102#endif /* _SYS_FS_NAMENODE_H */ 103