Viewing file: pr58314.c (2.03 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* { 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); }
|