1 void udf_fill_spartable(struct super_block
*sb
, struct udf_sparing_data
*sdata
, int partlen
)
6 struct buffer_head
*bh
;
7 struct SparingTable
*st
;
11 if (!(spartable
= sdata
->s_spar_loc
[i
]))
14 bh
= udf_read_tagged(sb
, spartable
, spartable
, &ident
);
18 sdata
->s_spar_loc
[i
] = 0;
24 st
= (struct SparingTable
*)bh
->b_data
;
25 if (!strncmp(st
->sparingIdent
.ident
, UDF_ID_SPARING
, strlen(UDF_ID_SPARING
)))
28 Uint16 rtl
= le16_to_cpu(st
->reallocationTableLen
);
31 if (!sdata
->s_spar_map
)
34 sdata
->s_spar_indexsize
= 8;
35 while (rtl
*sizeof(Uint32
) >= (1 << sdata
->s_spar_indexsize
))
38 sdata
->s_spar_indexsize
<<= 1;
40 mapsize
= (rtl
* sizeof(Uint32
)) +
41 ((partlen
/(1 << sdata
->s_spar_pshift
)) * sizeof(Uint8
) * num
);
42 sdata
->s_spar_map
= kmalloc(mapsize
, GFP_KERNEL
);
43 sdata
->s_spar_remap
.s_spar_remap32
= &sdata
->s_spar_map
[rtl
];
44 memset(sdata
->s_spar_map
, 0xFF, mapsize
);
47 index
= sizeof(struct SparingTable
);
50 if (index
> sb
->s_blocksize
)
53 bh
= udf_tread(sb
, ++spartable
, sb
->s_blocksize
);
56 sdata
->s_spar_loc
[i
] = 0;
61 se
= (SparingEntry
*)&(bh
->b_data
[index
]);
62 index
+= sizeof(SparingEntry
);
64 if (sdata
->s_spar_map
[i
] == 0xFFFFFFFF)
65 sdata
->s_spar_map
[i
] = le32_to_cpu(se
->mappedLocation
);
66 else if (sdata
->s_spar_map
[i
] != le32_to_cpu(se
->mappedLocation
))
68 udf_debug("Found conflicting Sparing Data (%d vs %d for entry %d)\n",
69 sdata
->s_spar_map
[i
], le32_to_cpu(se
->mappedLocation
), i
);
72 if (le32_to_cpu(se
->origLocation
) < 0xFFFFFFF0)
74 int packet
= le32_to_cpu(se
->origLocation
) >> sdata
->s_spar_pshift
;
75 if (sdata
->s_spar_indexsize
== 8)
77 if (sdata
->s_spar_remap
.s_spar_remap8
[packet
] == 0xFF)
78 sdata
->s_spar_remap
.s_spar_remap8
[packet
] = i
;
79 else if (sdata
->s_spar_remap
.s_spar_remap8
[packet
] != i
)
81 udf_debug("Found conflicting Sparing Data (%d vs %d)\n",
82 sdata
->s_spar_remap
.s_spar_remap8
[packet
], i
);
85 else if (sdata
->s_spar_indexsize
== 16)
87 if (sdata
->s_spar_remap
.s_spar_remap16
[packet
] == 0xFFFF)
88 sdata
->s_spar_remap
.s_spar_remap16
[packet
] = i
;
89 else if (sdata
->s_spar_remap
.s_spar_remap16
[packet
] != i
)
91 udf_debug("Found conflicting Sparing Data (%d vs %d)\n",
92 sdata
->s_spar_remap
.s_spar_remap16
[packet
], i
);
95 else if (sdata
->s_spar_indexsize
== 32)
97 if (sdata
->s_spar_remap
.s_spar_remap32
[packet
] == 0xFFFFFFFF)
98 sdata
->s_spar_remap
.s_spar_remap32
[packet
] = i
;
99 else if (sdata
->s_spar_remap
.s_spar_remap32
[packet
] != i
)
101 udf_debug("Found conflicting Sparing Data (%d vs %d)\n",
102 sdata
->s_spar_remap
.s_spar_remap32
[packet
], i
);
109 udf_release_data(bh
);