aufs: version string for 3.0
[zen-stable.git] / include / linux / aufs_type.h
blobc2ee31424c22e89f14f0e3fc37d9687ed17408c3
1 /*
2 * Copyright (C) 2005-2011 Junjiro R. Okajima
4 * This program, aufs is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 #ifndef __AUFS_TYPE_H__
20 #define __AUFS_TYPE_H__
22 #include <linux/ioctl.h>
23 #include <linux/kernel.h>
24 #include <linux/limits.h>
25 #include <linux/types.h>
27 #define AUFS_VERSION "3.0"
29 /* todo? move this to linux-2.6.19/include/magic.h */
30 #define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
32 /* ---------------------------------------------------------------------- */
34 #ifdef CONFIG_AUFS_BRANCH_MAX_127
35 typedef __s8 aufs_bindex_t;
36 #define AUFS_BRANCH_MAX 127
37 #else
38 typedef __s16 aufs_bindex_t;
39 #ifdef CONFIG_AUFS_BRANCH_MAX_511
40 #define AUFS_BRANCH_MAX 511
41 #elif defined(CONFIG_AUFS_BRANCH_MAX_1023)
42 #define AUFS_BRANCH_MAX 1023
43 #elif defined(CONFIG_AUFS_BRANCH_MAX_32767)
44 #define AUFS_BRANCH_MAX 32767
45 #endif
46 #endif
48 #ifdef __KERNEL__
49 #ifndef AUFS_BRANCH_MAX
50 #error unknown CONFIG_AUFS_BRANCH_MAX value
51 #endif
52 #endif /* __KERNEL__ */
54 /* ---------------------------------------------------------------------- */
56 #define AUFS_NAME "aufs"
57 #define AUFS_FSTYPE AUFS_NAME
59 #define AUFS_ROOT_INO 2
60 #define AUFS_FIRST_INO 11
62 #define AUFS_WH_PFX ".wh."
63 #define AUFS_WH_PFX_LEN ((int)sizeof(AUFS_WH_PFX) - 1)
64 #define AUFS_WH_TMP_LEN 4
65 /* a limit for rmdir/rename a dir */
66 #define AUFS_MAX_NAMELEN (NAME_MAX \
67 - AUFS_WH_PFX_LEN * 2 /* doubly whiteouted */\
68 - 1 /* dot */\
69 - AUFS_WH_TMP_LEN) /* hex */
70 #define AUFS_XINO_FNAME "." AUFS_NAME ".xino"
71 #define AUFS_XINO_DEFPATH "/tmp/" AUFS_XINO_FNAME
72 #define AUFS_XINO_TRUNC_INIT 64 /* blocks */
73 #define AUFS_XINO_TRUNC_STEP 4 /* blocks */
74 #define AUFS_DIRWH_DEF 3
75 #define AUFS_RDCACHE_DEF 10 /* seconds */
76 #define AUFS_RDCACHE_MAX 3600 /* seconds */
77 #define AUFS_RDBLK_DEF 512 /* bytes */
78 #define AUFS_RDHASH_DEF 32
79 #define AUFS_WKQ_NAME AUFS_NAME "d"
80 #define AUFS_WKQ_PRE_NAME AUFS_WKQ_NAME "_pre"
81 #define AUFS_MFS_DEF_SEC 30 /* seconds */
82 #define AUFS_MFS_MAX_SEC 3600 /* seconds */
83 #define AUFS_PLINK_WARN 100 /* number of plinks */
85 /* pseudo-link maintenace under /proc */
86 #define AUFS_PLINK_MAINT_NAME "plink_maint"
87 #define AUFS_PLINK_MAINT_DIR "fs/" AUFS_NAME
88 #define AUFS_PLINK_MAINT_PATH AUFS_PLINK_MAINT_DIR "/" AUFS_PLINK_MAINT_NAME
90 #define AUFS_DIROPQ_NAME AUFS_WH_PFX ".opq" /* whiteouted doubly */
91 #define AUFS_WH_DIROPQ AUFS_WH_PFX AUFS_DIROPQ_NAME
93 #define AUFS_BASE_NAME AUFS_WH_PFX AUFS_NAME
94 #define AUFS_PLINKDIR_NAME AUFS_WH_PFX "plnk"
95 #define AUFS_ORPHDIR_NAME AUFS_WH_PFX "orph"
97 /* doubly whiteouted */
98 #define AUFS_WH_BASE AUFS_WH_PFX AUFS_BASE_NAME
99 #define AUFS_WH_PLINKDIR AUFS_WH_PFX AUFS_PLINKDIR_NAME
100 #define AUFS_WH_ORPHDIR AUFS_WH_PFX AUFS_ORPHDIR_NAME
102 /* branch permission */
103 #define AUFS_BRPERM_RW "rw"
104 #define AUFS_BRPERM_RO "ro"
105 #define AUFS_BRPERM_RR "rr"
106 #define AUFS_BRPERM_WH "wh"
107 #define AUFS_BRPERM_NLWH "nolwh"
108 #define AUFS_BRPERM_ROWH AUFS_BRPERM_RO "+" AUFS_BRPERM_WH
109 #define AUFS_BRPERM_RRWH AUFS_BRPERM_RR "+" AUFS_BRPERM_WH
110 #define AUFS_BRPERM_RWNLWH AUFS_BRPERM_RW "+" AUFS_BRPERM_NLWH
112 /* ---------------------------------------------------------------------- */
114 /* ioctl */
115 enum {
116 /* readdir in userspace */
117 AuCtl_RDU,
118 AuCtl_RDU_INO,
120 /* pathconf wrapper */
121 AuCtl_WBR_FD,
123 /* busy inode */
124 AuCtl_IBUSY
127 /* borrowed from linux/include/linux/kernel.h */
128 #ifndef ALIGN
129 #define ALIGN(x, a) __ALIGN_MASK(x, (typeof(x))(a)-1)
130 #define __ALIGN_MASK(x, mask) (((x)+(mask))&~(mask))
131 #endif
133 /* borrowed from linux/include/linux/compiler-gcc3.h */
134 #ifndef __aligned
135 #define __aligned(x) __attribute__((aligned(x)))
136 #define __packed __attribute__((packed))
137 #endif
139 struct au_rdu_cookie {
140 __u64 h_pos;
141 __s16 bindex;
142 __u8 flags;
143 __u8 pad;
144 __u32 generation;
145 } __aligned(8);
147 struct au_rdu_ent {
148 __u64 ino;
149 __s16 bindex;
150 __u8 type;
151 __u8 nlen;
152 __u8 wh;
153 char name[0];
154 } __aligned(8);
156 static inline int au_rdu_len(int nlen)
158 /* include the terminating NULL */
159 return ALIGN(sizeof(struct au_rdu_ent) + nlen + 1,
160 sizeof(__u64));
163 union au_rdu_ent_ul {
164 struct au_rdu_ent __user *e;
165 __u64 ul;
168 enum {
169 AufsCtlRduV_SZ,
170 AufsCtlRduV_End
173 struct aufs_rdu {
174 /* input */
175 union {
176 __u64 sz; /* AuCtl_RDU */
177 __u64 nent; /* AuCtl_RDU_INO */
179 union au_rdu_ent_ul ent;
180 __u16 verify[AufsCtlRduV_End];
182 /* input/output */
183 __u32 blk;
185 /* output */
186 union au_rdu_ent_ul tail;
187 /* number of entries which were added in a single call */
188 __u64 rent;
189 __u8 full;
190 __u8 shwh;
192 struct au_rdu_cookie cookie;
193 } __aligned(8);
195 struct aufs_ibusy {
196 __u64 ino, h_ino;
197 __s16 bindex;
198 } __aligned(8);
200 #define AuCtlType 'A'
201 #define AUFS_CTL_RDU _IOWR(AuCtlType, AuCtl_RDU, struct aufs_rdu)
202 #define AUFS_CTL_RDU_INO _IOWR(AuCtlType, AuCtl_RDU_INO, struct aufs_rdu)
203 #define AUFS_CTL_WBR_FD _IO(AuCtlType, AuCtl_WBR_FD)
204 #define AUFS_CTL_IBUSY _IOWR(AuCtlType, AuCtl_IBUSY, struct aufs_ibusy)
206 #endif /* __AUFS_TYPE_H__ */