| /* { 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); |
| } |