Merge branch 'core/futexes' into core/core
[linux-2.6-block.git] / fs / udf / balloc.c
CommitLineData
1da177e4
LT
1/*
2 * balloc.c
3 *
4 * PURPOSE
5 * Block allocation handling routines for the OSTA-UDF(tm) filesystem.
6 *
1da177e4
LT
7 * COPYRIGHT
8 * This file is distributed under the terms of the GNU General Public
9 * License (GPL). Copies of the GPL can be obtained from:
10 * ftp://prep.ai.mit.edu/pub/gnu/GPL
11 * Each contributing author retains all rights to their own work.
12 *
13 * (C) 1999-2001 Ben Fennema
14 * (C) 1999 Stelias Computing Inc
15 *
16 * HISTORY
17 *
18 * 02/24/99 blf Created.
19 *
20 */
21
22#include "udfdecl.h"
23
24#include <linux/quotaops.h>
25#include <linux/buffer_head.h>
26#include <linux/bitops.h>
27
28#include "udf_i.h"
29#include "udf_sb.h"
30
4b11111a
MS
31#define udf_clear_bit(nr, addr) ext2_clear_bit(nr, addr)
32#define udf_set_bit(nr, addr) ext2_set_bit(nr, addr)
1da177e4
LT
33#define udf_test_bit(nr, addr) ext2_test_bit(nr, addr)
34#define udf_find_first_one_bit(addr, size) find_first_one_bit(addr, size)
4b11111a
MS
35#define udf_find_next_one_bit(addr, size, offset) \
36 find_next_one_bit(addr, size, offset)
1da177e4
LT
37
38#define leBPL_to_cpup(x) leNUM_to_cpup(BITS_PER_LONG, x)
4b11111a
MS
39#define leNUM_to_cpup(x, y) xleNUM_to_cpup(x, y)
40#define xleNUM_to_cpup(x, y) (le ## x ## _to_cpup(y))
1da177e4
LT
41#define uintBPL_t uint(BITS_PER_LONG)
42#define uint(x) xuint(x)
43#define xuint(x) __le ## x
44
cb00ea35 45static inline int find_next_one_bit(void *addr, int size, int offset)
1da177e4 46{
cb00ea35
CG
47 uintBPL_t *p = ((uintBPL_t *) addr) + (offset / BITS_PER_LONG);
48 int result = offset & ~(BITS_PER_LONG - 1);
1da177e4
LT
49 unsigned long tmp;
50
51 if (offset >= size)
52 return size;
53 size -= result;
cb00ea35
CG
54 offset &= (BITS_PER_LONG - 1);
55 if (offset) {
1da177e4
LT
56 tmp = leBPL_to_cpup(p++);
57 tmp &= ~0UL << offset;
58 if (size < BITS_PER_LONG)
59 goto found_first;
60 if (tmp)
61 goto found_middle;
62 size -= BITS_PER_LONG;
63 result += BITS_PER_LONG;
64 }
cb00ea35 65 while (size & ~(BITS_PER_LONG - 1)) {
4b11111a
MS
66 tmp = leBPL_to_cpup(p++);
67 if (tmp)
1da177e4
LT
68 goto found_middle;
69 result += BITS_PER_LONG;
70 size -= BITS_PER_LONG;
71 }
72 if (!size)
73 return result;
74 tmp = leBPL_to_cpup(p);
28de7948 75found_first:
cb00ea35 76 tmp &= ~0UL >> (BITS_PER_LONG - size);
28de7948 77found_middle:
1da177e4
LT
78 return result + ffz(~tmp);
79}
80
81#define find_first_one_bit(addr, size)\
82 find_next_one_bit((addr), (size), 0)
83
cb00ea35
CG
84static int read_block_bitmap(struct super_block *sb,
85 struct udf_bitmap *bitmap, unsigned int block,
86 unsigned long bitmap_nr)
1da177e4
LT
87{
88 struct buffer_head *bh = NULL;
89 int retval = 0;
90 kernel_lb_addr loc;
91
92 loc.logicalBlockNum = bitmap->s_extPosition;
6c79e987 93 loc.partitionReferenceNum = UDF_SB(sb)->s_partition;
1da177e4
LT
94
95 bh = udf_tread(sb, udf_get_lb_pblock(sb, loc, block));
4b11111a 96 if (!bh)
1da177e4 97 retval = -EIO;
4b11111a 98
1da177e4
LT
99 bitmap->s_block_bitmap[bitmap_nr] = bh;
100 return retval;
101}
102
cb00ea35
CG
103static int __load_block_bitmap(struct super_block *sb,
104 struct udf_bitmap *bitmap,
105 unsigned int block_group)
1da177e4
LT
106{
107 int retval = 0;
108 int nr_groups = bitmap->s_nr_groups;
109
cb00ea35
CG
110 if (block_group >= nr_groups) {
111 udf_debug("block_group (%d) > nr_groups (%d)\n", block_group,
112 nr_groups);
1da177e4
LT
113 }
114
28de7948 115 if (bitmap->s_block_bitmap[block_group]) {
1da177e4 116 return block_group;
28de7948
CG
117 } else {
118 retval = read_block_bitmap(sb, bitmap, block_group,
119 block_group);
1da177e4
LT
120 if (retval < 0)
121 return retval;
122 return block_group;
123 }
124}
125
cb00ea35
CG
126static inline int load_block_bitmap(struct super_block *sb,
127 struct udf_bitmap *bitmap,
128 unsigned int block_group)
1da177e4
LT
129{
130 int slot;
131
132 slot = __load_block_bitmap(sb, bitmap, block_group);
133
134 if (slot < 0)
135 return slot;
136
137 if (!bitmap->s_block_bitmap[slot])
138 return -EIO;
139
140 return slot;
141}
142
742ba02a
MS
143static bool udf_add_free_space(struct udf_sb_info *sbi,
144 u16 partition, u32 cnt)
145{
146 struct logicalVolIntegrityDesc *lvid;
147
cba44359 148 if (sbi->s_lvid_bh == NULL)
742ba02a
MS
149 return false;
150
151 lvid = (struct logicalVolIntegrityDesc *)sbi->s_lvid_bh->b_data;
c2104fda 152 le32_add_cpu(&lvid->freeSpaceTable[partition], cnt);
742ba02a
MS
153 return true;
154}
155
cb00ea35
CG
156static void udf_bitmap_free_blocks(struct super_block *sb,
157 struct inode *inode,
158 struct udf_bitmap *bitmap,
159 kernel_lb_addr bloc, uint32_t offset,
160 uint32_t count)
1da177e4
LT
161{
162 struct udf_sb_info *sbi = UDF_SB(sb);
cb00ea35 163 struct buffer_head *bh = NULL;
1da177e4
LT
164 unsigned long block;
165 unsigned long block_group;
166 unsigned long bit;
167 unsigned long i;
168 int bitmap_nr;
169 unsigned long overflow;
170
1e7933de 171 mutex_lock(&sbi->s_alloc_mutex);
1da177e4 172 if (bloc.logicalBlockNum < 0 ||
4b11111a
MS
173 (bloc.logicalBlockNum + count) >
174 sbi->s_partmaps[bloc.partitionReferenceNum].s_partition_len) {
28de7948
CG
175 udf_debug("%d < %d || %d + %d > %d\n",
176 bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count,
4b11111a
MS
177 sbi->s_partmaps[bloc.partitionReferenceNum].
178 s_partition_len);
1da177e4
LT
179 goto error_return;
180 }
181
4b11111a
MS
182 block = bloc.logicalBlockNum + offset +
183 (sizeof(struct spaceBitmapDesc) << 3);
1da177e4 184
4daa1b87
MS
185 do {
186 overflow = 0;
187 block_group = block >> (sb->s_blocksize_bits + 3);
188 bit = block % (sb->s_blocksize << 3);
189
190 /*
191 * Check to see if we are freeing blocks across a group boundary.
192 */
193 if (bit + count > (sb->s_blocksize << 3)) {
194 overflow = bit + count - (sb->s_blocksize << 3);
195 count -= overflow;
1da177e4 196 }
4daa1b87
MS
197 bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
198 if (bitmap_nr < 0)
199 goto error_return;
200
201 bh = bitmap->s_block_bitmap[bitmap_nr];
202 for (i = 0; i < count; i++) {
203 if (udf_set_bit(bit + i, bh->b_data)) {
204 udf_debug("bit %ld already set\n", bit + i);
205 udf_debug("byte=%2x\n",
206 ((char *)bh->b_data)[(bit + i) >> 3]);
207 } else {
208 if (inode)
209 DQUOT_FREE_BLOCK(inode, 1);
210 udf_add_free_space(sbi, sbi->s_partition, 1);
211 }
212 }
213 mark_buffer_dirty(bh);
214 if (overflow) {
215 block += count;
216 count = overflow;
217 }
218 } while (overflow);
219
28de7948 220error_return:
1da177e4 221 sb->s_dirt = 1;
6c79e987
MS
222 if (sbi->s_lvid_bh)
223 mark_buffer_dirty(sbi->s_lvid_bh);
1e7933de 224 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
225}
226
cb00ea35
CG
227static int udf_bitmap_prealloc_blocks(struct super_block *sb,
228 struct inode *inode,
229 struct udf_bitmap *bitmap,
230 uint16_t partition, uint32_t first_block,
231 uint32_t block_count)
1da177e4
LT
232{
233 struct udf_sb_info *sbi = UDF_SB(sb);
234 int alloc_count = 0;
235 int bit, block, block_group, group_start;
236 int nr_groups, bitmap_nr;
237 struct buffer_head *bh;
6c79e987 238 __u32 part_len;
1da177e4 239
1e7933de 240 mutex_lock(&sbi->s_alloc_mutex);
6c79e987
MS
241 part_len = sbi->s_partmaps[partition].s_partition_len;
242 if (first_block < 0 || first_block >= part_len)
1da177e4
LT
243 goto out;
244
6c79e987
MS
245 if (first_block + block_count > part_len)
246 block_count = part_len - first_block;
1da177e4 247
4daa1b87
MS
248 do {
249 nr_groups = udf_compute_nr_groups(sb, partition);
250 block = first_block + (sizeof(struct spaceBitmapDesc) << 3);
251 block_group = block >> (sb->s_blocksize_bits + 3);
252 group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
1da177e4 253
4daa1b87
MS
254 bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
255 if (bitmap_nr < 0)
256 goto out;
257 bh = bitmap->s_block_bitmap[bitmap_nr];
1da177e4 258
4daa1b87 259 bit = block % (sb->s_blocksize << 3);
1da177e4 260
4daa1b87
MS
261 while (bit < (sb->s_blocksize << 3) && block_count > 0) {
262 if (!udf_test_bit(bit, bh->b_data))
263 goto out;
264 else if (DQUOT_PREALLOC_BLOCK(inode, 1))
265 goto out;
266 else if (!udf_clear_bit(bit, bh->b_data)) {
267 udf_debug("bit already cleared for block %d\n", bit);
268 DQUOT_FREE_BLOCK(inode, 1);
269 goto out;
270 }
271 block_count--;
272 alloc_count++;
273 bit++;
274 block++;
1da177e4 275 }
4daa1b87
MS
276 mark_buffer_dirty(bh);
277 } while (block_count > 0);
278
28de7948 279out:
742ba02a 280 if (udf_add_free_space(sbi, partition, -alloc_count))
6c79e987 281 mark_buffer_dirty(sbi->s_lvid_bh);
1da177e4 282 sb->s_dirt = 1;
1e7933de 283 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
284 return alloc_count;
285}
286
cb00ea35
CG
287static int udf_bitmap_new_block(struct super_block *sb,
288 struct inode *inode,
289 struct udf_bitmap *bitmap, uint16_t partition,
290 uint32_t goal, int *err)
1da177e4
LT
291{
292 struct udf_sb_info *sbi = UDF_SB(sb);
cb00ea35 293 int newbit, bit = 0, block, block_group, group_start;
1da177e4
LT
294 int end_goal, nr_groups, bitmap_nr, i;
295 struct buffer_head *bh = NULL;
296 char *ptr;
297 int newblock = 0;
298
299 *err = -ENOSPC;
1e7933de 300 mutex_lock(&sbi->s_alloc_mutex);
1da177e4 301
28de7948 302repeat:
6c79e987 303 if (goal < 0 || goal >= sbi->s_partmaps[partition].s_partition_len)
1da177e4
LT
304 goal = 0;
305
306 nr_groups = bitmap->s_nr_groups;
307 block = goal + (sizeof(struct spaceBitmapDesc) << 3);
308 block_group = block >> (sb->s_blocksize_bits + 3);
309 group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
310
311 bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
312 if (bitmap_nr < 0)
313 goto error_return;
314 bh = bitmap->s_block_bitmap[bitmap_nr];
28de7948
CG
315 ptr = memscan((char *)bh->b_data + group_start, 0xFF,
316 sb->s_blocksize - group_start);
1da177e4 317
cb00ea35 318 if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) {
1da177e4 319 bit = block % (sb->s_blocksize << 3);
28de7948 320 if (udf_test_bit(bit, bh->b_data))
1da177e4 321 goto got_block;
28de7948 322
1da177e4
LT
323 end_goal = (bit + 63) & ~63;
324 bit = udf_find_next_one_bit(bh->b_data, end_goal, bit);
325 if (bit < end_goal)
326 goto got_block;
28de7948 327
4b11111a
MS
328 ptr = memscan((char *)bh->b_data + (bit >> 3), 0xFF,
329 sb->s_blocksize - ((bit + 7) >> 3));
1da177e4 330 newbit = (ptr - ((char *)bh->b_data)) << 3;
cb00ea35 331 if (newbit < sb->s_blocksize << 3) {
1da177e4
LT
332 bit = newbit;
333 goto search_back;
334 }
28de7948 335
4b11111a
MS
336 newbit = udf_find_next_one_bit(bh->b_data,
337 sb->s_blocksize << 3, bit);
cb00ea35 338 if (newbit < sb->s_blocksize << 3) {
1da177e4
LT
339 bit = newbit;
340 goto got_block;
341 }
342 }
343
cb00ea35
CG
344 for (i = 0; i < (nr_groups * 2); i++) {
345 block_group++;
1da177e4
LT
346 if (block_group >= nr_groups)
347 block_group = 0;
348 group_start = block_group ? 0 : sizeof(struct spaceBitmapDesc);
349
350 bitmap_nr = load_block_bitmap(sb, bitmap, block_group);
351 if (bitmap_nr < 0)
352 goto error_return;
353 bh = bitmap->s_block_bitmap[bitmap_nr];
cb00ea35 354 if (i < nr_groups) {
28de7948
CG
355 ptr = memscan((char *)bh->b_data + group_start, 0xFF,
356 sb->s_blocksize - group_start);
cb00ea35 357 if ((ptr - ((char *)bh->b_data)) < sb->s_blocksize) {
1da177e4
LT
358 bit = (ptr - ((char *)bh->b_data)) << 3;
359 break;
360 }
cb00ea35 361 } else {
28de7948
CG
362 bit = udf_find_next_one_bit((char *)bh->b_data,
363 sb->s_blocksize << 3,
364 group_start << 3);
1da177e4
LT
365 if (bit < sb->s_blocksize << 3)
366 break;
367 }
368 }
cb00ea35 369 if (i >= (nr_groups * 2)) {
1e7933de 370 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
371 return newblock;
372 }
373 if (bit < sb->s_blocksize << 3)
374 goto search_back;
375 else
4b11111a
MS
376 bit = udf_find_next_one_bit(bh->b_data, sb->s_blocksize << 3,
377 group_start << 3);
cb00ea35 378 if (bit >= sb->s_blocksize << 3) {
1e7933de 379 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
380 return 0;
381 }
382
28de7948 383search_back:
4b11111a
MS
384 i = 0;
385 while (i < 7 && bit > (group_start << 3) &&
386 udf_test_bit(bit - 1, bh->b_data)) {
387 ++i;
388 --bit;
389 }
1da177e4 390
28de7948 391got_block:
1da177e4
LT
392
393 /*
394 * Check quota for allocation of this block.
395 */
cb00ea35 396 if (inode && DQUOT_ALLOC_BLOCK(inode, 1)) {
1e7933de 397 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
398 *err = -EDQUOT;
399 return 0;
400 }
401
402 newblock = bit + (block_group << (sb->s_blocksize_bits + 3)) -
28de7948 403 (sizeof(struct spaceBitmapDesc) << 3);
1da177e4 404
cb00ea35 405 if (!udf_clear_bit(bit, bh->b_data)) {
1da177e4
LT
406 udf_debug("bit already cleared for block %d\n", bit);
407 goto repeat;
408 }
409
410 mark_buffer_dirty(bh);
411
742ba02a 412 if (udf_add_free_space(sbi, partition, -1))
6c79e987 413 mark_buffer_dirty(sbi->s_lvid_bh);
1da177e4 414 sb->s_dirt = 1;
1e7933de 415 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
416 *err = 0;
417 return newblock;
418
28de7948 419error_return:
1da177e4 420 *err = -EIO;
1e7933de 421 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
422 return 0;
423}
424
cb00ea35
CG
425static void udf_table_free_blocks(struct super_block *sb,
426 struct inode *inode,
427 struct inode *table,
428 kernel_lb_addr bloc, uint32_t offset,
429 uint32_t count)
1da177e4
LT
430{
431 struct udf_sb_info *sbi = UDF_SB(sb);
432 uint32_t start, end;
ff116fc8
JK
433 uint32_t elen;
434 kernel_lb_addr eloc;
435 struct extent_position oepos, epos;
1da177e4
LT
436 int8_t etype;
437 int i;
48d6d8ff 438 struct udf_inode_info *iinfo;
1da177e4 439
1e7933de 440 mutex_lock(&sbi->s_alloc_mutex);
1da177e4 441 if (bloc.logicalBlockNum < 0 ||
4b11111a
MS
442 (bloc.logicalBlockNum + count) >
443 sbi->s_partmaps[bloc.partitionReferenceNum].s_partition_len) {
28de7948
CG
444 udf_debug("%d < %d || %d + %d > %d\n",
445 bloc.logicalBlockNum, 0, bloc.logicalBlockNum, count,
4b11111a
MS
446 sbi->s_partmaps[bloc.partitionReferenceNum].
447 s_partition_len);
1da177e4
LT
448 goto error_return;
449 }
450
48d6d8ff 451 iinfo = UDF_I(table);
4b11111a
MS
452 /* We do this up front - There are some error conditions that
453 could occure, but.. oh well */
1da177e4
LT
454 if (inode)
455 DQUOT_FREE_BLOCK(inode, count);
742ba02a 456 if (udf_add_free_space(sbi, sbi->s_partition, count))
6c79e987 457 mark_buffer_dirty(sbi->s_lvid_bh);
1da177e4
LT
458
459 start = bloc.logicalBlockNum + offset;
460 end = bloc.logicalBlockNum + offset + count - 1;
461
ff116fc8 462 epos.offset = oepos.offset = sizeof(struct unallocSpaceEntry);
1da177e4 463 elen = 0;
48d6d8ff 464 epos.block = oepos.block = iinfo->i_location;
ff116fc8 465 epos.bh = oepos.bh = NULL;
1da177e4 466
28de7948
CG
467 while (count &&
468 (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) {
4b11111a
MS
469 if (((eloc.logicalBlockNum +
470 (elen >> sb->s_blocksize_bits)) == start)) {
471 if ((0x3FFFFFFF - elen) <
472 (count << sb->s_blocksize_bits)) {
473 uint32_t tmp = ((0x3FFFFFFF - elen) >>
474 sb->s_blocksize_bits);
475 count -= tmp;
476 start += tmp;
477 elen = (etype << 30) |
478 (0x40000000 - sb->s_blocksize);
cb00ea35 479 } else {
4b11111a
MS
480 elen = (etype << 30) |
481 (elen +
482 (count << sb->s_blocksize_bits));
1da177e4
LT
483 start += count;
484 count = 0;
485 }
ff116fc8 486 udf_write_aext(table, &oepos, eloc, elen, 1);
cb00ea35 487 } else if (eloc.logicalBlockNum == (end + 1)) {
4b11111a
MS
488 if ((0x3FFFFFFF - elen) <
489 (count << sb->s_blocksize_bits)) {
490 uint32_t tmp = ((0x3FFFFFFF - elen) >>
491 sb->s_blocksize_bits);
492 count -= tmp;
493 end -= tmp;
494 eloc.logicalBlockNum -= tmp;
495 elen = (etype << 30) |
496 (0x40000000 - sb->s_blocksize);
cb00ea35 497 } else {
1da177e4 498 eloc.logicalBlockNum = start;
4b11111a
MS
499 elen = (etype << 30) |
500 (elen +
501 (count << sb->s_blocksize_bits));
1da177e4
LT
502 end -= count;
503 count = 0;
504 }
ff116fc8 505 udf_write_aext(table, &oepos, eloc, elen, 1);
1da177e4
LT
506 }
507
cb00ea35 508 if (epos.bh != oepos.bh) {
1da177e4 509 i = -1;
ff116fc8 510 oepos.block = epos.block;
3bf25cb4
JK
511 brelse(oepos.bh);
512 get_bh(epos.bh);
ff116fc8
JK
513 oepos.bh = epos.bh;
514 oepos.offset = 0;
28de7948 515 } else {
ff116fc8 516 oepos.offset = epos.offset;
28de7948 517 }
1da177e4
LT
518 }
519
cb00ea35 520 if (count) {
28de7948 521 /*
4b11111a
MS
522 * NOTE: we CANNOT use udf_add_aext here, as it can try to
523 * allocate a new block, and since we hold the super block
524 * lock already very bad things would happen :)
28de7948
CG
525 *
526 * We copy the behavior of udf_add_aext, but instead of
527 * trying to allocate a new block close to the existing one,
528 * we just steal a block from the extent we are trying to add.
529 *
530 * It would be nice if the blocks were close together, but it
531 * isn't required.
cb00ea35 532 */
1da177e4
LT
533
534 int adsize;
535 short_ad *sad = NULL;
536 long_ad *lad = NULL;
537 struct allocExtDesc *aed;
538
539 eloc.logicalBlockNum = start;
28de7948
CG
540 elen = EXT_RECORDED_ALLOCATED |
541 (count << sb->s_blocksize_bits);
1da177e4 542
48d6d8ff 543 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
1da177e4 544 adsize = sizeof(short_ad);
48d6d8ff 545 else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
1da177e4 546 adsize = sizeof(long_ad);
48d6d8ff 547 else {
3bf25cb4
JK
548 brelse(oepos.bh);
549 brelse(epos.bh);
1da177e4
LT
550 goto error_return;
551 }
552
cb00ea35 553 if (epos.offset + (2 * adsize) > sb->s_blocksize) {
1da177e4
LT
554 char *sptr, *dptr;
555 int loffset;
cb00ea35 556
3bf25cb4 557 brelse(oepos.bh);
ff116fc8 558 oepos = epos;
1da177e4
LT
559
560 /* Steal a block from the extent being free'd */
ff116fc8 561 epos.block.logicalBlockNum = eloc.logicalBlockNum;
cb00ea35 562 eloc.logicalBlockNum++;
1da177e4
LT
563 elen -= sb->s_blocksize;
564
4b11111a
MS
565 epos.bh = udf_tread(sb,
566 udf_get_lb_pblock(sb, epos.block, 0));
567 if (!epos.bh) {
3bf25cb4 568 brelse(oepos.bh);
1da177e4
LT
569 goto error_return;
570 }
ff116fc8 571 aed = (struct allocExtDesc *)(epos.bh->b_data);
4b11111a
MS
572 aed->previousAllocExtLocation =
573 cpu_to_le32(oepos.block.logicalBlockNum);
cb00ea35 574 if (epos.offset + adsize > sb->s_blocksize) {
ff116fc8 575 loffset = epos.offset;
1da177e4 576 aed->lengthAllocDescs = cpu_to_le32(adsize);
48d6d8ff 577 sptr = iinfo->i_ext.i_data + epos.offset
c0b34438 578 - adsize;
4b11111a
MS
579 dptr = epos.bh->b_data +
580 sizeof(struct allocExtDesc);
1da177e4 581 memcpy(dptr, sptr, adsize);
4b11111a
MS
582 epos.offset = sizeof(struct allocExtDesc) +
583 adsize;
cb00ea35 584 } else {
ff116fc8 585 loffset = epos.offset + adsize;
1da177e4 586 aed->lengthAllocDescs = cpu_to_le32(0);
cb00ea35 587 if (oepos.bh) {
f5cc15da 588 sptr = oepos.bh->b_data + epos.offset;
4b11111a
MS
589 aed = (struct allocExtDesc *)
590 oepos.bh->b_data;
c2104fda 591 le32_add_cpu(&aed->lengthAllocDescs,
592 adsize);
cb00ea35 593 } else {
48d6d8ff 594 sptr = iinfo->i_ext.i_data +
c0b34438 595 epos.offset;
48d6d8ff 596 iinfo->i_lenAlloc += adsize;
1da177e4
LT
597 mark_inode_dirty(table);
598 }
f5cc15da 599 epos.offset = sizeof(struct allocExtDesc);
1da177e4 600 }
6c79e987 601 if (sbi->s_udfrev >= 0x0200)
4b11111a
MS
602 udf_new_tag(epos.bh->b_data, TAG_IDENT_AED,
603 3, 1, epos.block.logicalBlockNum,
604 sizeof(tag));
1da177e4 605 else
4b11111a
MS
606 udf_new_tag(epos.bh->b_data, TAG_IDENT_AED,
607 2, 1, epos.block.logicalBlockNum,
608 sizeof(tag));
28de7948 609
48d6d8ff 610 switch (iinfo->i_alloc_type) {
4b11111a
MS
611 case ICBTAG_FLAG_AD_SHORT:
612 sad = (short_ad *)sptr;
613 sad->extLength = cpu_to_le32(
614 EXT_NEXT_EXTENT_ALLOCDECS |
615 sb->s_blocksize);
616 sad->extPosition =
617 cpu_to_le32(epos.block.logicalBlockNum);
618 break;
619 case ICBTAG_FLAG_AD_LONG:
620 lad = (long_ad *)sptr;
621 lad->extLength = cpu_to_le32(
622 EXT_NEXT_EXTENT_ALLOCDECS |
623 sb->s_blocksize);
624 lad->extLocation =
625 cpu_to_lelb(epos.block);
626 break;
1da177e4 627 }
cb00ea35 628 if (oepos.bh) {
ff116fc8
JK
629 udf_update_tag(oepos.bh->b_data, loffset);
630 mark_buffer_dirty(oepos.bh);
28de7948 631 } else {
1da177e4 632 mark_inode_dirty(table);
28de7948 633 }
1da177e4
LT
634 }
635
4b11111a
MS
636 /* It's possible that stealing the block emptied the extent */
637 if (elen) {
ff116fc8 638 udf_write_aext(table, &epos, eloc, elen, 1);
1da177e4 639
cb00ea35 640 if (!epos.bh) {
48d6d8ff 641 iinfo->i_lenAlloc += adsize;
1da177e4 642 mark_inode_dirty(table);
cb00ea35 643 } else {
ff116fc8 644 aed = (struct allocExtDesc *)epos.bh->b_data;
c2104fda 645 le32_add_cpu(&aed->lengthAllocDescs, adsize);
ff116fc8
JK
646 udf_update_tag(epos.bh->b_data, epos.offset);
647 mark_buffer_dirty(epos.bh);
1da177e4
LT
648 }
649 }
650 }
651
3bf25cb4
JK
652 brelse(epos.bh);
653 brelse(oepos.bh);
1da177e4 654
28de7948 655error_return:
1da177e4 656 sb->s_dirt = 1;
1e7933de 657 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
658 return;
659}
660
cb00ea35
CG
661static int udf_table_prealloc_blocks(struct super_block *sb,
662 struct inode *inode,
663 struct inode *table, uint16_t partition,
664 uint32_t first_block, uint32_t block_count)
1da177e4
LT
665{
666 struct udf_sb_info *sbi = UDF_SB(sb);
667 int alloc_count = 0;
ff116fc8
JK
668 uint32_t elen, adsize;
669 kernel_lb_addr eloc;
670 struct extent_position epos;
1da177e4 671 int8_t etype = -1;
48d6d8ff 672 struct udf_inode_info *iinfo;
1da177e4 673
4b11111a
MS
674 if (first_block < 0 ||
675 first_block >= sbi->s_partmaps[partition].s_partition_len)
1da177e4
LT
676 return 0;
677
48d6d8ff
MS
678 iinfo = UDF_I(table);
679 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
1da177e4 680 adsize = sizeof(short_ad);
48d6d8ff 681 else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
1da177e4
LT
682 adsize = sizeof(long_ad);
683 else
684 return 0;
685
1e7933de 686 mutex_lock(&sbi->s_alloc_mutex);
ff116fc8 687 epos.offset = sizeof(struct unallocSpaceEntry);
48d6d8ff 688 epos.block = iinfo->i_location;
ff116fc8 689 epos.bh = NULL;
1da177e4
LT
690 eloc.logicalBlockNum = 0xFFFFFFFF;
691
28de7948
CG
692 while (first_block != eloc.logicalBlockNum &&
693 (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) {
1da177e4 694 udf_debug("eloc=%d, elen=%d, first_block=%d\n",
cb00ea35 695 eloc.logicalBlockNum, elen, first_block);
28de7948 696 ; /* empty loop body */
1da177e4
LT
697 }
698
cb00ea35 699 if (first_block == eloc.logicalBlockNum) {
ff116fc8 700 epos.offset -= adsize;
1da177e4
LT
701
702 alloc_count = (elen >> sb->s_blocksize_bits);
4b11111a
MS
703 if (inode && DQUOT_PREALLOC_BLOCK(inode,
704 alloc_count > block_count ? block_count : alloc_count))
1da177e4 705 alloc_count = 0;
4b11111a 706 else if (alloc_count > block_count) {
1da177e4
LT
707 alloc_count = block_count;
708 eloc.logicalBlockNum += alloc_count;
709 elen -= (alloc_count << sb->s_blocksize_bits);
4b11111a
MS
710 udf_write_aext(table, &epos, eloc,
711 (etype << 30) | elen, 1);
712 } else
713 udf_delete_aext(table, epos, eloc,
714 (etype << 30) | elen);
28de7948 715 } else {
1da177e4 716 alloc_count = 0;
28de7948 717 }
1da177e4 718
3bf25cb4 719 brelse(epos.bh);
1da177e4 720
742ba02a 721 if (alloc_count && udf_add_free_space(sbi, partition, -alloc_count)) {
6c79e987 722 mark_buffer_dirty(sbi->s_lvid_bh);
1da177e4
LT
723 sb->s_dirt = 1;
724 }
1e7933de 725 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
726 return alloc_count;
727}
728
cb00ea35
CG
729static int udf_table_new_block(struct super_block *sb,
730 struct inode *inode,
731 struct inode *table, uint16_t partition,
732 uint32_t goal, int *err)
1da177e4
LT
733{
734 struct udf_sb_info *sbi = UDF_SB(sb);
735 uint32_t spread = 0xFFFFFFFF, nspread = 0xFFFFFFFF;
736 uint32_t newblock = 0, adsize;
ff116fc8 737 uint32_t elen, goal_elen = 0;
3ad90ec0 738 kernel_lb_addr eloc, uninitialized_var(goal_eloc);
ff116fc8 739 struct extent_position epos, goal_epos;
1da177e4 740 int8_t etype;
48d6d8ff 741 struct udf_inode_info *iinfo = UDF_I(table);
1da177e4
LT
742
743 *err = -ENOSPC;
744
48d6d8ff 745 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
1da177e4 746 adsize = sizeof(short_ad);
48d6d8ff 747 else if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
1da177e4
LT
748 adsize = sizeof(long_ad);
749 else
750 return newblock;
751
1e7933de 752 mutex_lock(&sbi->s_alloc_mutex);
6c79e987 753 if (goal < 0 || goal >= sbi->s_partmaps[partition].s_partition_len)
1da177e4
LT
754 goal = 0;
755
4b11111a
MS
756 /* We search for the closest matching block to goal. If we find
757 a exact hit, we stop. Otherwise we keep going till we run out
758 of extents. We store the buffer_head, bloc, and extoffset
759 of the current closest match and use that when we are done.
cb00ea35 760 */
ff116fc8 761 epos.offset = sizeof(struct unallocSpaceEntry);
48d6d8ff 762 epos.block = iinfo->i_location;
ff116fc8 763 epos.bh = goal_epos.bh = NULL;
1da177e4 764
28de7948
CG
765 while (spread &&
766 (etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1) {
cb00ea35 767 if (goal >= eloc.logicalBlockNum) {
4b11111a
MS
768 if (goal < eloc.logicalBlockNum +
769 (elen >> sb->s_blocksize_bits))
1da177e4
LT
770 nspread = 0;
771 else
772 nspread = goal - eloc.logicalBlockNum -
28de7948
CG
773 (elen >> sb->s_blocksize_bits);
774 } else {
1da177e4 775 nspread = eloc.logicalBlockNum - goal;
28de7948 776 }
1da177e4 777
cb00ea35 778 if (nspread < spread) {
1da177e4 779 spread = nspread;
cb00ea35 780 if (goal_epos.bh != epos.bh) {
3bf25cb4 781 brelse(goal_epos.bh);
ff116fc8 782 goal_epos.bh = epos.bh;
3bf25cb4 783 get_bh(goal_epos.bh);
1da177e4 784 }
ff116fc8
JK
785 goal_epos.block = epos.block;
786 goal_epos.offset = epos.offset - adsize;
1da177e4
LT
787 goal_eloc = eloc;
788 goal_elen = (etype << 30) | elen;
789 }
790 }
791
3bf25cb4 792 brelse(epos.bh);
1da177e4 793
cb00ea35 794 if (spread == 0xFFFFFFFF) {
3bf25cb4 795 brelse(goal_epos.bh);
1e7933de 796 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
797 return 0;
798 }
799
800 /* Only allocate blocks from the beginning of the extent.
801 That way, we only delete (empty) extents, never have to insert an
802 extent because of splitting */
803 /* This works, but very poorly.... */
804
805 newblock = goal_eloc.logicalBlockNum;
cb00ea35 806 goal_eloc.logicalBlockNum++;
1da177e4
LT
807 goal_elen -= sb->s_blocksize;
808
cb00ea35 809 if (inode && DQUOT_ALLOC_BLOCK(inode, 1)) {
3bf25cb4 810 brelse(goal_epos.bh);
1e7933de 811 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
812 *err = -EDQUOT;
813 return 0;
814 }
815
816 if (goal_elen)
ff116fc8 817 udf_write_aext(table, &goal_epos, goal_eloc, goal_elen, 1);
1da177e4 818 else
ff116fc8 819 udf_delete_aext(table, goal_epos, goal_eloc, goal_elen);
3bf25cb4 820 brelse(goal_epos.bh);
1da177e4 821
742ba02a 822 if (udf_add_free_space(sbi, partition, -1))
6c79e987 823 mark_buffer_dirty(sbi->s_lvid_bh);
1da177e4
LT
824
825 sb->s_dirt = 1;
1e7933de 826 mutex_unlock(&sbi->s_alloc_mutex);
1da177e4
LT
827 *err = 0;
828 return newblock;
829}
830
cb00ea35
CG
831inline void udf_free_blocks(struct super_block *sb,
832 struct inode *inode,
833 kernel_lb_addr bloc, uint32_t offset,
834 uint32_t count)
1da177e4
LT
835{
836 uint16_t partition = bloc.partitionReferenceNum;
6c79e987 837 struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
1da177e4 838
6c79e987 839 if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) {
1da177e4 840 return udf_bitmap_free_blocks(sb, inode,
6c79e987 841 map->s_uspace.s_bitmap,
28de7948 842 bloc, offset, count);
6c79e987 843 } else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) {
1da177e4 844 return udf_table_free_blocks(sb, inode,
6c79e987 845 map->s_uspace.s_table,
28de7948 846 bloc, offset, count);
6c79e987 847 } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) {
1da177e4 848 return udf_bitmap_free_blocks(sb, inode,
6c79e987 849 map->s_fspace.s_bitmap,
28de7948 850 bloc, offset, count);
6c79e987 851 } else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) {
1da177e4 852 return udf_table_free_blocks(sb, inode,
6c79e987 853 map->s_fspace.s_table,
28de7948
CG
854 bloc, offset, count);
855 } else {
1da177e4 856 return;
28de7948 857 }
1da177e4
LT
858}
859
cb00ea35
CG
860inline int udf_prealloc_blocks(struct super_block *sb,
861 struct inode *inode,
862 uint16_t partition, uint32_t first_block,
863 uint32_t block_count)
1da177e4 864{
6c79e987
MS
865 struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
866
4b11111a 867 if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
1da177e4 868 return udf_bitmap_prealloc_blocks(sb, inode,
6c79e987 869 map->s_uspace.s_bitmap,
4b11111a
MS
870 partition, first_block,
871 block_count);
872 else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
1da177e4 873 return udf_table_prealloc_blocks(sb, inode,
6c79e987 874 map->s_uspace.s_table,
4b11111a
MS
875 partition, first_block,
876 block_count);
877 else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
1da177e4 878 return udf_bitmap_prealloc_blocks(sb, inode,
6c79e987 879 map->s_fspace.s_bitmap,
4b11111a
MS
880 partition, first_block,
881 block_count);
882 else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
1da177e4 883 return udf_table_prealloc_blocks(sb, inode,
6c79e987 884 map->s_fspace.s_table,
4b11111a
MS
885 partition, first_block,
886 block_count);
887 else
1da177e4
LT
888 return 0;
889}
890
cb00ea35
CG
891inline int udf_new_block(struct super_block *sb,
892 struct inode *inode,
893 uint16_t partition, uint32_t goal, int *err)
1da177e4 894{
6c79e987 895 struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
3bf25cb4 896
4b11111a
MS
897 if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
898 return udf_bitmap_new_block(sb, inode,
6c79e987 899 map->s_uspace.s_bitmap,
28de7948 900 partition, goal, err);
4b11111a 901 else if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
1da177e4 902 return udf_table_new_block(sb, inode,
6c79e987 903 map->s_uspace.s_table,
28de7948 904 partition, goal, err);
4b11111a 905 else if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
1da177e4 906 return udf_bitmap_new_block(sb, inode,
6c79e987 907 map->s_fspace.s_bitmap,
28de7948 908 partition, goal, err);
4b11111a 909 else if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
1da177e4 910 return udf_table_new_block(sb, inode,
6c79e987 911 map->s_fspace.s_table,
28de7948 912 partition, goal, err);
4b11111a 913 else {
1da177e4
LT
914 *err = -EIO;
915 return 0;
916 }
917}