1 /* { dg-additional-options "-std=gnu99" } */
2 /* { dg-do compile } */
3
4 typedef unsigned short __u16;
5 typedef unsigned int __u32;
6 typedef signed short s16;
7
8
9 static inline
10 __attribute__((always_inline))
11 __attribute__((__const__))
__arch_swab16(__u16 x)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
u16_add_cpu(__u16 * var)21 void u16_add_cpu(__u16 *var)
22 {
23 *var = __arch_swab16(*var);
24 }
25
26 typedef struct xfs_mount {
27 int m_attr_magicpct;
28 } xfs_mount_t;
29
30 typedef struct xfs_da_args {
31 struct xfs_mount *t_mountp;
32 int index;
33 } xfs_da_args_t;
34
35 typedef struct xfs_dabuf {
36 void *data;
37 } xfs_dabuf_t;
38
39 typedef struct xfs_attr_leaf_map {
40 __u16 base;
41 __u16 size;
42 } xfs_attr_leaf_map_t;
43 typedef struct xfs_attr_leaf_hdr {
44 __u16 count;
45 xfs_attr_leaf_map_t freemap[3];
46 } xfs_attr_leaf_hdr_t;
47
48 typedef struct xfs_attr_leaf_entry {
49 __u16 nameidx;
50 } xfs_attr_leaf_entry_t;
51
52 typedef 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
57 int xfs_attr_leaf_entsize (xfs_attr_leafblock_t*, int);
58
59 int
xfs_attr_leaf_remove(xfs_attr_leafblock_t * leaf,xfs_da_args_t * args)60 xfs_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