2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:58:39 +03:00
* Copyright ( c ) 2000 , 2002 , 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
2005-04-17 02:20:36 +04:00
* published by the Free Software Foundation .
*
2005-11-02 06:58:39 +03:00
* 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 .
2005-04-17 02:20:36 +04:00
*
2005-11-02 06:58:39 +03:00
* 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
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_ATTR_SF_H__
# define __XFS_ATTR_SF_H__
/*
* Attribute storage when stored inside the inode .
*
* Small attribute lists are packed as tightly as possible so as
* to fit into the literal area of the inode .
*/
/*
* Entries are packed toward the top as tight as possible .
*/
typedef struct xfs_attr_shortform {
struct xfs_attr_sf_hdr { /* constant-structure header block */
2006-03-17 09:29:25 +03:00
__be16 totsize ; /* total bytes in shortform list */
__u8 count ; /* count of active entries */
2005-04-17 02:20:36 +04:00
} hdr ;
struct xfs_attr_sf_entry {
__uint8_t namelen ; /* actual length of name (no NULL) */
__uint8_t valuelen ; /* actual length of value (no NULL) */
__uint8_t flags ; /* flags bits (see xfs_attr_leaf.h) */
__uint8_t nameval [ 1 ] ; /* name & value bytes concatenated */
} list [ 1 ] ; /* variable sized array */
} xfs_attr_shortform_t ;
typedef struct xfs_attr_sf_hdr xfs_attr_sf_hdr_t ;
typedef struct xfs_attr_sf_entry xfs_attr_sf_entry_t ;
/*
* We generate this then sort it , attr_list ( ) must return things in hash - order .
*/
typedef struct xfs_attr_sf_sort {
__uint8_t entno ; /* entry number in original list */
__uint8_t namelen ; /* length of name value (no null) */
__uint8_t valuelen ; /* length of value */
__uint8_t flags ; /* flags bits (see xfs_attr_leaf.h) */
xfs_dahash_t hash ; /* this entry's hash value */
2010-01-20 02:47:48 +03:00
unsigned char * name ; /* name value, pointer into buffer */
2005-04-17 02:20:36 +04:00
} xfs_attr_sf_sort_t ;
# define XFS_ATTR_SF_ENTSIZE_BYNAME(nlen,vlen) /* space name/value uses */ \
2005-11-02 06:38:42 +03:00
( ( ( int ) sizeof ( xfs_attr_sf_entry_t ) - 1 + ( nlen ) + ( vlen ) ) )
2005-04-17 02:20:36 +04:00
# define XFS_ATTR_SF_ENTSIZE_MAX /* max space for name&value */ \
( ( 1 < < ( NBBY * ( int ) sizeof ( __uint8_t ) ) ) - 1 )
# define XFS_ATTR_SF_ENTSIZE(sfep) /* space an entry uses */ \
( ( int ) sizeof ( xfs_attr_sf_entry_t ) - 1 + ( sfep ) - > namelen + ( sfep ) - > valuelen )
# define XFS_ATTR_SF_NEXTENTRY(sfep) /* next entry in struct */ \
2005-11-02 06:38:42 +03:00
( ( xfs_attr_sf_entry_t * ) ( ( char * ) ( sfep ) + XFS_ATTR_SF_ENTSIZE ( sfep ) ) )
2005-04-17 02:20:36 +04:00
# define XFS_ATTR_SF_TOTSIZE(dp) /* total space in use */ \
2006-03-17 09:29:25 +03:00
( be16_to_cpu ( ( ( xfs_attr_shortform_t * ) \
( ( dp ) - > i_afp - > if_u1 . if_data ) ) - > hdr . totsize ) )
2005-04-17 02:20:36 +04:00
# endif /* __XFS_ATTR_SF_H__ */