Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  1/*
  2 * Copyright (c) 2000,2002,2005 Silicon Graphics, Inc.
  3 * Copyright (c) 2013 Red Hat, Inc.
  4 * All Rights Reserved.
  5 *
  6 * This program is free software; you can redistribute it and/or
  7 * modify it under the terms of the GNU General Public License as
  8 * published by the Free Software Foundation.
  9 *
 10 * This program is distributed in the hope that it would be useful,
 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 13 * GNU General Public License for more details.
 14 *
 15 * You should have received a copy of the GNU General Public License
 16 * along with this program; if not, write the Free Software Foundation,
 17 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 18 */
 19#ifndef __XFS_DA_BTREE_H__
 20#define	__XFS_DA_BTREE_H__
 21
 22struct xfs_bmap_free;
 23struct xfs_inode;
 24struct xfs_trans;
 25struct zone;
 26struct xfs_dir_ops;
 27
 28/*========================================================================
 29 * Btree searching and modification structure definitions.
 30 *========================================================================*/
 31
 32/*
 33 * Search comparison results
 34 */
 35enum xfs_dacmp {
 36	XFS_CMP_DIFFERENT,	/* names are completely different */
 37	XFS_CMP_EXACT,		/* names are exactly the same */
 38	XFS_CMP_CASE		/* names are same but differ in case */
 39};
 40
 41/*
 42 * Structure to ease passing around component names.
 43 */
 44typedef struct xfs_da_args {
 45	const __uint8_t	*name;		/* string (maybe not NULL terminated) */
 46	int		namelen;	/* length of string (maybe no NULL) */
 47	__uint8_t	filetype;	/* filetype of inode for directories */
 48	__uint8_t	*value;		/* set of bytes (maybe contain NULLs) */
 49	int		valuelen;	/* length of value */
 50	int		flags;		/* argument flags (eg: ATTR_NOCREATE) */
 51	xfs_dahash_t	hashval;	/* hash value of name */
 52	xfs_ino_t	inumber;	/* input/output inode number */
 53	struct xfs_inode *dp;		/* directory inode to manipulate */
 54	xfs_fsblock_t	*firstblock;	/* ptr to firstblock for bmap calls */
 55	struct xfs_bmap_free *flist;	/* ptr to freelist for bmap_finish */
 56	struct xfs_trans *trans;	/* current trans (changes over time) */
 57	xfs_extlen_t	total;		/* total blocks needed, for 1st bmap */
 58	int		whichfork;	/* data or attribute fork */
 59	xfs_dablk_t	blkno;		/* blkno of attr leaf of interest */
 60	int		index;		/* index of attr of interest in blk */
 61	xfs_dablk_t	rmtblkno;	/* remote attr value starting blkno */
 62	int		rmtblkcnt;	/* remote attr value block count */
 63	int		rmtvaluelen;	/* remote attr value length in bytes */
 64	xfs_dablk_t	blkno2;		/* blkno of 2nd attr leaf of interest */
 65	int		index2;		/* index of 2nd attr in blk */
 66	xfs_dablk_t	rmtblkno2;	/* remote attr value starting blkno */
 67	int		rmtblkcnt2;	/* remote attr value block count */
 68	int		rmtvaluelen2;	/* remote attr value length in bytes */
 69	int		op_flags;	/* operation flags */
 70	enum xfs_dacmp	cmpresult;	/* name compare result for lookups */
 71} xfs_da_args_t;
 72
 73/*
 74 * Operation flags:
 75 */
 76#define XFS_DA_OP_JUSTCHECK	0x0001	/* check for ok with no space */
 77#define XFS_DA_OP_RENAME	0x0002	/* this is an atomic rename op */
 78#define XFS_DA_OP_ADDNAME	0x0004	/* this is an add operation */
 79#define XFS_DA_OP_OKNOENT	0x0008	/* lookup/add op, ENOENT ok, else die */
 80#define XFS_DA_OP_CILOOKUP	0x0010	/* lookup to return CI name if found */
 81
 82#define XFS_DA_OP_FLAGS \
 83	{ XFS_DA_OP_JUSTCHECK,	"JUSTCHECK" }, \
 84	{ XFS_DA_OP_RENAME,	"RENAME" }, \
 85	{ XFS_DA_OP_ADDNAME,	"ADDNAME" }, \
 86	{ XFS_DA_OP_OKNOENT,	"OKNOENT" }, \
 87	{ XFS_DA_OP_CILOOKUP,	"CILOOKUP" }
 88
 89/*
 90 * Storage for holding state during Btree searches and split/join ops.
 91 *
 92 * Only need space for 5 intermediate nodes.  With a minimum of 62-way
 93 * fanout to the Btree, we can support over 900 million directory blocks,
 94 * which is slightly more than enough.
 95 */
 96typedef struct xfs_da_state_blk {
 97	struct xfs_buf	*bp;		/* buffer containing block */
 98	xfs_dablk_t	blkno;		/* filesystem blkno of buffer */
 99	xfs_daddr_t	disk_blkno;	/* on-disk blkno (in BBs) of buffer */
100	int		index;		/* relevant index into block */
101	xfs_dahash_t	hashval;	/* last hash value in block */
102	int		magic;		/* blk's magic number, ie: blk type */
103} xfs_da_state_blk_t;
104
105typedef struct xfs_da_state_path {
106	int			active;		/* number of active levels */
107	xfs_da_state_blk_t	blk[XFS_DA_NODE_MAXDEPTH];
108} xfs_da_state_path_t;
109
110typedef struct xfs_da_state {
111	xfs_da_args_t		*args;		/* filename arguments */
112	struct xfs_mount	*mp;		/* filesystem mount point */
113	unsigned int		blocksize;	/* logical block size */
114	unsigned int		node_ents;	/* how many entries in danode */
115	xfs_da_state_path_t	path;		/* search/split paths */
116	xfs_da_state_path_t	altpath;	/* alternate path for join */
117	unsigned char		inleaf;		/* insert into 1->lf, 0->splf */
118	unsigned char		extravalid;	/* T/F: extrablk is in use */
119	unsigned char		extraafter;	/* T/F: extrablk is after new */
120	xfs_da_state_blk_t	extrablk;	/* for double-splits on leaves */
121						/* for dirv2 extrablk is data */
122} xfs_da_state_t;
123
124/*
125 * Utility macros to aid in logging changed structure fields.
126 */
127#define XFS_DA_LOGOFF(BASE, ADDR)	((char *)(ADDR) - (char *)(BASE))
128#define XFS_DA_LOGRANGE(BASE, ADDR, SIZE)	\
129		(uint)(XFS_DA_LOGOFF(BASE, ADDR)), \
130		(uint)(XFS_DA_LOGOFF(BASE, ADDR)+(SIZE)-1)
131
132/*
133 * Name ops for directory and/or attr name operations
134 */
135struct xfs_nameops {
136	xfs_dahash_t	(*hashname)(struct xfs_name *);
137	enum xfs_dacmp	(*compname)(struct xfs_da_args *,
138					const unsigned char *, int);
139};
140
141
142/*========================================================================
143 * Function prototypes.
144 *========================================================================*/
145
146/*
147 * Routines used for growing the Btree.
148 */
149int	xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno,
150			    int level, struct xfs_buf **bpp, int whichfork);
151int	xfs_da3_split(xfs_da_state_t *state);
152
153/*
154 * Routines used for shrinking the Btree.
155 */
156int	xfs_da3_join(xfs_da_state_t *state);
157void	xfs_da3_fixhashpath(struct xfs_da_state *state,
158			    struct xfs_da_state_path *path_to_to_fix);
159
160/*
161 * Routines used for finding things in the Btree.
162 */
163int	xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result);
164int	xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path,
165					 int forward, int release, int *result);
166/*
167 * Utility routines.
168 */
169int	xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk,
170				       xfs_da_state_blk_t *new_blk);
171int	xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp,
172			 xfs_dablk_t bno, xfs_daddr_t mappedbno,
173			 struct xfs_buf **bpp, int which_fork);
174
175/*
176 * Utility routines.
177 */
178int	xfs_da_grow_inode(xfs_da_args_t *args, xfs_dablk_t *new_blkno);
179int	xfs_da_grow_inode_int(struct xfs_da_args *args, xfs_fileoff_t *bno,
180			      int count);
181int	xfs_da_get_buf(struct xfs_trans *trans, struct xfs_inode *dp,
182			      xfs_dablk_t bno, xfs_daddr_t mappedbno,
183			      struct xfs_buf **bp, int whichfork);
184int	xfs_da_read_buf(struct xfs_trans *trans, struct xfs_inode *dp,
185			       xfs_dablk_t bno, xfs_daddr_t mappedbno,
186			       struct xfs_buf **bpp, int whichfork,
187			       const struct xfs_buf_ops *ops);
188xfs_daddr_t	xfs_da_reada_buf(struct xfs_trans *trans, struct xfs_inode *dp,
189				xfs_dablk_t bno, xfs_daddr_t mapped_bno,
190				int whichfork, const struct xfs_buf_ops *ops);
191int	xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno,
192					  struct xfs_buf *dead_buf);
193
194uint xfs_da_hashname(const __uint8_t *name_string, int name_length);
195enum xfs_dacmp xfs_da_compname(struct xfs_da_args *args,
196				const unsigned char *name, int len);
197
198
199xfs_da_state_t *xfs_da_state_alloc(void);
200void xfs_da_state_free(xfs_da_state_t *state);
201
202extern struct kmem_zone *xfs_da_state_zone;
203extern const struct xfs_nameops xfs_default_nameops;
204
205#endif	/* __XFS_DA_BTREE_H__ */