1/* { dg-additional-options "-std=gnu99" } */ 2/* { dg-do compile } */ 3 4typedef unsigned short __u16; 5typedef unsigned int __u32; 6typedef signed short s16; 7 8 9static inline 10__attribute__((always_inline)) 11__attribute__((__const__)) 12__u16 __arch_swab16(__u16 x) 13{ 14 __asm__( 15 "swap.b %1, %0" 16 : "=r" (x) 17 : "r" (x)); 18 return x; 19} 20 21void u16_add_cpu(__u16 *var) 22{ 23 *var = __arch_swab16(*var); 24} 25 26typedef struct xfs_mount { 27 int m_attr_magicpct; 28} xfs_mount_t; 29 30typedef struct xfs_da_args { 31 struct xfs_mount *t_mountp; 32 int index; 33} xfs_da_args_t; 34 35typedef struct xfs_dabuf { 36 void *data; 37} xfs_dabuf_t; 38 39typedef struct xfs_attr_leaf_map { 40 __u16 base; 41 __u16 size; 42} xfs_attr_leaf_map_t; 43typedef struct xfs_attr_leaf_hdr { 44 __u16 count; 45 xfs_attr_leaf_map_t freemap[3]; 46} xfs_attr_leaf_hdr_t; 47 48typedef struct xfs_attr_leaf_entry { 49 __u16 nameidx; 50} xfs_attr_leaf_entry_t; 51 52typedef struct xfs_attr_leafblock { 53 xfs_attr_leaf_hdr_t hdr; 54 xfs_attr_leaf_entry_t entries[1]; 55} xfs_attr_leafblock_t; 56 57int xfs_attr_leaf_entsize (xfs_attr_leafblock_t*, int); 58 59int 60xfs_attr_leaf_remove(xfs_attr_leafblock_t *leaf, xfs_da_args_t *args) 61{ 62 xfs_attr_leaf_hdr_t *hdr; 63 xfs_attr_leaf_map_t *map; 64 xfs_attr_leaf_entry_t *entry; 65 int before, after, smallest, entsize; 66 int tablesize, tmp, i; 67 xfs_mount_t *mp; 68 hdr = &leaf->hdr; 69 mp = args->t_mountp; 70 71 entry = &leaf->entries[args->index]; 72 73 tablesize = __arch_swab16(hdr->count); 74 75 map = &hdr->freemap[0]; 76 tmp = map->size; 77 before = after = -1; 78 smallest = 3 - 1; 79 entsize = xfs_attr_leaf_entsize(leaf, args->index); 80 81 for (i = 0; i < 2; map++, i++) { 82 83 if (map->base == tablesize) 84 u16_add_cpu(&map->base); 85 86 if (__arch_swab16(map->base) + __arch_swab16(map->size) == __arch_swab16(entry->nameidx)) 87 before = i; 88 else if (map->base == entsize) 89 after = i; 90 else if (__arch_swab16(map->size) < tmp) 91 smallest = i; 92 } 93 94 if (before >= 0) 95 { 96 map = &hdr->freemap[after]; 97 map->base = entry->nameidx; 98 99 } 100 101 map = &hdr->freemap[smallest]; 102 103 map->base = __arch_swab16(entry->nameidx); 104 105 return(tmp < mp->m_attr_magicpct); 106} 107