diff options
Diffstat (limited to 'fs/udf/balloc.c')
-rw-r--r-- | fs/udf/balloc.c | 118 |
1 files changed, 59 insertions, 59 deletions
diff --git a/fs/udf/balloc.c b/fs/udf/balloc.c index c3db91b790fd..989259655b40 100644 --- a/fs/udf/balloc.c +++ b/fs/udf/balloc.c | |||
@@ -183,46 +183,46 @@ static void udf_bitmap_free_blocks(struct super_block *sb, | |||
183 | block = bloc.logicalBlockNum + offset + | 183 | block = bloc.logicalBlockNum + offset + |
184 | (sizeof(struct spaceBitmapDesc) << 3); | 184 | (sizeof(struct spaceBitmapDesc) << 3); |
185 | 185 | ||
186 | do_more: | 186 | do { |
187 | overflow = 0; | 187 | overflow = 0; |
188 | block_group = block >> (sb->s_blocksize_bits + 3); | 188 | block_group = block >> (sb->s_blocksize_bits + 3); |
189 | bit = block % (sb->s_blocksize << 3); | 189 | bit = block % (sb->s_blocksize << 3); |
190 | 190 | ||
191 | /* | 191 | /* |
192 | * Check to see if we are freeing blocks across a group boundary. | 192 | * Check to see if we are freeing blocks across a group boundary. |
193 | */ | 193 | */ |
194 | if (bit + count > (sb->s_blocksize << 3)) { | 194 | if (bit + count > (sb->s_blocksize << 3)) { |
195 | overflow = bit + count - (sb->s_blocksize << 3); | 195 | overflow = bit + count - (sb->s_blocksize << 3); |
196 | count -= overflow; | 196 | count -= overflow; |
197 | } | 197 | } |
198 | bitmap_nr = load_block_bitmap(sb, bitmap, block_group); | 198 | bitmap_nr = load_block_bitmap(sb, bitmap, block_group); |
199 | if (bitmap_nr < 0) | 199 | if (bitmap_nr < 0) |
200 | goto error_return; | 200 | goto error_return; |
201 | 201 | ||
202 | bh = bitmap->s_block_bitmap[bitmap_nr]; | 202 | bh = bitmap->s_block_bitmap[bitmap_nr]; |
203 | for (i = 0; i < count; i++) { | 203 | for (i = 0; i < count; i++) { |
204 | if (udf_set_bit(bit + i, bh->b_data)) { | 204 | if (udf_set_bit(bit + i, bh->b_data)) { |
205 | udf_debug("bit %ld already set\n", bit + i); | 205 | udf_debug("bit %ld already set\n", bit + i); |
206 | udf_debug("byte=%2x\n", | 206 | udf_debug("byte=%2x\n", |
207 | ((char *)bh->b_data)[(bit + i) >> 3]); | 207 | ((char *)bh->b_data)[(bit + i) >> 3]); |
208 | } else { | 208 | } else { |
209 | if (inode) | 209 | if (inode) |
210 | DQUOT_FREE_BLOCK(inode, 1); | 210 | DQUOT_FREE_BLOCK(inode, 1); |
211 | udf_add_free_space(sbi, sbi->s_partition, 1); | 211 | udf_add_free_space(sbi, sbi->s_partition, 1); |
212 | } | ||
212 | } | 213 | } |
213 | } | 214 | mark_buffer_dirty(bh); |
214 | mark_buffer_dirty(bh); | 215 | if (overflow) { |
215 | if (overflow) { | 216 | block += count; |
216 | block += count; | 217 | count = overflow; |
217 | count = overflow; | 218 | } |
218 | goto do_more; | 219 | } while (overflow); |
219 | } | 220 | |
220 | error_return: | 221 | error_return: |
221 | sb->s_dirt = 1; | 222 | sb->s_dirt = 1; |
222 | if (sbi->s_lvid_bh) | 223 | if (sbi->s_lvid_bh) |
223 | mark_buffer_dirty(sbi->s_lvid_bh); | 224 | mark_buffer_dirty(sbi->s_lvid_bh); |
224 | mutex_unlock(&sbi->s_alloc_mutex); | 225 | mutex_unlock(&sbi->s_alloc_mutex); |
225 | return; | ||
226 | } | 226 | } |
227 | 227 | ||
228 | static int udf_bitmap_prealloc_blocks(struct super_block *sb, | 228 | static int udf_bitmap_prealloc_blocks(struct super_block *sb, |
@@ -246,37 +246,37 @@ static int udf_bitmap_prealloc_blocks(struct super_block *sb, | |||
246 | if (first_block + block_count > part_len) | 246 | if (first_block + block_count > part_len) |
247 | block_count = part_len - first_block; | 247 | block_count = part_len - first_block; |
248 | 248 | ||
249 | repeat: | 249 | do { |
250 | nr_groups = udf_compute_nr_groups(sb, partition); | 250 | nr_groups = udf_compute_nr_groups(sb, partition); |
251 | block = first_block + (sizeof(struct spaceBitmapDesc) << 3); | 251 | block = first_block + (sizeof(struct spaceBitmapDesc) << 3); |
252 | block_group = block >> (sb->s_blocksize_bits + 3); | 252 | block_group = block >> (sb->s_blocksize_bits + 3); |
253 | group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc); | 253 | group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc); |
254 | 254 | ||
255 | bitmap_nr = load_block_bitmap(sb, bitmap, block_group); | 255 | bitmap_nr = load_block_bitmap(sb, bitmap, block_group); |
256 | if (bitmap_nr < 0) | 256 | if (bitmap_nr < 0) |
257 | goto out; | 257 | goto out; |
258 | bh = bitmap->s_block_bitmap[bitmap_nr]; | 258 | bh = bitmap->s_block_bitmap[bitmap_nr]; |
259 | 259 | ||
260 | bit = block % (sb->s_blocksize << 3); | 260 | bit = block % (sb->s_blocksize << 3); |
261 | 261 | ||
262 | while (bit < (sb->s_blocksize << 3) && block_count > 0) { | 262 | while (bit < (sb->s_blocksize << 3) && block_count > 0) { |
263 | if (!udf_test_bit(bit, bh->b_data)) { | 263 | if (!udf_test_bit(bit, bh->b_data)) |
264 | goto out; | 264 | goto out; |
265 | } else if (DQUOT_PREALLOC_BLOCK(inode, 1)) { | 265 | else if (DQUOT_PREALLOC_BLOCK(inode, 1)) |
266 | goto out; | 266 | goto out; |
267 | } else if (!udf_clear_bit(bit, bh->b_data)) { | 267 | else if (!udf_clear_bit(bit, bh->b_data)) { |
268 | udf_debug("bit already cleared for block %d\n", bit); | 268 | udf_debug("bit already cleared for block %d\n", bit); |
269 | DQUOT_FREE_BLOCK(inode, 1); | 269 | DQUOT_FREE_BLOCK(inode, 1); |
270 | goto out; | 270 | goto out; |
271 | } | ||
272 | block_count--; | ||
273 | alloc_count++; | ||
274 | bit++; | ||
275 | block++; | ||
271 | } | 276 | } |
272 | block_count--; | 277 | mark_buffer_dirty(bh); |
273 | alloc_count++; | 278 | } while (block_count > 0); |
274 | bit++; | 279 | |
275 | block++; | ||
276 | } | ||
277 | mark_buffer_dirty(bh); | ||
278 | if (block_count > 0) | ||
279 | goto repeat; | ||
280 | out: | 280 | out: |
281 | if (udf_add_free_space(sbi, partition, -alloc_count)) | 281 | if (udf_add_free_space(sbi, partition, -alloc_count)) |
282 | mark_buffer_dirty(sbi->s_lvid_bh); | 282 | mark_buffer_dirty(sbi->s_lvid_bh); |