blob: 88505467a233f643f59dcc568b5710b83a145982 [file] [log] [blame]
/* { dg-additional-options "-std=gnu99" } */
/* { dg-do compile } */
typedef unsigned short __u16;
typedef unsigned int __u32;
typedef signed short s16;
static inline
__attribute__((always_inline))
__attribute__((__const__))
__u16 __arch_swab16(__u16 x)
{
__asm__(
"swap.b %1, %0"
: "=r" (x)
: "r" (x));
return x;
}
void u16_add_cpu(__u16 *var)
{
*var = __arch_swab16(*var);
}
typedef struct xfs_mount {
int m_attr_magicpct;
} xfs_mount_t;
typedef struct xfs_da_args {
struct xfs_mount *t_mountp;
int index;
} xfs_da_args_t;
typedef struct xfs_dabuf {
void *data;
} xfs_dabuf_t;
typedef struct xfs_attr_leaf_map {
__u16 base;
__u16 size;
} xfs_attr_leaf_map_t;
typedef struct xfs_attr_leaf_hdr {
__u16 count;
xfs_attr_leaf_map_t freemap[3];
} xfs_attr_leaf_hdr_t;
typedef struct xfs_attr_leaf_entry {
__u16 nameidx;
} xfs_attr_leaf_entry_t;
typedef struct xfs_attr_leafblock {
xfs_attr_leaf_hdr_t hdr;
xfs_attr_leaf_entry_t entries[1];
} xfs_attr_leafblock_t;
int xfs_attr_leaf_entsize (xfs_attr_leafblock_t*, int);
int
xfs_attr_leaf_remove(xfs_attr_leafblock_t *leaf, xfs_da_args_t *args)
{
xfs_attr_leaf_hdr_t *hdr;
xfs_attr_leaf_map_t *map;
xfs_attr_leaf_entry_t *entry;
int before, after, smallest, entsize;
int tablesize, tmp, i;
xfs_mount_t *mp;
hdr = &leaf->hdr;
mp = args->t_mountp;
entry = &leaf->entries[args->index];
tablesize = __arch_swab16(hdr->count);
map = &hdr->freemap[0];
tmp = map->size;
before = after = -1;
smallest = 3 - 1;
entsize = xfs_attr_leaf_entsize(leaf, args->index);
for (i = 0; i < 2; map++, i++) {
if (map->base == tablesize)
u16_add_cpu(&map->base);
if (__arch_swab16(map->base) + __arch_swab16(map->size) == __arch_swab16(entry->nameidx))
before = i;
else if (map->base == entsize)
after = i;
else if (__arch_swab16(map->size) < tmp)
smallest = i;
}
if (before >= 0)
{
map = &hdr->freemap[after];
map->base = entry->nameidx;
}
map = &hdr->freemap[smallest];
map->base = __arch_swab16(entry->nameidx);
return(tmp < mp->m_attr_magicpct);
}