1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc.
* All rights reserved. Use is subject to license terms.
*/
#ifndef _SYS_FS_TMP_H
#define _SYS_FS_TMP_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
/*
* tmpfs per-mount data structure.
*
* All fields are protected by tm_contents.
* File renames on a particular file system are protected tm_renamelck.
*/
struct tmount {
struct vfs *tm_vfsp; /* filesystem's vfs struct */
struct tmpnode *tm_rootnode; /* root tmpnode */
char *tm_mntpath; /* name of tmpfs mount point */
ulong_t tm_anonmax; /* file system max anon reservation */
pgcnt_t tm_anonmem; /* pages of reserved anon memory */
dev_t tm_dev; /* unique dev # of mounted `device' */
uint_t tm_gen; /* pseudo generation number for files */
kmutex_t tm_contents; /* lock for tmount structure */
kmutex_t tm_renamelck; /* rename lock for this mount */
};
/*
* File system independent to tmpfs conversion macros
*/
#define VFSTOTM(vfsp) ((struct tmount *)(vfsp)->vfs_data)
#define VTOTM(vp) ((struct tmount *)(vp)->v_vfsp->vfs_data)
#define VTOTN(vp) ((struct tmpnode *)(vp)->v_data)
#define TNTOV(tp) ((tp)->tn_vnode)
#define tmpnode_hold(tp) VN_HOLD(TNTOV(tp))
#define tmpnode_rele(tp) VN_RELE(TNTOV(tp))
/*
* enums
*/
enum de_op { DE_CREATE, DE_MKDIR, DE_LINK, DE_RENAME }; /* direnter ops */
enum dr_op { DR_REMOVE, DR_RMDIR, DR_RENAME }; /* dirremove ops */
/*
* tmpfs_minfree is the amount (in pages) of anonymous memory that tmpfs
* leaves free for the rest of the system. In antiquity, this number could be
* relevant on a system-wide basis, as physical DRAM was routinely exhausted;
* however, in more modern times, the relative growth of DRAM with respect to
* application footprint means that this number is only likely to become
* factor in a virtualized OS environment (e.g., a zone) -- and even then only
* when DRAM and swap have both been capped low to allow for maximum tenancy.
* TMPMINFREE -- the value from which tmpfs_minfree is derived -- should
* therefore be configured to a value that is roughly the smallest practical
* value for memory + swap minus the largest reasonable size for tmpfs in such
* a configuration. As of this writing, the smallest practical memory + swap
* configuration is 128MB, and it seems reasonable to allow tmpfs to consume
* no more than seven-eighths of this, yielding a TMPMINFREE of 16MB. Care
* should be exercised in changing this: tuning this value too high will
* result in spurious ENOSPC errors in tmpfs in small zones (a problem that
* can induce cascading failure surprisingly often); tuning this value too low
* will result in tmpfs consumption alone to alone induce application-level
* memory allocation failure.
*/
#define TMPMINFREE 16 * 1024 * 1024 /* 16 Megabytes */
extern size_t tmpfs_minfree; /* Anonymous memory in pages */
/*
* tmpfs can allocate only a certain percentage of kernel memory,
* which is used for tmpnodes, directories, file names, etc.
* This is statically set as TMPMAXFRACKMEM of physical memory.
* The actual number of allocatable bytes can be patched in tmpfs_maxkmem.
*/
#define TMPMAXFRACKMEM 25 /* 1/25 of physical memory */
extern size_t tmp_kmemspace;
extern size_t tmpfs_maxkmem; /* Allocatable kernel memory in bytes */
extern void tmpnode_init(struct tmount *, struct tmpnode *,
struct vattr *, struct cred *);
extern int tmpnode_trunc(struct tmount *, struct tmpnode *, ulong_t);
extern void tmpnode_growmap(struct tmpnode *, ulong_t);
extern int tdirlookup(struct tmpnode *, char *, struct tmpnode **,
struct cred *);
extern int tdirdelete(struct tmpnode *, struct tmpnode *, char *,
enum dr_op, struct cred *);
extern void tdirinit(struct tmpnode *, struct tmpnode *);
extern void tdirtrunc(struct tmpnode *);
extern void *tmp_memalloc(size_t, int);
extern void tmp_memfree(void *, size_t);
extern int tmp_resv(struct tmount *, struct tmpnode *, size_t, int);
extern int tmp_taccess(void *, int, struct cred *);
extern int tmp_sticky_remove_access(struct tmpnode *, struct tmpnode *,
struct cred *);
extern int tmp_convnum(char *, pgcnt_t *);
extern int tdirenter(struct tmount *, struct tmpnode *, char *,
enum de_op, struct tmpnode *, struct tmpnode *, struct vattr *,
struct tmpnode **, struct cred *, caller_context_t *);
#define TMP_MUSTHAVE 0x01
#ifdef __cplusplus
}
#endif
#endif /* _SYS_FS_TMP_H */
|