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