Home | History | Annotate | Download | only in fs
      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 /*
     22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
     23  * Use is subject to license terms.
     24  */
     25 
     26 #ifndef	_SYS_FS_PC_NODE_H
     27 #define	_SYS_FS_PC_NODE_H
     28 
     29 #ifdef	__cplusplus
     30 extern "C" {
     31 #endif
     32 
     33 #include <vm/page.h>
     34 #include <sys/buf.h>
     35 #include <sys/vnode.h>
     36 
     37 #ifdef _KERNEL
     38 #include <sys/vfs_opreg.h>
     39 #endif
     40 
     41 /*
     42  * This overlays the fid structure (see vfs.h)
     43  *
     44  * 10 bytes max.
     45  */
     46 struct pc_fid {
     47 	ushort_t	pcfid_len;
     48 	uint32_t	pcfid_block;	/* dblock containing directory entry */
     49 	uint16_t	pcfid_offset;	/* offset within block of entry */
     50 	uint16_t	pcfid_ctime;	/* creation time of entry (~= i_gen) */
     51 };
     52 
     53 struct pcnode {
     54 	struct pcnode	*pc_forw;	/* active list ptrs, must be first */
     55 	struct pcnode	*pc_back;
     56 	int pc_flags;			/* see below */
     57 	struct vnode	*pc_vn;		/* vnode for pcnode */
     58 	uint_t pc_size;			/* size of file */
     59 	pc_cluster32_t	pc_scluster;	/* starting cluster of file */
     60 	daddr_t pc_eblkno;		/* disk blkno for entry */
     61 	int pc_eoffset;			/* offset in disk block of entry */
     62 	struct pcdir pc_entry;		/* directory entry of file */
     63 	pc_cluster32_t	pc_lcluster;	/* last cluster visited */
     64 	daddr_t		pc_lindex;	/* index of last cluster visited */
     65 };
     66 
     67 /*
     68  * flags
     69  */
     70 #define	PC_MOD		0x01		/* file data has been modified */
     71 #define	PC_CHG		0x02		/* node data has been changed */
     72 #define	PC_INVAL	0x04		/* node is invalid */
     73 #define	PC_EXTERNAL	0x08		/* vnode ref is held externally */
     74 #define	PC_ACC		0x10		/* file data has been accessed */
     75 #define	PC_RELEHOLD	0x80		/* node is being released */
     76 
     77 #define	PCTOV(PCP)	((PCP)->pc_vn)
     78 #define	VTOPC(VP)	((struct pcnode *)((VP)->v_data))
     79 
     80 /*
     81  * Make a unique integer for a file
     82  */
     83 #define	pc_makenodeid(BN, OFF, ATTR, SCLUSTER, ENTPS) \
     84 	(ino_t)((ATTR) & PCA_DIR ? \
     85 		(uint32_t)(-(SCLUSTER) - 1) : \
     86 		((BN) * (ENTPS)) + ((OFF) / sizeof (struct pcdir)))
     87 
     88 #define	NPCHASH 1
     89 
     90 #if NPCHASH == 1
     91 #define	PCFHASH(FSP, BN, O)	0
     92 #define	PCDHASH(FSP, SC)	0
     93 #else
     94 #define	PCFHASH(FSP, BN, O)	(((unsigned)FSP + BN + O) % NPCHASH)
     95 #define	PCDHASH(FSP, SC)	(((unsigned)FSP + SC) % NPCHASH)
     96 #endif
     97 
     98 struct pchead {
     99 	struct pcnode *pch_forw;
    100 	struct pcnode *pch_back;
    101 };
    102 
    103 /*
    104  * pcnode file and directory operations vectors
    105  */
    106 extern struct vnodeops *pcfs_fvnodeops;
    107 extern struct vnodeops *pcfs_dvnodeops;
    108 
    109 #ifdef _KERNEL
    110 extern const struct fs_operation_def pcfs_fvnodeops_template[];
    111 extern const struct fs_operation_def pcfs_dvnodeops_template[];
    112 #endif
    113 
    114 extern struct pchead pcfhead[];
    115 extern struct pchead pcdhead[];
    116 
    117 /*
    118  * pcnode routines
    119  */
    120 extern void pc_init(void);
    121 extern struct pcnode *pc_getnode(struct pcfs *, daddr_t, int, struct pcdir *);
    122 extern void pc_rele(struct pcnode *);
    123 extern void pc_mark_mod(struct pcfs *, struct pcnode *);
    124 extern void pc_mark_acc(struct pcfs *, struct pcnode *);
    125 extern int pc_nodesync(struct pcnode *);
    126 extern int pc_nodeupdate(struct pcnode *);
    127 extern int pc_bmap(struct pcnode *, daddr_t, daddr_t *, uint_t *);
    128 
    129 extern int pc_balloc(struct pcnode *, daddr_t, int, daddr_t *);
    130 extern int pc_bfree(struct pcnode *, pc_cluster32_t);
    131 extern int pc_verify(struct pcfs *);
    132 extern void pc_diskchanged(struct pcfs *);
    133 extern void pc_mark_irrecov(struct pcfs *);
    134 
    135 extern int pc_dirlook(struct pcnode *, char *, struct pcnode **);
    136 extern int pc_direnter(struct pcnode *, char *, struct vattr *,
    137 	struct pcnode **);
    138 extern int pc_dirremove(struct pcnode *, char *, struct vnode *, enum vtype,
    139 		caller_context_t *);
    140 extern int pc_rename(struct pcnode *, struct pcnode *, char *, char *,
    141 		caller_context_t *);
    142 extern int pc_blkatoff(struct pcnode *, offset_t, struct buf **,
    143 	struct pcdir **);
    144 extern int pc_truncate(struct pcnode *, uint_t);
    145 extern int pc_fileclsize(struct pcfs *, pc_cluster32_t, pc_cluster32_t *);
    146 extern int pcfs_putapage(struct vnode *, page_t *, u_offset_t *, size_t *, int,
    147 	struct cred *);
    148 extern void pc_badfs(struct pcfs *);
    149 
    150 #ifdef	__cplusplus
    151 }
    152 #endif
    153 
    154 #endif	/* _SYS_FS_PC_NODE_H */
    155