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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright (c) 1996-1998 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27#ifndef _SYS_FS_CACHEFS_FILEGRP_H
28#define	_SYS_FS_CACHEFS_FILEGRP_H
29
30#pragma ident	"%Z%%M%	%I%	%E% SMI"
31
32#ifdef __cplusplus
33extern "C" {
34#endif
35
36struct cachefs_metadata;
37
38/*
39 * filegrp structure represents a group of front files.
40 */
41struct filegrp {
42	uint_t			 fg_flags;	/* CFS_FS_* flags */
43	int			 fg_count;	/* cnodes in group */
44	cfs_cid_t		 fg_id;		/* starting id in group */
45	struct fscache		*fg_fscp;	/* back ptr to fscache */
46
47	struct cnode		*fg_cnodelist;	/* list of cnodes */
48
49	struct filegrp		*fg_next;	/* pointer to next */
50	struct vnode		*fg_dirvp;	/* filegrp directory vp */
51	struct vnode		*fg_attrvp;	/* attrcache vp */
52	struct attrcache_header	*fg_header;	/* Attrcache header */
53	struct attrcache_index	*fg_offsets;	/* ptr to indexes in header */
54	uchar_t			*fg_alloclist;	/* allocation bitmap */
55
56	int			 fg_headersize;	/* attrcache header size */
57	int			 fg_filesize;	/* size of attrcache file */
58	kmutex_t		 fg_mutex;	/* filegrp contents/ac lock */
59	kmutex_t		 fg_cnodelock;	/* cnode list lock */
60};
61typedef struct filegrp filegrp_t;
62
63extern struct kmem_cache *cachefs_filegrp_cache;
64
65/* fg_flags values */
66#define	CFS_FG_NOCACHE		0x1	/* no cache mode */
67#define	CFS_FG_ALLOC_ATTR	0x2	/* no attrcache file yet */
68#define	CFS_FG_UPDATED		0x4	/* attrcache modified */
69#define	CFS_FG_ALLOC_FILE	0x10	/* no front file dir yet */
70#define	CFS_FG_RL		0x20	/* no longer used */
71#define	CFS_FG_READ		0x40	/* attrcache can be read */
72#define	CFS_FG_WRITE		0x80	/* attrcache can be written */
73
74int filegrp_cache_create(void *, void *, int);
75void filegrp_cache_destroy(void *, void *);
76filegrp_t *filegrp_create(struct fscache *fscp, cfs_cid_t *cidp);
77void filegrp_destroy(filegrp_t *fgp);
78int filegrp_allocattr(filegrp_t *fgp);
79int filegrpdir_create(filegrp_t *fgp);
80int filegrpdir_find(filegrp_t *fgp);
81void filegrp_hold(filegrp_t *fgp);
82void filegrp_rele(filegrp_t *fgp);
83int filegrp_ffhold(filegrp_t *fgp);
84void filegrp_ffrele(filegrp_t *fgp);
85
86int filegrp_sync(filegrp_t *fgp);
87int filegrp_read_metadata(filegrp_t *fgp, cfs_cid_t *cidp,
88    struct cachefs_metadata *mdp);
89int filegrp_create_metadata(filegrp_t *fgp, struct cachefs_metadata *md,
90    cfs_cid_t *cidp);
91int filegrp_write_metadata(filegrp_t *fgp, cfs_cid_t *cidp,
92    struct cachefs_metadata *mdp);
93int filegrp_destroy_metadata(filegrp_t *fgp, cfs_cid_t *cidp);
94int filegrp_cid_to_slot(filegrp_t *fgp, cfs_cid_t *cidp);
95
96filegrp_t *filegrp_list_find(struct fscache *fscp, cfs_cid_t *cidp);
97void filegrp_list_add(struct fscache *fscp, filegrp_t *fgp);
98void filegrp_list_remove(struct fscache *fscp, filegrp_t *fgp);
99void filegrp_list_gc(struct fscache *fscp);
100void filegrp_list_enable_caching_ro(struct fscache *fscp);
101void filegrp_list_enable_caching_rw(struct fscache *fscp);
102
103#ifdef __cplusplus
104}
105#endif
106
107#endif /* _SYS_FS_CACHEFS_FILEGRP_H */
108