balloc.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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