Blame view

fs/xfs/xfs_attr.h 5.47 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
7b7187698   Nathan Scott   [XFS] Update lice...
2
3
   * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc.
   * All Rights Reserved.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
   *
7b7187698   Nathan Scott   [XFS] Update lice...
5
6
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
   * published by the Free Software Foundation.
   *
7b7187698   Nathan Scott   [XFS] Update lice...
9
10
11
12
   * This program is distributed in the hope that it would be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
   *
7b7187698   Nathan Scott   [XFS] Update lice...
14
15
16
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write the Free Software Foundation,
   * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
17
18
19
   */
  #ifndef __XFS_ATTR_H__
  #define	__XFS_ATTR_H__
ad9b463aa   Christoph Hellwig   [XFS] Switches xf...
20
21
22
  struct xfs_inode;
  struct xfs_da_args;
  struct xfs_attr_list_context;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
34
35
36
   * Large attribute lists are structured around Btrees where all the data
   * elements are in the leaf nodes.  Attribute names are hashed into an int,
   * then that int is used as the index into the Btree.  Since the hashval
   * of an attribute name may not be unique, we may have duplicate keys.
   * The internal links in the Btree are logical block offsets into the file.
   *
   * Small attribute lists use a different format and are packed as tightly
   * as possible so as to fit into the literal area of the inode.
   */
  
  /*========================================================================
   * External interfaces
   *========================================================================*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
40
41
42
43
  
  #define ATTR_DONTFOLLOW	0x0001	/* -- unused, from IRIX -- */
  #define ATTR_ROOT	0x0002	/* use attrs in root (trusted) namespace */
  #define ATTR_TRUST	0x0004	/* -- unused, from IRIX -- */
  #define ATTR_SECURE	0x0008	/* use attrs in security namespace */
  #define ATTR_CREATE	0x0010	/* pure create: fail if attr already exists */
  #define ATTR_REPLACE	0x0020	/* pure set: fail if attr does not exist */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
  #define ATTR_KERNOTIME	0x1000	/* [kernel] don't update inode timestamps */
  #define ATTR_KERNOVAL	0x2000	/* [kernel] get attr size only, not value */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
47

0b1b213fc   Christoph Hellwig   xfs: event tracin...
48
49
50
51
52
53
54
55
56
  #define XFS_ATTR_FLAGS \
  	{ ATTR_DONTFOLLOW, 	"DONTFOLLOW" }, \
  	{ ATTR_ROOT,		"ROOT" }, \
  	{ ATTR_TRUST,		"TRUST" }, \
  	{ ATTR_SECURE,		"SECURE" }, \
  	{ ATTR_CREATE,		"CREATE" }, \
  	{ ATTR_REPLACE,		"REPLACE" }, \
  	{ ATTR_KERNOTIME,	"KERNOTIME" }, \
  	{ ATTR_KERNOVAL,	"KERNOVAL" }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
  /*
   * The maximum size (into the kernel or returned from the kernel) of an
   * attribute value or the buffer used for an attr_list() call.  Larger
   * sizes will result in an ERANGE return code.
   */
  #define	ATTR_MAX_VALUELEN	(64*1024)	/* max length of a value */
  
  /*
   * Define how lists of attribute names are returned to the user from
   * the attr_list() call.  A large, 32bit aligned, buffer is passed in
   * along with its size.  We put an array of offsets at the top that each
   * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom.
   */
  typedef struct attrlist {
  	__s32	al_count;	/* number of entries in attrlist */
  	__s32	al_more;	/* T/F: more attrs (do call again) */
  	__s32	al_offset[1];	/* byte offsets of attrs [var-sized] */
  } attrlist_t;
  
  /*
   * Show the interesting info about one attribute.  This is what the
   * al_offset[i] entry points to.
   */
  typedef struct attrlist_ent {	/* data from attr_list() */
  	__u32	a_valuelen;	/* number bytes in value of attr */
  	char	a_name[1];	/* attr name (NULL terminated) */
  } attrlist_ent_t;
  
  /*
   * Given a pointer to the (char*) buffer containing the attr_list() result,
   * and an index, return a pointer to the indicated attribute in the buffer.
   */
  #define	ATTR_ENTRY(buffer, index)		\
  	((attrlist_ent_t *)			\
  	 &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ])
  
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
95
96
97
98
99
100
101
102
103
104
105
106
   * Kernel-internal version of the attrlist cursor.
   */
  typedef struct attrlist_cursor_kern {
  	__u32	hashval;	/* hash value of next entry to add */
  	__u32	blkno;		/* block containing entry (suggestion) */
  	__u32	offset;		/* offset in list of equal-hashvals */
  	__u16	pad1;		/* padding to match user-level */
  	__u8	pad2;		/* padding to match user-level */
  	__u8	initted;	/* T/F: cursor has been initialized */
  } attrlist_cursor_kern_t;
  
  
  /*========================================================================
ad9b463aa   Christoph Hellwig   [XFS] Switches xf...
107
   * Structure used to pass context around among the routines.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
   *========================================================================*/
ad9b463aa   Christoph Hellwig   [XFS] Switches xf...
109
110
  
  typedef int (*put_listent_func_t)(struct xfs_attr_list_context *, int,
a9273ca5c   Dave Chinner   xfs: convert attr...
111
  			      unsigned char *, int, int, unsigned char *);
ad9b463aa   Christoph Hellwig   [XFS] Switches xf...
112
113
114
115
116
117
  
  typedef struct xfs_attr_list_context {
  	struct xfs_inode		*dp;		/* inode */
  	struct attrlist_cursor_kern	*cursor;	/* position in list */
  	char				*alist;		/* output buffer */
  	int				seen_enough;	/* T/F: seen enough of list? */
61f10fad1   Tim Shimmin   [XFS] Fix up warn...
118
  	ssize_t				count;		/* num used entries */
ad9b463aa   Christoph Hellwig   [XFS] Switches xf...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  	int				dupcnt;		/* count dup hashvals seen */
  	int				bufsize;	/* total buffer size */
  	int				firstu;		/* first used byte in buffer */
  	int				flags;		/* from VOP call */
  	int				resynch;	/* T/F: resynch with cursor */
  	int				put_value;	/* T/F: need value for listent */
  	put_listent_func_t		put_listent;	/* list output fmt function */
  	int				index;		/* index into output buffer */
  } xfs_attr_list_context_t;
  
  
  /*========================================================================
   * Function prototypes for the kernel.
   *========================================================================*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
134
135
136
  
  /*
   * Overall external interface routines.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
  int xfs_attr_inactive(struct xfs_inode *dp);
726801ba0   Tim Shimmin   [XFS] Add EA list...
138
  int xfs_attr_rmtval_get(struct xfs_da_args *args);
ad9b463aa   Christoph Hellwig   [XFS] Switches xf...
139
  int xfs_attr_list_int(struct xfs_attr_list_context *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140
141
  
  #endif	/* __XFS_ATTR_H__ */