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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * inode.c
  3.  *
  4.  * PURPOSE
  5.  *  Inode 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) 1998 Dave Boynton
  19.  *  (C) 1998-2001 Ben Fennema
  20.  *  (C) 1999-2000 Stelias Computing Inc
  21.  *
  22.  * HISTORY
  23.  *
  24.  *  10/04/98 dgb  Added rudimentary directory functions
  25.  *  10/07/98      Fully working udf_block_map! It works!
  26.  *  11/25/98      bmap altered to better support extents
  27.  *  12/06/98 blf  partition support in udf_iget, udf_block_map and udf_read_inode
  28.  *  12/12/98      rewrote udf_block_map to handle next extents and descs across
  29.  *                block boundaries (which is not actually allowed)
  30.  *  12/20/98      added support for strategy 4096
  31.  *  03/07/99      rewrote udf_block_map (again)
  32.  *                New funcs, inode_bmap, udf_next_aext
  33.  *  04/19/99      Support for writing device EA's for major/minor #
  34.  */
  35. #include "udfdecl.h"
  36. #include <linux/locks.h>
  37. #include <linux/mm.h>
  38. #include <linux/smp_lock.h>
  39. #include <linux/module.h>
  40. #include "udf_i.h"
  41. #include "udf_sb.h"
  42. MODULE_AUTHOR("Ben Fennema");
  43. MODULE_DESCRIPTION("Universal Disk Format Filesystem");
  44. MODULE_LICENSE("GPL");
  45. #define EXTENT_MERGE_SIZE 5
  46. static mode_t udf_convert_permissions(struct fileEntry *);
  47. static int udf_update_inode(struct inode *, int);
  48. static void udf_fill_inode(struct inode *, struct buffer_head *);
  49. static struct buffer_head *inode_getblk(struct inode *, long, int *, long *, int *);
  50. static void udf_split_extents(struct inode *, int *, int, int,
  51. long_ad [EXTENT_MERGE_SIZE], int *);
  52. static void udf_prealloc_extents(struct inode *, int, int,
  53.  long_ad [EXTENT_MERGE_SIZE], int *);
  54. static void udf_merge_extents(struct inode *,
  55.  long_ad [EXTENT_MERGE_SIZE], int *);
  56. static void udf_update_extents(struct inode *,
  57. long_ad [EXTENT_MERGE_SIZE], int, int,
  58. lb_addr, uint32_t, struct buffer_head **);
  59. static int udf_get_block(struct inode *, long, struct buffer_head *, int);
  60. /*
  61.  * udf_put_inode
  62.  *
  63.  * PURPOSE
  64.  *
  65.  * DESCRIPTION
  66.  * This routine is called whenever the kernel no longer needs the inode.
  67.  *
  68.  * HISTORY
  69.  * July 1, 1997 - Andrew E. Mileski
  70.  * Written, tested, and released.
  71.  *
  72.  *  Called at each iput()
  73.  */
  74. void udf_put_inode(struct inode * inode)
  75. {
  76. if (!(inode->i_sb->s_flags & MS_RDONLY))
  77. {
  78. lock_kernel();
  79. udf_discard_prealloc(inode);
  80. unlock_kernel();
  81. }
  82. }
  83. /*
  84.  * udf_delete_inode
  85.  *
  86.  * PURPOSE
  87.  * Clean-up before the specified inode is destroyed.
  88.  *
  89.  * DESCRIPTION
  90.  * This routine is called when the kernel destroys an inode structure
  91.  * ie. when iput() finds i_count == 0.
  92.  *
  93.  * HISTORY
  94.  * July 1, 1997 - Andrew E. Mileski
  95.  * Written, tested, and released.
  96.  *
  97.  *  Called at the last iput() if i_nlink is zero.
  98.  */
  99. void udf_delete_inode(struct inode * inode)
  100. {
  101. lock_kernel();
  102. if (is_bad_inode(inode))
  103. goto no_delete;
  104. inode->i_size = 0;
  105. udf_truncate(inode);
  106. udf_update_inode(inode, IS_SYNC(inode));
  107. udf_free_inode(inode);
  108. unlock_kernel();
  109. return;
  110. no_delete:
  111. unlock_kernel();
  112. clear_inode(inode);
  113. }
  114. void udf_discard_prealloc(struct inode * inode)
  115. {
  116. if (inode->i_size && inode->i_size != UDF_I_LENEXTENTS(inode) &&
  117. UDF_I_ALLOCTYPE(inode) != ICBTAG_FLAG_AD_IN_ICB)
  118. {
  119. udf_truncate_extents(inode);
  120. }
  121. }
  122. static int udf_writepage(struct page *page)
  123. {
  124. return block_write_full_page(page, udf_get_block);
  125. }
  126. static int udf_readpage(struct file *file, struct page *page)
  127. {
  128. return block_read_full_page(page, udf_get_block);
  129. }
  130. static int udf_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
  131. {
  132. return block_prepare_write(page, from, to, udf_get_block);
  133. }
  134. static int udf_bmap(struct address_space *mapping, long block)
  135. {
  136. return generic_block_bmap(mapping,block,udf_get_block);
  137. }
  138. struct address_space_operations udf_aops = {
  139. readpage: udf_readpage,
  140. writepage: udf_writepage,
  141. sync_page: block_sync_page,
  142. prepare_write: udf_prepare_write,
  143. commit_write: generic_commit_write,
  144. bmap: udf_bmap,
  145. };
  146. void udf_expand_file_adinicb(struct inode * inode, int newsize, int * err)
  147. {
  148. struct buffer_head *bh = NULL;
  149. struct page *page;
  150. char *kaddr;
  151. int block;
  152. /* from now on we have normal address_space methods */
  153. inode->i_data.a_ops = &udf_aops;
  154. if (!UDF_I_LENALLOC(inode))
  155. {
  156. if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
  157. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
  158. else
  159. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
  160. mark_inode_dirty(inode);
  161. return;
  162. }
  163. block = udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0);
  164. bh = udf_tread(inode->i_sb, block);
  165. if (!bh)
  166. return;
  167. page = grab_cache_page(inode->i_mapping, 0);
  168. if (!PageLocked(page))
  169. PAGE_BUG(page);
  170. if (!Page_Uptodate(page))
  171. {
  172. kaddr = kmap(page);
  173. memset(kaddr + UDF_I_LENALLOC(inode), 0x00,
  174. PAGE_CACHE_SIZE - UDF_I_LENALLOC(inode));
  175. memcpy(kaddr, bh->b_data + udf_file_entry_alloc_offset(inode),
  176. UDF_I_LENALLOC(inode));
  177. flush_dcache_page(page);
  178. SetPageUptodate(page);
  179. kunmap(page);
  180. }
  181. memset(bh->b_data + udf_file_entry_alloc_offset(inode),
  182. 0, UDF_I_LENALLOC(inode));
  183. UDF_I_LENALLOC(inode) = 0;
  184. if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
  185. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
  186. else
  187. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
  188. mark_buffer_dirty_inode(bh, inode);
  189. udf_release_data(bh);
  190. inode->i_data.a_ops->writepage(page);
  191. page_cache_release(page);
  192. mark_inode_dirty(inode);
  193. inode->i_version ++;
  194. }
  195. struct buffer_head * udf_expand_dir_adinicb(struct inode *inode, int *block, int *err)
  196. {
  197. int newblock;
  198. struct buffer_head *sbh = NULL, *dbh = NULL;
  199. lb_addr bloc, eloc;
  200. uint32_t elen, extoffset;
  201. struct udf_fileident_bh sfibh, dfibh;
  202. loff_t f_pos = udf_ext0_offset(inode) >> 2;
  203. int size = (udf_ext0_offset(inode) + inode->i_size) >> 2;
  204. struct fileIdentDesc cfi, *sfi, *dfi;
  205. if (!inode->i_size)
  206. {
  207. if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
  208. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
  209. else
  210. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
  211. mark_inode_dirty(inode);
  212. return NULL;
  213. }
  214. /* alloc block, and copy data to it */
  215. *block = udf_new_block(inode->i_sb, inode,
  216. UDF_I_LOCATION(inode).partitionReferenceNum,
  217. UDF_I_LOCATION(inode).logicalBlockNum, err);
  218. if (!(*block))
  219. return NULL;
  220. newblock = udf_get_pblock(inode->i_sb, *block,
  221. UDF_I_LOCATION(inode).partitionReferenceNum, 0);
  222. if (!newblock)
  223. return NULL;
  224. sbh = udf_tread(inode->i_sb, inode->i_ino);
  225. if (!sbh)
  226. return NULL;
  227. dbh = udf_tgetblk(inode->i_sb, newblock);
  228. if (!dbh)
  229. return NULL;
  230. lock_buffer(dbh);
  231. memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize);
  232. mark_buffer_uptodate(dbh, 1);
  233. unlock_buffer(dbh);
  234. mark_buffer_dirty_inode(dbh, inode);
  235. sfibh.soffset = sfibh.eoffset = (f_pos & ((inode->i_sb->s_blocksize - 1) >> 2)) << 2;
  236. sfibh.sbh = sfibh.ebh = sbh;
  237. dfibh.soffset = dfibh.eoffset = 0;
  238. dfibh.sbh = dfibh.ebh = dbh;
  239. while ( (f_pos < size) )
  240. {
  241. sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, NULL, NULL, NULL, NULL, NULL);
  242. if (!sfi)
  243. {
  244. udf_release_data(sbh);
  245. udf_release_data(dbh);
  246. return NULL;
  247. }
  248. sfi->descTag.tagLocation = *block;
  249. dfibh.soffset = dfibh.eoffset;
  250. dfibh.eoffset += (sfibh.eoffset - sfibh.soffset);
  251. dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset);
  252. if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse,
  253. sfi->fileIdent + sfi->lengthOfImpUse))
  254. {
  255. udf_release_data(sbh);
  256. udf_release_data(dbh);
  257. return NULL;
  258. }
  259. }
  260. mark_buffer_dirty_inode(dbh, inode);
  261. memset(sbh->b_data + udf_file_entry_alloc_offset(inode),
  262. 0, UDF_I_LENALLOC(inode));
  263. UDF_I_LENALLOC(inode) = 0;
  264. if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
  265. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
  266. else
  267. UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
  268. bloc = UDF_I_LOCATION(inode);
  269. eloc.logicalBlockNum = *block;
  270. eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
  271. elen = inode->i_size;
  272. UDF_I_LENEXTENTS(inode) = elen;
  273. extoffset = udf_file_entry_alloc_offset(inode);
  274. udf_add_aext(inode, &bloc, &extoffset, eloc, elen, &sbh, 0);
  275. /* UniqueID stuff */
  276. mark_buffer_dirty(sbh);
  277. udf_release_data(sbh);
  278. mark_inode_dirty(inode);
  279. inode->i_version ++;
  280. return dbh;
  281. }
  282. static int udf_get_block(struct inode *inode, long block, struct buffer_head *bh_result, int create)
  283. {
  284. int err, new;
  285. struct buffer_head *bh;
  286. unsigned long phys;
  287. if (!create)
  288. {
  289. phys = udf_block_map(inode, block);
  290. if (phys)
  291. {
  292. bh_result->b_dev = inode->i_dev;
  293. bh_result->b_blocknr = phys;
  294. bh_result->b_state |= (1UL << BH_Mapped);
  295. }
  296. return 0;
  297. }
  298. err = -EIO;
  299. new = 0;
  300. bh = NULL;
  301. lock_kernel();
  302. if (block < 0)
  303. goto abort_negative;
  304. if (block == UDF_I_NEXT_ALLOC_BLOCK(inode) + 1)
  305. {
  306. UDF_I_NEXT_ALLOC_BLOCK(inode) ++;
  307. UDF_I_NEXT_ALLOC_GOAL(inode) ++;
  308. }
  309. err = 0;
  310. bh = inode_getblk(inode, block, &err, &phys, &new);
  311. if (bh)
  312. BUG();
  313. if (err)
  314. goto abort;
  315. if (!phys)
  316. BUG();
  317. bh_result->b_dev = inode->i_dev;
  318. bh_result->b_blocknr = phys;
  319. bh_result->b_state |= (1UL << BH_Mapped);
  320. if (new)
  321. bh_result->b_state |= (1UL << BH_New);
  322. abort:
  323. unlock_kernel();
  324. return err;
  325. abort_negative:
  326. udf_warning(inode->i_sb, "udf_get_block", "block < 0");
  327. goto abort;
  328. }
  329. struct buffer_head * udf_getblk(struct inode * inode, long block,
  330. int create, int * err)
  331. {
  332. struct buffer_head dummy;
  333. dummy.b_state = 0;
  334. dummy.b_blocknr = -1000;
  335. *err = udf_get_block(inode, block, &dummy, create);
  336. if (!*err && buffer_mapped(&dummy))
  337. {
  338. struct buffer_head *bh;
  339. bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
  340. if (buffer_new(&dummy))
  341. {
  342. lock_buffer(bh);
  343. memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
  344. mark_buffer_uptodate(bh, 1);
  345. unlock_buffer(bh);
  346. mark_buffer_dirty_inode(bh, inode);
  347. }
  348. return bh;
  349. }
  350. return NULL;
  351. }
  352. static struct buffer_head * inode_getblk(struct inode * inode, long block,
  353. int *err, long *phys, int *new)
  354. {
  355. struct buffer_head *pbh = NULL, *cbh = NULL, *nbh = NULL, *result = NULL;
  356. long_ad laarr[EXTENT_MERGE_SIZE];
  357. uint32_t pextoffset = 0, cextoffset = 0, nextoffset = 0;
  358. int count = 0, startnum = 0, endnum = 0;
  359. uint32_t elen = 0;
  360. lb_addr eloc, pbloc, cbloc, nbloc;
  361. int c = 1;
  362. uint64_t lbcount = 0, b_off = 0;
  363. uint32_t newblocknum, newblock, offset = 0;
  364. int8_t etype;
  365. int goal = 0, pgoal = UDF_I_LOCATION(inode).logicalBlockNum;
  366. char lastblock = 0;
  367. pextoffset = cextoffset = nextoffset = udf_file_entry_alloc_offset(inode);
  368. b_off = (uint64_t)block << inode->i_sb->s_blocksize_bits;
  369. pbloc = cbloc = nbloc = UDF_I_LOCATION(inode);
  370. /* find the extent which contains the block we are looking for.
  371.        alternate between laarr[0] and laarr[1] for locations of the
  372.        current extent, and the previous extent */
  373. do
  374. {
  375. if (pbh != cbh)
  376. {
  377. udf_release_data(pbh);
  378. atomic_inc(&cbh->b_count);
  379. pbh = cbh;
  380. }
  381. if (cbh != nbh)
  382. {
  383. udf_release_data(cbh);
  384. atomic_inc(&nbh->b_count);
  385. cbh = nbh;
  386. }
  387. lbcount += elen;
  388. pbloc = cbloc;
  389. cbloc = nbloc;
  390. pextoffset = cextoffset;
  391. cextoffset = nextoffset;
  392. if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) == -1)
  393. break;
  394. c = !c;
  395. laarr[c].extLength = (etype << 30) | elen;
  396. laarr[c].extLocation = eloc;
  397. if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
  398. pgoal = eloc.logicalBlockNum +
  399. ((elen + inode->i_sb->s_blocksize - 1) >>
  400. inode->i_sb->s_blocksize_bits);
  401. count ++;
  402. } while (lbcount + elen <= b_off);
  403. b_off -= lbcount;
  404. offset = b_off >> inode->i_sb->s_blocksize_bits;
  405. /* if the extent is allocated and recorded, return the block
  406.        if the extent is not a multiple of the blocksize, round up */
  407. if (etype == (EXT_RECORDED_ALLOCATED >> 30))
  408. {
  409. if (elen & (inode->i_sb->s_blocksize - 1))
  410. {
  411. elen = EXT_RECORDED_ALLOCATED |
  412. ((elen + inode->i_sb->s_blocksize - 1) &
  413. ~(inode->i_sb->s_blocksize - 1));
  414. etype = udf_write_aext(inode, nbloc, &cextoffset, eloc, elen, nbh, 1);
  415. }
  416. udf_release_data(pbh);
  417. udf_release_data(cbh);
  418. udf_release_data(nbh);
  419. newblock = udf_get_lb_pblock(inode->i_sb, eloc, offset);
  420. *phys = newblock;
  421. return NULL;
  422. }
  423. if (etype == -1)
  424. {
  425. endnum = startnum = ((count > 1) ? 1 : count);
  426. if (laarr[c].extLength & (inode->i_sb->s_blocksize - 1))
  427. {
  428. laarr[c].extLength =
  429. (laarr[c].extLength & UDF_EXTENT_FLAG_MASK) |
  430. (((laarr[c].extLength & UDF_EXTENT_LENGTH_MASK) +
  431. inode->i_sb->s_blocksize - 1) &
  432. ~(inode->i_sb->s_blocksize - 1));
  433. UDF_I_LENEXTENTS(inode) =
  434. (UDF_I_LENEXTENTS(inode) + inode->i_sb->s_blocksize - 1) &
  435. ~(inode->i_sb->s_blocksize - 1);
  436. }
  437. c = !c;
  438. laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
  439. ((offset + 1) << inode->i_sb->s_blocksize_bits);
  440. memset(&laarr[c].extLocation, 0x00, sizeof(lb_addr));
  441. count ++;
  442. endnum ++;
  443. lastblock = 1;
  444. }
  445. else
  446. endnum = startnum = ((count > 2) ? 2 : count);
  447. /* if the current extent is in position 0, swap it with the previous */
  448. if (!c && count != 1)
  449. {
  450. laarr[2] = laarr[0];
  451. laarr[0] = laarr[1];
  452. laarr[1] = laarr[2];
  453. c = 1;
  454. }
  455. /* if the current block is located in a extent, read the next extent */
  456. if (etype != -1)
  457. {
  458. if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 0)) != -1)
  459. {
  460. laarr[c+1].extLength = (etype << 30) | elen;
  461. laarr[c+1].extLocation = eloc;
  462. count ++;
  463. startnum ++;
  464. endnum ++;
  465. }
  466. else
  467. lastblock = 1;
  468. }
  469. udf_release_data(nbh);
  470. if (!pbh)
  471. pbh = cbh;
  472. else
  473. udf_release_data(cbh);
  474. /* if the current extent is not recorded but allocated, get the
  475. block in the extent corresponding to the requested block */
  476. if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
  477. newblocknum = laarr[c].extLocation.logicalBlockNum + offset;
  478. else /* otherwise, allocate a new block */
  479. {
  480. if (UDF_I_NEXT_ALLOC_BLOCK(inode) == block)
  481. goal = UDF_I_NEXT_ALLOC_GOAL(inode);
  482. if (!goal)
  483. {
  484. if (!(goal = pgoal))
  485. goal = UDF_I_LOCATION(inode).logicalBlockNum + 1;
  486. }
  487. if (!(newblocknum = udf_new_block(inode->i_sb, inode,
  488. UDF_I_LOCATION(inode).partitionReferenceNum, goal, err)))
  489. {
  490. udf_release_data(pbh);
  491. *err = -ENOSPC;
  492. return NULL;
  493. }
  494. UDF_I_LENEXTENTS(inode) += inode->i_sb->s_blocksize;
  495. }
  496. /* if the extent the requsted block is located in contains multiple blocks,
  497.        split the extent into at most three extents. blocks prior to requested
  498.        block, requested block, and blocks after requested block */
  499. udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);
  500. #ifdef UDF_PREALLOCATE
  501. /* preallocate blocks */
  502. udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
  503. #endif
  504. /* merge any continuous blocks in laarr */
  505. udf_merge_extents(inode, laarr, &endnum);
  506. /* write back the new extents, inserting new extents if the new number
  507.        of extents is greater than the old number, and deleting extents if
  508.        the new number of extents is less than the old number */
  509. udf_update_extents(inode, laarr, startnum, endnum, pbloc, pextoffset, &pbh);
  510. udf_release_data(pbh);
  511. if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum,
  512. UDF_I_LOCATION(inode).partitionReferenceNum, 0)))
  513. {
  514. return NULL;
  515. }
  516. *phys = newblock;
  517. *err = 0;
  518. *new = 1;
  519. UDF_I_NEXT_ALLOC_BLOCK(inode) = block;
  520. UDF_I_NEXT_ALLOC_GOAL(inode) = newblocknum;
  521. inode->i_ctime = CURRENT_TIME;
  522. UDF_I_UCTIME(inode) = CURRENT_UTIME;
  523. if (IS_SYNC(inode))
  524. udf_sync_inode(inode);
  525. else
  526. mark_inode_dirty(inode);
  527. return result;
  528. }
  529. static void udf_split_extents(struct inode *inode, int *c, int offset, int newblocknum,
  530. long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
  531. {
  532. if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) ||
  533. (laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
  534. {
  535. int curr = *c;
  536. int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) +
  537. inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
  538. int type = laarr[curr].extLength & ~UDF_EXTENT_LENGTH_MASK;
  539. if (blen == 1)
  540. ;
  541. else if (!offset || blen == offset + 1)
  542. {
  543. laarr[curr+2] = laarr[curr+1];
  544. laarr[curr+1] = laarr[curr];
  545. }
  546. else
  547. {
  548. laarr[curr+3] = laarr[curr+1];
  549. laarr[curr+2] = laarr[curr+1] = laarr[curr];
  550. }
  551. if (offset)
  552. {
  553. if ((type >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
  554. {
  555. udf_free_blocks(inode->i_sb, inode, laarr[curr].extLocation, 0, offset);
  556. laarr[curr].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
  557. (offset << inode->i_sb->s_blocksize_bits);
  558. laarr[curr].extLocation.logicalBlockNum = 0;
  559. laarr[curr].extLocation.partitionReferenceNum = 0;
  560. }
  561. else
  562. laarr[curr].extLength = type |
  563. (offset << inode->i_sb->s_blocksize_bits);
  564. curr ++;
  565. (*c) ++;
  566. (*endnum) ++;
  567. }
  568. laarr[curr].extLocation.logicalBlockNum = newblocknum;
  569. if ((type >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
  570. laarr[curr].extLocation.partitionReferenceNum =
  571. UDF_I_LOCATION(inode).partitionReferenceNum;
  572. laarr[curr].extLength = EXT_RECORDED_ALLOCATED |
  573. inode->i_sb->s_blocksize;
  574. curr ++;
  575. if (blen != offset + 1)
  576. {
  577. if ((type >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
  578. laarr[curr].extLocation.logicalBlockNum += (offset + 1);
  579. laarr[curr].extLength = type |
  580. ((blen - (offset + 1)) << inode->i_sb->s_blocksize_bits);
  581. curr ++;
  582. (*endnum) ++;
  583. }
  584. }
  585. }
  586. static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
  587.  long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
  588. {
  589. int start, length = 0, currlength = 0, i;
  590. if (*endnum >= (c+1))
  591. {
  592. if (!lastblock)
  593. return;
  594. else
  595. start = c;
  596. }
  597. else
  598. {
  599. if ((laarr[c+1].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
  600. {
  601. start = c+1;
  602. length = currlength = (((laarr[c+1].extLength & UDF_EXTENT_LENGTH_MASK) +
  603. inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
  604. }
  605. else
  606. start = c;
  607. }
  608. for (i=start+1; i<=*endnum; i++)
  609. {
  610. if (i == *endnum)
  611. {
  612. if (lastblock)
  613. length += UDF_DEFAULT_PREALLOC_BLOCKS;
  614. }
  615. else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
  616. length += (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
  617. inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
  618. else
  619. break;
  620. }
  621. if (length)
  622. {
  623. int next = laarr[start].extLocation.logicalBlockNum +
  624. (((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) +
  625. inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
  626. int numalloc = udf_prealloc_blocks(inode->i_sb, inode,
  627. laarr[start].extLocation.partitionReferenceNum,
  628. next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ? length :
  629. UDF_DEFAULT_PREALLOC_BLOCKS) - currlength);
  630. if (numalloc)
  631. {
  632. if (start == (c+1))
  633. laarr[start].extLength +=
  634. (numalloc << inode->i_sb->s_blocksize_bits);
  635. else
  636. {
  637. memmove(&laarr[c+2], &laarr[c+1],
  638. sizeof(long_ad) * (*endnum - (c+1)));
  639. (*endnum) ++;
  640. laarr[c+1].extLocation.logicalBlockNum = next;
  641. laarr[c+1].extLocation.partitionReferenceNum =
  642. laarr[c].extLocation.partitionReferenceNum;
  643. laarr[c+1].extLength = EXT_NOT_RECORDED_ALLOCATED |
  644. (numalloc << inode->i_sb->s_blocksize_bits);
  645. start = c+1;
  646. }
  647. for (i=start+1; numalloc && i<*endnum; i++)
  648. {
  649. int elen = ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
  650. inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
  651. if (elen > numalloc)
  652. {
  653. laarr[c].extLength -=
  654. (numalloc << inode->i_sb->s_blocksize_bits);
  655. numalloc = 0;
  656. }
  657. else
  658. {
  659. numalloc -= elen;
  660. if (*endnum > (i+1))
  661. memmove(&laarr[i], &laarr[i+1], 
  662. sizeof(long_ad) * (*endnum - (i+1)));
  663. i --;
  664. (*endnum) --;
  665. }
  666. }
  667. UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
  668. }
  669. }
  670. }
  671. static void udf_merge_extents(struct inode *inode,
  672.  long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
  673. {
  674. int i;
  675. for (i=0; i<(*endnum-1); i++)
  676. {
  677. if ((laarr[i].extLength >> 30) == (laarr[i+1].extLength >> 30))
  678. {
  679. if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) ||
  680. ((laarr[i+1].extLocation.logicalBlockNum - laarr[i].extLocation.logicalBlockNum) ==
  681. (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
  682. inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits)))
  683. {
  684. if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
  685. (laarr[i+1].extLength & UDF_EXTENT_LENGTH_MASK) +
  686. inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK)
  687. {
  688. laarr[i+1].extLength = (laarr[i+1].extLength -
  689. (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
  690. UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize-1);
  691. laarr[i].extLength = (UDF_EXTENT_LENGTH_MASK + 1) -
  692. inode->i_sb->s_blocksize;
  693. laarr[i+1].extLocation.logicalBlockNum =
  694. laarr[i].extLocation.logicalBlockNum +
  695. ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) >>
  696. inode->i_sb->s_blocksize_bits);
  697. }
  698. else
  699. {
  700. laarr[i].extLength = laarr[i+1].extLength +
  701. (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
  702. inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize-1));
  703. if (*endnum > (i+2))
  704. memmove(&laarr[i+1], &laarr[i+2],
  705. sizeof(long_ad) * (*endnum - (i+2)));
  706. i --;
  707. (*endnum) --;
  708. }
  709. }
  710. }
  711. }
  712. }
  713. static void udf_update_extents(struct inode *inode,
  714. long_ad laarr[EXTENT_MERGE_SIZE], int startnum, int endnum,
  715. lb_addr pbloc, uint32_t pextoffset, struct buffer_head **pbh)
  716. {
  717. int start = 0, i;
  718. lb_addr tmploc;
  719. uint32_t tmplen;
  720. if (startnum > endnum)
  721. {
  722. for (i=0; i<(startnum-endnum); i++)
  723. {
  724. udf_delete_aext(inode, pbloc, pextoffset, laarr[i].extLocation,
  725. laarr[i].extLength, *pbh);
  726. }
  727. }
  728. else if (startnum < endnum)
  729. {
  730. for (i=0; i<(endnum-startnum); i++)
  731. {
  732. udf_insert_aext(inode, pbloc, pextoffset, laarr[i].extLocation,
  733. laarr[i].extLength, *pbh);
  734. udf_next_aext(inode, &pbloc, &pextoffset, &laarr[i].extLocation,
  735. &laarr[i].extLength, pbh, 1);
  736. start ++;
  737. }
  738. }
  739. for (i=start; i<endnum; i++)
  740. {
  741. udf_next_aext(inode, &pbloc, &pextoffset, &tmploc, &tmplen, pbh, 0);
  742. udf_write_aext(inode, pbloc, &pextoffset, laarr[i].extLocation,
  743. laarr[i].extLength, *pbh, 1);
  744. }
  745. }
  746. struct buffer_head * udf_bread(struct inode * inode, int block,
  747. int create, int * err)
  748. {
  749. struct buffer_head * bh = NULL;
  750. bh = udf_getblk(inode, block, create, err);
  751. if (!bh)
  752. return NULL;
  753. if (buffer_uptodate(bh))
  754. return bh;
  755. ll_rw_block(READ, 1, &bh);
  756. wait_on_buffer(bh);
  757. if (buffer_uptodate(bh))
  758. return bh;
  759. brelse(bh);
  760. *err = -EIO;
  761. return NULL;
  762. }
  763. void udf_truncate(struct inode * inode)
  764. {
  765. int offset;
  766. struct buffer_head *bh;
  767. int err;
  768. if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
  769. S_ISLNK(inode->i_mode)))
  770. return;
  771. if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
  772. return;
  773. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
  774. {
  775. if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +
  776. inode->i_size))
  777. {
  778. udf_expand_file_adinicb(inode, inode->i_size, &err);
  779. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
  780. {
  781. inode->i_size = UDF_I_LENALLOC(inode);
  782. return;
  783. }
  784. else
  785. udf_truncate_extents(inode);
  786. }
  787. else
  788. {
  789. offset = (inode->i_size & (inode->i_sb->s_blocksize - 1)) +
  790. udf_file_entry_alloc_offset(inode);
  791. if ((bh = udf_tread(inode->i_sb,
  792. udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0))))
  793. {
  794. memset(bh->b_data + offset, 0x00, inode->i_sb->s_blocksize - offset);
  795. mark_buffer_dirty(bh);
  796. udf_release_data(bh);
  797. }
  798. UDF_I_LENALLOC(inode) = inode->i_size;
  799. }
  800. }
  801. else
  802. {
  803. block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block);
  804. udf_truncate_extents(inode);
  805. }
  806. inode->i_mtime = inode->i_ctime = CURRENT_TIME;
  807. UDF_I_UMTIME(inode) = UDF_I_UCTIME(inode) = CURRENT_UTIME;
  808. if (IS_SYNC(inode))
  809. udf_sync_inode (inode);
  810. else
  811. mark_inode_dirty(inode);
  812. }
  813. /*
  814.  * udf_read_inode
  815.  *
  816.  * PURPOSE
  817.  * Read an inode.
  818.  *
  819.  * DESCRIPTION
  820.  * This routine is called by iget() [which is called by udf_iget()]
  821.  *      (clean_inode() will have been called first)
  822.  * when an inode is first read into memory.
  823.  *
  824.  * HISTORY
  825.  * July 1, 1997 - Andrew E. Mileski
  826.  * Written, tested, and released.
  827.  *
  828.  * 12/19/98 dgb  Updated to fix size problems.
  829.  */
  830. void
  831. udf_read_inode(struct inode *inode)
  832. {
  833. memset(&UDF_I_LOCATION(inode), 0xFF, sizeof(lb_addr));
  834. }
  835. void
  836. __udf_read_inode(struct inode *inode)
  837. {
  838. struct buffer_head *bh = NULL;
  839. struct fileEntry *fe;
  840. uint16_t ident;
  841. /*
  842.  * Set defaults, but the inode is still incomplete!
  843.  * Note: get_new_inode() sets the following on a new inode:
  844.  *      i_sb = sb
  845.  *      i_dev = sb->s_dev;
  846.  *      i_no = ino
  847.  *      i_flags = sb->s_flags
  848.  *      i_state = 0
  849.  * clean_inode(): zero fills and sets
  850.  *      i_count = 1
  851.  *      i_nlink = 1
  852.  *      i_op = NULL;
  853.  */
  854. inode->i_blksize = PAGE_SIZE;
  855. bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident);
  856. if (!bh)
  857. {
  858. printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bhn",
  859. inode->i_ino);
  860. make_bad_inode(inode);
  861. return;
  862. }
  863. if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE &&
  864. ident != TAG_IDENT_USE)
  865. {
  866. printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed ident=%dn",
  867. inode->i_ino, ident);
  868. udf_release_data(bh);
  869. make_bad_inode(inode);
  870. return;
  871. }
  872. fe = (struct fileEntry *)bh->b_data;
  873. if (le16_to_cpu(fe->icbTag.strategyType) == 4096)
  874. {
  875. struct buffer_head *ibh = NULL, *nbh = NULL;
  876. struct indirectEntry *ie;
  877. ibh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 1, &ident);
  878. if (ident == TAG_IDENT_IE)
  879. {
  880. if (ibh)
  881. {
  882. lb_addr loc;
  883. ie = (struct indirectEntry *)ibh->b_data;
  884. loc = lelb_to_cpu(ie->indirectICB.extLocation);
  885. if (ie->indirectICB.extLength && 
  886. (nbh = udf_read_ptagged(inode->i_sb, loc, 0, &ident)))
  887. {
  888. if (ident == TAG_IDENT_FE ||
  889. ident == TAG_IDENT_EFE)
  890. {
  891. memcpy(&UDF_I_LOCATION(inode), &loc, sizeof(lb_addr));
  892. udf_release_data(bh);
  893. udf_release_data(ibh);
  894. udf_release_data(nbh);
  895. __udf_read_inode(inode);
  896. return;
  897. }
  898. else
  899. {
  900. udf_release_data(nbh);
  901. udf_release_data(ibh);
  902. }
  903. }
  904. else
  905. udf_release_data(ibh);
  906. }
  907. }
  908. else
  909. udf_release_data(ibh);
  910. }
  911. else if (le16_to_cpu(fe->icbTag.strategyType) != 4)
  912. {
  913. printk(KERN_ERR "udf: unsupported strategy type: %dn",
  914. le16_to_cpu(fe->icbTag.strategyType));
  915. udf_release_data(bh);
  916. make_bad_inode(inode);
  917. return;
  918. }
  919. udf_fill_inode(inode, bh);
  920. udf_release_data(bh);
  921. }
  922. static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
  923. {
  924. struct fileEntry *fe;
  925. struct extendedFileEntry *efe;
  926. time_t convtime;
  927. long convtime_usec;
  928. int offset, alen;
  929. inode->i_version = ++event;
  930. UDF_I_NEW_INODE(inode) = 0;
  931. fe = (struct fileEntry *)bh->b_data;
  932. efe = (struct extendedFileEntry *)bh->b_data;
  933. if (le16_to_cpu(fe->icbTag.strategyType) == 4)
  934. UDF_I_STRAT4096(inode) = 0;
  935. else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */
  936. UDF_I_STRAT4096(inode) = 1;
  937. UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICBTAG_FLAG_AD_MASK;
  938. if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_EFE)
  939. UDF_I_EXTENDED_FE(inode) = 1;
  940. else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE)
  941. UDF_I_EXTENDED_FE(inode) = 0;
  942. else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
  943. {
  944. UDF_I_LENALLOC(inode) =
  945. le32_to_cpu(
  946. ((struct unallocSpaceEntry *)bh->b_data)->lengthAllocDescs);
  947. return;
  948. }
  949. inode->i_uid = le32_to_cpu(fe->uid);
  950. if ( inode->i_uid == -1 ) inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
  951. inode->i_gid = le32_to_cpu(fe->gid);
  952. if ( inode->i_gid == -1 ) inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
  953. inode->i_nlink = le16_to_cpu(fe->fileLinkCount);
  954. if (!inode->i_nlink)
  955. inode->i_nlink = 1;
  956. inode->i_size = le64_to_cpu(fe->informationLength);
  957. UDF_I_LENEXTENTS(inode) = inode->i_size;
  958. inode->i_mode = udf_convert_permissions(fe);
  959. inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask;
  960. UDF_I_NEXT_ALLOC_BLOCK(inode) = 0;
  961. UDF_I_NEXT_ALLOC_GOAL(inode) = 0;
  962. if (UDF_I_EXTENDED_FE(inode) == 0)
  963. {
  964. inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
  965. (inode->i_sb->s_blocksize_bits - 9);
  966. if ( udf_stamp_to_time(&convtime, &convtime_usec,
  967. lets_to_cpu(fe->accessTime)) )
  968. {
  969. inode->i_atime = convtime;
  970. }
  971. else
  972. {
  973. inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
  974. }
  975. if ( udf_stamp_to_time(&convtime, &convtime_usec,
  976. lets_to_cpu(fe->modificationTime)) )
  977. {
  978. inode->i_mtime = convtime;
  979. UDF_I_UMTIME(inode) = convtime_usec;
  980. }
  981. else
  982. {
  983. inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
  984. UDF_I_UMTIME(inode) = 0;
  985. }
  986. if ( udf_stamp_to_time(&convtime, &convtime_usec,
  987. lets_to_cpu(fe->attrTime)) )
  988. {
  989. inode->i_ctime = convtime;
  990. UDF_I_UCTIME(inode) = convtime_usec;
  991. }
  992. else
  993. {
  994. inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
  995. UDF_I_UCTIME(inode) = 0;
  996. }
  997. UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID);
  998. UDF_I_LENEATTR(inode) = le32_to_cpu(fe->lengthExtendedAttr);
  999. UDF_I_LENALLOC(inode) = le32_to_cpu(fe->lengthAllocDescs);
  1000. offset = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode);
  1001. alen = offset + UDF_I_LENALLOC(inode);
  1002. }
  1003. else
  1004. {
  1005. inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << 
  1006. (inode->i_sb->s_blocksize_bits - 9);
  1007. if ( udf_stamp_to_time(&convtime, &convtime_usec,
  1008. lets_to_cpu(efe->accessTime)) )
  1009. {
  1010. inode->i_atime = convtime;
  1011. }
  1012. else
  1013. {
  1014. inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
  1015. }
  1016. if ( udf_stamp_to_time(&convtime, &convtime_usec,
  1017. lets_to_cpu(efe->modificationTime)) )
  1018. {
  1019. inode->i_mtime = convtime;
  1020. UDF_I_UMTIME(inode) = convtime_usec;
  1021. }
  1022. else
  1023. {
  1024. inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
  1025. UDF_I_UMTIME(inode) = 0;
  1026. }
  1027. if ( udf_stamp_to_time(&convtime, &convtime_usec,
  1028. lets_to_cpu(efe->createTime)) )
  1029. {
  1030. UDF_I_CRTIME(inode) = convtime;
  1031. UDF_I_UCRTIME(inode) = convtime_usec;
  1032. }
  1033. else
  1034. {
  1035. UDF_I_CRTIME(inode) = UDF_SB_RECORDTIME(inode->i_sb);
  1036. UDF_I_UCRTIME(inode) = 0;
  1037. }
  1038. if ( udf_stamp_to_time(&convtime, &convtime_usec,
  1039. lets_to_cpu(efe->attrTime)) )
  1040. {
  1041. inode->i_ctime = convtime;
  1042. UDF_I_UCTIME(inode) = convtime_usec;
  1043. }
  1044. else
  1045. {
  1046. inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
  1047. UDF_I_UCTIME(inode) = 0;
  1048. }
  1049. UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID);
  1050. UDF_I_LENEATTR(inode) = le32_to_cpu(efe->lengthExtendedAttr);
  1051. UDF_I_LENALLOC(inode) = le32_to_cpu(efe->lengthAllocDescs);
  1052. offset = sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode);
  1053. alen = offset + UDF_I_LENALLOC(inode);
  1054. }
  1055. switch (fe->icbTag.fileType)
  1056. {
  1057. case ICBTAG_FILE_TYPE_DIRECTORY:
  1058. {
  1059. inode->i_op = &udf_dir_inode_operations;
  1060. inode->i_fop = &udf_dir_operations;
  1061. inode->i_mode |= S_IFDIR;
  1062. inode->i_nlink ++;
  1063. break;
  1064. }
  1065. case ICBTAG_FILE_TYPE_REALTIME:
  1066. case ICBTAG_FILE_TYPE_REGULAR:
  1067. case ICBTAG_FILE_TYPE_UNDEF:
  1068. {
  1069. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
  1070. inode->i_data.a_ops = &udf_adinicb_aops;
  1071. else
  1072. inode->i_data.a_ops = &udf_aops;
  1073. inode->i_op = &udf_file_inode_operations;
  1074. inode->i_fop = &udf_file_operations;
  1075. inode->i_mode |= S_IFREG;
  1076. break;
  1077. }
  1078. case ICBTAG_FILE_TYPE_BLOCK:
  1079. {
  1080. inode->i_mode |= S_IFBLK;
  1081. break;
  1082. }
  1083. case ICBTAG_FILE_TYPE_CHAR:
  1084. {
  1085. inode->i_mode |= S_IFCHR;
  1086. break;
  1087. }
  1088. case ICBTAG_FILE_TYPE_FIFO:
  1089. {
  1090. init_special_inode(inode, inode->i_mode | S_IFIFO, 0);
  1091. break;
  1092. }
  1093. case ICBTAG_FILE_TYPE_SYMLINK:
  1094. {
  1095. inode->i_data.a_ops = &udf_symlink_aops;
  1096. inode->i_op = &page_symlink_inode_operations;
  1097. inode->i_mode = S_IFLNK|S_IRWXUGO;
  1098. break;
  1099. }
  1100. default:
  1101. {
  1102. printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown file type=%dn",
  1103. inode->i_ino, fe->icbTag.fileType);
  1104. make_bad_inode(inode);
  1105. return;
  1106. }
  1107. }
  1108. if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
  1109. {
  1110. struct buffer_head *tbh = NULL;
  1111. struct deviceSpec *dsea =
  1112. (struct deviceSpec *)
  1113. udf_get_extendedattr(inode, 12, 1, &tbh);
  1114. if (dsea)
  1115. {
  1116. init_special_inode(inode, inode->i_mode,
  1117. ((le32_to_cpu(dsea->majorDeviceIdent)) << 8) |
  1118. (le32_to_cpu(dsea->minorDeviceIdent) & 0xFF));
  1119. /* Developer ID ??? */
  1120. udf_release_data(tbh);
  1121. }
  1122. else
  1123. {
  1124. make_bad_inode(inode);
  1125. }
  1126. }
  1127. }
  1128. static mode_t
  1129. udf_convert_permissions(struct fileEntry *fe)
  1130. {
  1131. mode_t mode;
  1132. uint32_t permissions;
  1133. uint32_t flags;
  1134. permissions = le32_to_cpu(fe->permissions);
  1135. flags = le16_to_cpu(fe->icbTag.flags);
  1136. mode = (( permissions      ) & S_IRWXO) |
  1137. (( permissions >> 2 ) & S_IRWXG) |
  1138. (( permissions >> 4 ) & S_IRWXU) |
  1139. (( flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) |
  1140. (( flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) |
  1141. (( flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0);
  1142. return mode;
  1143. }
  1144. /*
  1145.  * udf_write_inode
  1146.  *
  1147.  * PURPOSE
  1148.  * Write out the specified inode.
  1149.  *
  1150.  * DESCRIPTION
  1151.  * This routine is called whenever an inode is synced.
  1152.  * Currently this routine is just a placeholder.
  1153.  *
  1154.  * HISTORY
  1155.  * July 1, 1997 - Andrew E. Mileski
  1156.  * Written, tested, and released.
  1157.  */
  1158. void udf_write_inode(struct inode * inode, int sync)
  1159. {
  1160. lock_kernel();
  1161. udf_update_inode(inode, sync);
  1162. unlock_kernel();
  1163. }
  1164. int udf_sync_inode(struct inode * inode)
  1165. {
  1166. return udf_update_inode(inode, 1);
  1167. }
  1168. static int
  1169. udf_update_inode(struct inode *inode, int do_sync)
  1170. {
  1171. struct buffer_head *bh = NULL;
  1172. struct fileEntry *fe;
  1173. struct extendedFileEntry *efe;
  1174. uint32_t udfperms;
  1175. uint16_t icbflags;
  1176. uint16_t crclen;
  1177. int i;
  1178. timestamp cpu_time;
  1179. int err = 0;
  1180. bh = udf_tread(inode->i_sb,
  1181. udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0));
  1182. if (!bh)
  1183. {
  1184. udf_debug("bread failuren");
  1185. return -EIO;
  1186. }
  1187. fe = (struct fileEntry *)bh->b_data;
  1188. efe = (struct extendedFileEntry *)bh->b_data;
  1189. if (UDF_I_NEW_INODE(inode) == 1)
  1190. {
  1191. if (UDF_I_EXTENDED_FE(inode) == 0)
  1192. memset(bh->b_data, 0x00, sizeof(struct fileEntry));
  1193. else
  1194. memset(bh->b_data, 0x00, sizeof(struct extendedFileEntry));
  1195. memset(bh->b_data + udf_file_entry_alloc_offset(inode) +
  1196. UDF_I_LENALLOC(inode), 0x0, inode->i_sb->s_blocksize -
  1197. udf_file_entry_alloc_offset(inode) - UDF_I_LENALLOC(inode));
  1198. UDF_I_NEW_INODE(inode) = 0;
  1199. }
  1200. if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
  1201. {
  1202. struct unallocSpaceEntry *use =
  1203. (struct unallocSpaceEntry *)bh->b_data;
  1204. use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
  1205. crclen = sizeof(struct unallocSpaceEntry) + UDF_I_LENALLOC(inode) -
  1206. sizeof(tag);
  1207. use->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
  1208. use->descTag.descCRCLength = cpu_to_le16(crclen);
  1209. use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0));
  1210. use->descTag.tagChecksum = 0;
  1211. for (i=0; i<16; i++)
  1212. if (i != 4)
  1213. use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i];
  1214. mark_buffer_dirty(bh);
  1215. udf_release_data(bh);
  1216. return err;
  1217. }
  1218. if (inode->i_uid != UDF_SB(inode->i_sb)->s_uid)
  1219. fe->uid = cpu_to_le32(inode->i_uid);
  1220. if (inode->i_gid != UDF_SB(inode->i_sb)->s_gid)
  1221. fe->gid = cpu_to_le32(inode->i_gid);
  1222. udfperms = ((inode->i_mode & S_IRWXO)     ) |
  1223. ((inode->i_mode & S_IRWXG) << 2) |
  1224. ((inode->i_mode & S_IRWXU) << 4);
  1225. udfperms |= (le32_to_cpu(fe->permissions) &
  1226. (FE_PERM_O_DELETE | FE_PERM_O_CHATTR |
  1227.  FE_PERM_G_DELETE | FE_PERM_G_CHATTR |
  1228.  FE_PERM_U_DELETE | FE_PERM_U_CHATTR));
  1229. fe->permissions = cpu_to_le32(udfperms);
  1230. if (S_ISDIR(inode->i_mode))
  1231. fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1);
  1232. else
  1233. fe->fileLinkCount = cpu_to_le16(inode->i_nlink);
  1234. fe->informationLength = cpu_to_le64(inode->i_size);
  1235. if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
  1236. {
  1237. regid *eid;
  1238. struct buffer_head *tbh = NULL;
  1239. struct deviceSpec *dsea =
  1240. (struct deviceSpec *)
  1241. udf_get_extendedattr(inode, 12, 1, &tbh);
  1242. if (!dsea)
  1243. {
  1244. dsea = (struct deviceSpec *)
  1245. udf_add_extendedattr(inode,
  1246. sizeof(struct deviceSpec) +
  1247. sizeof(regid), 12, 0x3, &tbh);
  1248. dsea->attrType = 12;
  1249. dsea->attrSubtype = 1;
  1250. dsea->attrLength = sizeof(struct deviceSpec) +
  1251. sizeof(regid);
  1252. dsea->impUseLength = sizeof(regid);
  1253. }
  1254. eid = (regid *)dsea->impUse;
  1255. memset(eid, 0, sizeof(regid));
  1256. strcpy(eid->ident, UDF_ID_DEVELOPER);
  1257. eid->identSuffix[0] = UDF_OS_CLASS_UNIX;
  1258. eid->identSuffix[1] = UDF_OS_ID_LINUX;
  1259. dsea->majorDeviceIdent = kdev_t_to_nr(inode->i_rdev) >> 8;
  1260. dsea->minorDeviceIdent = kdev_t_to_nr(inode->i_rdev) & 0xFF;
  1261. mark_buffer_dirty_inode(tbh, inode);
  1262. udf_release_data(tbh);
  1263. }
  1264. if (UDF_I_EXTENDED_FE(inode) == 0)
  1265. {
  1266. fe->logicalBlocksRecorded = cpu_to_le64(
  1267. (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
  1268. (inode->i_sb->s_blocksize_bits - 9));
  1269. if (udf_time_to_stamp(&cpu_time, inode->i_atime, 0))
  1270. fe->accessTime = cpu_to_lets(cpu_time);
  1271. if (udf_time_to_stamp(&cpu_time, inode->i_mtime, UDF_I_UMTIME(inode)))
  1272. fe->modificationTime = cpu_to_lets(cpu_time);
  1273. if (udf_time_to_stamp(&cpu_time, inode->i_ctime, UDF_I_UCTIME(inode)))
  1274. fe->attrTime = cpu_to_lets(cpu_time);
  1275. memset(&(fe->impIdent), 0, sizeof(regid));
  1276. strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
  1277. fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
  1278. fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
  1279. fe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
  1280. fe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
  1281. fe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
  1282. fe->descTag.tagIdent = le16_to_cpu(TAG_IDENT_FE);
  1283. crclen = sizeof(struct fileEntry);
  1284. }
  1285. else
  1286. {
  1287. efe->objectSize = cpu_to_le64(inode->i_size);
  1288. efe->logicalBlocksRecorded = cpu_to_le64(
  1289. (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
  1290. (inode->i_sb->s_blocksize_bits - 9));
  1291. if (UDF_I_CRTIME(inode) >= inode->i_atime)
  1292. {
  1293. UDF_I_CRTIME(inode) = inode->i_atime;
  1294. UDF_I_UCRTIME(inode) = 0;
  1295. }
  1296. if (UDF_I_CRTIME(inode) > inode->i_mtime ||
  1297. (UDF_I_CRTIME(inode) == inode->i_mtime &&
  1298.  UDF_I_UCRTIME(inode) > UDF_I_UMTIME(inode)))
  1299. {
  1300. UDF_I_CRTIME(inode) = inode->i_mtime;
  1301. UDF_I_UCRTIME(inode) = UDF_I_UMTIME(inode);
  1302. }
  1303. if (UDF_I_CRTIME(inode) > inode->i_ctime ||
  1304. (UDF_I_CRTIME(inode) == inode->i_ctime &&
  1305.  UDF_I_UCRTIME(inode) > UDF_I_UCTIME(inode)))
  1306. {
  1307. UDF_I_CRTIME(inode) = inode->i_ctime;
  1308. UDF_I_UCRTIME(inode) = UDF_I_UCTIME(inode);
  1309. }
  1310. if (udf_time_to_stamp(&cpu_time, inode->i_atime, 0))
  1311. efe->accessTime = cpu_to_lets(cpu_time);
  1312. if (udf_time_to_stamp(&cpu_time, inode->i_mtime, UDF_I_UMTIME(inode)))
  1313. efe->modificationTime = cpu_to_lets(cpu_time);
  1314. if (udf_time_to_stamp(&cpu_time, UDF_I_CRTIME(inode), UDF_I_UCRTIME(inode)))
  1315. efe->createTime = cpu_to_lets(cpu_time);
  1316. if (udf_time_to_stamp(&cpu_time, inode->i_ctime, UDF_I_UCTIME(inode)))
  1317. efe->attrTime = cpu_to_lets(cpu_time);
  1318. memset(&(efe->impIdent), 0, sizeof(regid));
  1319. strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
  1320. efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
  1321. efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
  1322. efe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
  1323. efe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
  1324. efe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
  1325. efe->descTag.tagIdent = le16_to_cpu(TAG_IDENT_EFE);
  1326. crclen = sizeof(struct extendedFileEntry);
  1327. }
  1328. if (UDF_I_STRAT4096(inode))
  1329. {
  1330. fe->icbTag.strategyType = cpu_to_le16(4096);
  1331. fe->icbTag.strategyParameter = cpu_to_le16(1);
  1332. fe->icbTag.numEntries = cpu_to_le16(2);
  1333. }
  1334. else
  1335. {
  1336. fe->icbTag.strategyType = cpu_to_le16(4);
  1337. fe->icbTag.numEntries = cpu_to_le16(1);
  1338. }
  1339. if (S_ISDIR(inode->i_mode))
  1340. fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY;
  1341. else if (S_ISREG(inode->i_mode))
  1342. fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR;
  1343. else if (S_ISLNK(inode->i_mode))
  1344. fe->icbTag.fileType = ICBTAG_FILE_TYPE_SYMLINK;
  1345. else if (S_ISBLK(inode->i_mode))
  1346. fe->icbTag.fileType = ICBTAG_FILE_TYPE_BLOCK;
  1347. else if (S_ISCHR(inode->i_mode))
  1348. fe->icbTag.fileType = ICBTAG_FILE_TYPE_CHAR;
  1349. else if (S_ISFIFO(inode->i_mode))
  1350. fe->icbTag.fileType = ICBTAG_FILE_TYPE_FIFO;
  1351. icbflags = UDF_I_ALLOCTYPE(inode) |
  1352. ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) |
  1353. ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) |
  1354. ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) |
  1355. (le16_to_cpu(fe->icbTag.flags) &
  1356. ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID |
  1357. ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY));
  1358. fe->icbTag.flags = cpu_to_le16(icbflags);
  1359. if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
  1360. fe->descTag.descVersion = cpu_to_le16(3);
  1361. else
  1362. fe->descTag.descVersion = cpu_to_le16(2);
  1363. fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb));
  1364. fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
  1365. crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag);
  1366. fe->descTag.descCRCLength = cpu_to_le16(crclen);
  1367. fe->descTag.descCRC = cpu_to_le16(udf_crc((char *)fe + sizeof(tag), crclen, 0));
  1368. fe->descTag.tagChecksum = 0;
  1369. for (i=0; i<16; i++)
  1370. if (i != 4)
  1371. fe->descTag.tagChecksum += ((uint8_t *)&(fe->descTag))[i];
  1372. /* write the data blocks */
  1373. mark_buffer_dirty(bh);
  1374. if (do_sync)
  1375. {
  1376. ll_rw_block(WRITE, 1, &bh);
  1377. wait_on_buffer(bh);
  1378. if (buffer_req(bh) && !buffer_uptodate(bh))
  1379. {
  1380. printk("IO error syncing udf inode [%s:%08lx]n",
  1381. bdevname(inode->i_dev), inode->i_ino);
  1382. err = -EIO;
  1383. }
  1384. }
  1385. udf_release_data(bh);
  1386. return err;
  1387. }
  1388. /*
  1389.  * udf_iget
  1390.  *
  1391.  * PURPOSE
  1392.  * Get an inode.
  1393.  *
  1394.  * DESCRIPTION
  1395.  * This routine replaces iget() and read_inode().
  1396.  *
  1397.  * HISTORY
  1398.  * October 3, 1997 - Andrew E. Mileski
  1399.  * Written, tested, and released.
  1400.  *
  1401.  * 12/19/98 dgb  Added semaphore and changed to be a wrapper of iget
  1402.  */
  1403. struct inode *
  1404. udf_iget(struct super_block *sb, lb_addr ino)
  1405. {
  1406. struct inode *inode;
  1407. unsigned long block;
  1408. block = udf_get_lb_pblock(sb, ino, 0);
  1409. /* Get the inode */
  1410. inode = iget(sb, block);
  1411. /* calls udf_read_inode() ! */
  1412. if (!inode)
  1413. {
  1414. printk(KERN_ERR "udf: iget() failedn");
  1415. return NULL;
  1416. }
  1417. else if (is_bad_inode(inode))
  1418. {
  1419. iput(inode);
  1420. return NULL;
  1421. }
  1422. else if (UDF_I_LOCATION(inode).logicalBlockNum == 0xFFFFFFFF &&
  1423. UDF_I_LOCATION(inode).partitionReferenceNum == 0xFFFF)
  1424. {
  1425. memcpy(&UDF_I_LOCATION(inode), &ino, sizeof(lb_addr));
  1426. __udf_read_inode(inode);
  1427. if (is_bad_inode(inode))
  1428. {
  1429. iput(inode);
  1430. return NULL;
  1431. }
  1432. }
  1433. if ( ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum) )
  1434. {
  1435. udf_debug("block=%d, partition=%d out of rangen",
  1436. ino.logicalBlockNum, ino.partitionReferenceNum);
  1437. make_bad_inode(inode);
  1438. iput(inode);
  1439. return NULL;
  1440.   }
  1441. return inode;
  1442. }
  1443. int8_t udf_add_aext(struct inode *inode, lb_addr *bloc, int *extoffset,
  1444. lb_addr eloc, uint32_t elen, struct buffer_head **bh, int inc)
  1445. {
  1446. int adsize;
  1447. short_ad *sad = NULL;
  1448. long_ad *lad = NULL;
  1449. struct allocExtDesc *aed;
  1450. int8_t etype;
  1451. if (!(*bh))
  1452. {
  1453. if (!(*bh = udf_tread(inode->i_sb,
  1454. udf_get_lb_pblock(inode->i_sb, *bloc, 0))))
  1455. {
  1456. udf_debug("reading block %d failed!n",
  1457. udf_get_lb_pblock(inode->i_sb, *bloc, 0));
  1458. return -1;
  1459. }
  1460. }
  1461. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
  1462. adsize = sizeof(short_ad);
  1463. else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
  1464. adsize = sizeof(long_ad);
  1465. else
  1466. return -1;
  1467. if (*extoffset + (2 * adsize) > inode->i_sb->s_blocksize)
  1468. {
  1469. char *sptr, *dptr;
  1470. struct buffer_head *nbh;
  1471. int err, loffset;
  1472. lb_addr obloc = *bloc;
  1473. if (!(bloc->logicalBlockNum = udf_new_block(inode->i_sb, inode,
  1474. obloc.partitionReferenceNum, obloc.logicalBlockNum, &err)))
  1475. {
  1476. return -1;
  1477. }
  1478. if (!(nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb,
  1479. *bloc, 0))))
  1480. {
  1481. return -1;
  1482. }
  1483. lock_buffer(nbh);
  1484. memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize);
  1485. mark_buffer_uptodate(nbh, 1);
  1486. unlock_buffer(nbh);
  1487. mark_buffer_dirty_inode(nbh, inode);
  1488. aed = (struct allocExtDesc *)(nbh->b_data);
  1489. if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
  1490. aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum);
  1491. if (*extoffset + adsize > inode->i_sb->s_blocksize)
  1492. {
  1493. loffset = *extoffset;
  1494. aed->lengthAllocDescs = cpu_to_le32(adsize);
  1495. sptr = (*bh)->b_data + *extoffset - adsize;
  1496. dptr = nbh->b_data + sizeof(struct allocExtDesc);
  1497. memcpy(dptr, sptr, adsize);
  1498. *extoffset = sizeof(struct allocExtDesc) + adsize;
  1499. }
  1500. else
  1501. {
  1502. loffset = *extoffset + adsize;
  1503. aed->lengthAllocDescs = cpu_to_le32(0);
  1504. sptr = (*bh)->b_data + *extoffset;
  1505. *extoffset = sizeof(struct allocExtDesc);
  1506. if (memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr)))
  1507. {
  1508. aed = (struct allocExtDesc *)(*bh)->b_data;
  1509. aed->lengthAllocDescs =
  1510. cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
  1511. }
  1512. else
  1513. {
  1514. UDF_I_LENALLOC(inode) += adsize;
  1515. mark_inode_dirty(inode);
  1516. }
  1517. }
  1518. if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
  1519. udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1,
  1520. bloc->logicalBlockNum, sizeof(tag));
  1521. else
  1522. udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1,
  1523. bloc->logicalBlockNum, sizeof(tag));
  1524. switch (UDF_I_ALLOCTYPE(inode))
  1525. {
  1526. case ICBTAG_FLAG_AD_SHORT:
  1527. {
  1528. sad = (short_ad *)sptr;
  1529. sad->extLength = cpu_to_le32(
  1530. EXT_NEXT_EXTENT_ALLOCDECS |
  1531. inode->i_sb->s_blocksize);
  1532. sad->extPosition = cpu_to_le32(bloc->logicalBlockNum);
  1533. break;
  1534. }
  1535. case ICBTAG_FLAG_AD_LONG:
  1536. {
  1537. lad = (long_ad *)sptr;
  1538. lad->extLength = cpu_to_le32(
  1539. EXT_NEXT_EXTENT_ALLOCDECS |
  1540. inode->i_sb->s_blocksize);
  1541. lad->extLocation = cpu_to_lelb(*bloc);
  1542. memset(lad->impUse, 0x00, sizeof(lad->impUse));
  1543. break;
  1544. }
  1545. }
  1546. if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
  1547. udf_update_tag((*bh)->b_data, loffset);
  1548. else
  1549. udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
  1550. mark_buffer_dirty_inode(*bh, inode);
  1551. udf_release_data(*bh);
  1552. *bh = nbh;
  1553. }
  1554. etype = udf_write_aext(inode, *bloc, extoffset, eloc, elen, *bh, inc);
  1555. if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr)))
  1556. {
  1557. UDF_I_LENALLOC(inode) += adsize;
  1558. mark_inode_dirty(inode);
  1559. }
  1560. else
  1561. {
  1562. aed = (struct allocExtDesc *)(*bh)->b_data;
  1563. aed->lengthAllocDescs =
  1564. cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
  1565. if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
  1566. udf_update_tag((*bh)->b_data, *extoffset + (inc ? 0 : adsize));
  1567. else
  1568. udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
  1569. mark_buffer_dirty_inode(*bh, inode);
  1570. }
  1571. return etype;
  1572. }
  1573. int8_t udf_write_aext(struct inode *inode, lb_addr bloc, int *extoffset,
  1574.     lb_addr eloc, uint32_t elen, struct buffer_head *bh, int inc)
  1575. {
  1576. int adsize;
  1577. short_ad *sad = NULL;
  1578. long_ad *lad = NULL;
  1579. if (!(bh))
  1580. {
  1581. if (!(bh = udf_tread(inode->i_sb,
  1582. udf_get_lb_pblock(inode->i_sb, bloc, 0))))
  1583. {
  1584. udf_debug("reading block %d failed!n",
  1585. udf_get_lb_pblock(inode->i_sb, bloc, 0));
  1586. return -1;
  1587. }
  1588. }
  1589. else
  1590. atomic_inc(&bh->b_count);
  1591. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
  1592. adsize = sizeof(short_ad);
  1593. else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
  1594. adsize = sizeof(long_ad);
  1595. else
  1596. return -1;
  1597. switch (UDF_I_ALLOCTYPE(inode))
  1598. {
  1599. case ICBTAG_FLAG_AD_SHORT:
  1600. {
  1601. sad = (short_ad *)((bh)->b_data + *extoffset);
  1602. sad->extLength = cpu_to_le32(elen);
  1603. sad->extPosition = cpu_to_le32(eloc.logicalBlockNum);
  1604. break;
  1605. }
  1606. case ICBTAG_FLAG_AD_LONG:
  1607. {
  1608. lad = (long_ad *)((bh)->b_data + *extoffset);
  1609. lad->extLength = cpu_to_le32(elen);
  1610. lad->extLocation = cpu_to_lelb(eloc);
  1611. memset(lad->impUse, 0x00, sizeof(lad->impUse));
  1612. break;
  1613. }
  1614. }
  1615. if (memcmp(&UDF_I_LOCATION(inode), &bloc, sizeof(lb_addr)))
  1616. {
  1617. if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
  1618. {
  1619. struct allocExtDesc *aed = (struct allocExtDesc *)(bh)->b_data;
  1620. udf_update_tag((bh)->b_data,
  1621. le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc));
  1622. }
  1623. mark_buffer_dirty_inode(bh, inode);
  1624. }
  1625. else
  1626. {
  1627. mark_inode_dirty(inode);
  1628. mark_buffer_dirty(bh);
  1629. }
  1630. if (inc)
  1631. *extoffset += adsize;
  1632. udf_release_data(bh);
  1633. return (elen >> 30);
  1634. }
  1635. int8_t udf_next_aext(struct inode *inode, lb_addr *bloc, int *extoffset,
  1636. lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
  1637. {
  1638. uint16_t tagIdent;
  1639. int pos, alen;
  1640. int8_t etype;
  1641. if (!(*bh))
  1642. {
  1643. if (!(*bh = udf_tread(inode->i_sb,
  1644. udf_get_lb_pblock(inode->i_sb, *bloc, 0))))
  1645. {
  1646. udf_debug("reading block %d failed!n",
  1647. udf_get_lb_pblock(inode->i_sb, *bloc, 0));
  1648. return -1;
  1649. }
  1650. }
  1651. tagIdent = le16_to_cpu(((tag *)(*bh)->b_data)->tagIdent);
  1652. if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr)))
  1653. {
  1654. if (tagIdent == TAG_IDENT_FE || tagIdent == TAG_IDENT_EFE ||
  1655. UDF_I_NEW_INODE(inode))
  1656. {
  1657. pos = udf_file_entry_alloc_offset(inode);
  1658. alen = UDF_I_LENALLOC(inode) + pos;
  1659. }
  1660. else if (tagIdent == TAG_IDENT_USE)
  1661. {
  1662. pos = sizeof(struct unallocSpaceEntry);
  1663. alen = UDF_I_LENALLOC(inode) + pos;
  1664. }
  1665. else
  1666. return -1;
  1667. }
  1668. else if (tagIdent == TAG_IDENT_AED)
  1669. {
  1670. struct allocExtDesc *aed = (struct allocExtDesc *)(*bh)->b_data;
  1671. pos = sizeof(struct allocExtDesc);
  1672. alen = le32_to_cpu(aed->lengthAllocDescs) + pos;
  1673. }
  1674. else
  1675. return -1;
  1676. if (!(*extoffset))
  1677. *extoffset = pos;
  1678. switch (UDF_I_ALLOCTYPE(inode))
  1679. {
  1680. case ICBTAG_FLAG_AD_SHORT:
  1681. {
  1682. short_ad *sad;
  1683. if (!(sad = udf_get_fileshortad((*bh)->b_data, alen, extoffset, inc)))
  1684. return -1;
  1685. if ((etype = le32_to_cpu(sad->extLength) >> 30) == (EXT_NEXT_EXTENT_ALLOCDECS >> 30))
  1686. {
  1687. bloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
  1688. *extoffset = 0;
  1689. udf_release_data(*bh);
  1690. *bh = NULL;
  1691. return udf_next_aext(inode, bloc, extoffset, eloc, elen, bh, inc);
  1692. }
  1693. else
  1694. {
  1695. eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
  1696. eloc->partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
  1697. *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
  1698. }
  1699. break;
  1700. }
  1701. case ICBTAG_FLAG_AD_LONG:
  1702. {
  1703. long_ad *lad;
  1704. if (!(lad = udf_get_filelongad((*bh)->b_data, alen, extoffset, inc)))
  1705. return -1;
  1706. if ((etype = le32_to_cpu(lad->extLength) >> 30) == (EXT_NEXT_EXTENT_ALLOCDECS >> 30))
  1707. {
  1708. *bloc = lelb_to_cpu(lad->extLocation);
  1709. *extoffset = 0;
  1710. udf_release_data(*bh);
  1711. *bh = NULL;
  1712. return udf_next_aext(inode, bloc, extoffset, eloc, elen, bh, inc);
  1713. }
  1714. else
  1715. {
  1716. *eloc = lelb_to_cpu(lad->extLocation);
  1717. *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK;
  1718. }
  1719. break;
  1720. }
  1721. case ICBTAG_FLAG_AD_IN_ICB:
  1722. {
  1723. if (UDF_I_LENALLOC(inode) == 0)
  1724. return -1;
  1725. etype = (EXT_RECORDED_ALLOCATED >> 30);
  1726. *eloc = UDF_I_LOCATION(inode);
  1727. *elen = UDF_I_LENALLOC(inode);
  1728. break;
  1729. }
  1730. default:
  1731. {
  1732. udf_debug("alloc_type = %d unsupportedn", UDF_I_ALLOCTYPE(inode));
  1733. return -1;
  1734. }
  1735. }
  1736. if (*elen)
  1737. return etype;
  1738. udf_debug("Empty Extent, inode=%ld, alloctype=%d, eloc=%d, elen=%d, etype=%d, extoffset=%dn",
  1739. inode->i_ino, UDF_I_ALLOCTYPE(inode), eloc->logicalBlockNum, *elen, etype, *extoffset);
  1740. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
  1741. *extoffset -= sizeof(short_ad);
  1742. else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
  1743. *extoffset -= sizeof(long_ad);
  1744. return -1;
  1745. }
  1746. int8_t udf_current_aext(struct inode *inode, lb_addr *bloc, int *extoffset,
  1747. lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
  1748. {
  1749. int pos, alen;
  1750. int8_t etype;
  1751. if (!(*bh))
  1752. {
  1753. if (!(*bh = udf_tread(inode->i_sb,
  1754. udf_get_lb_pblock(inode->i_sb, *bloc, 0))))
  1755. {
  1756. udf_debug("reading block %d failed!n",
  1757. udf_get_lb_pblock(inode->i_sb, *bloc, 0));
  1758. return -1;
  1759. }
  1760. }
  1761. if (!memcmp(&UDF_I_LOCATION(inode), bloc, sizeof(lb_addr)))
  1762. {
  1763. if (!(UDF_I_EXTENDED_FE(inode)))
  1764. pos = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode);
  1765. else
  1766. pos = sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode);
  1767. alen = UDF_I_LENALLOC(inode) + pos;
  1768. }
  1769. else
  1770. {
  1771. struct allocExtDesc *aed = (struct allocExtDesc *)(*bh)->b_data;
  1772. pos = sizeof(struct allocExtDesc);
  1773. alen = le32_to_cpu(aed->lengthAllocDescs) + pos;
  1774. }
  1775. if (!(*extoffset))
  1776. *extoffset = pos;
  1777. switch (UDF_I_ALLOCTYPE(inode))
  1778. {
  1779. case ICBTAG_FLAG_AD_SHORT:
  1780. {
  1781. short_ad *sad;
  1782. if (!(sad = udf_get_fileshortad((*bh)->b_data, alen, extoffset, inc)))
  1783. return -1;
  1784. etype = le32_to_cpu(sad->extLength) >> 30;
  1785. eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
  1786. eloc->partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
  1787. *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
  1788. break;
  1789. }
  1790. case ICBTAG_FLAG_AD_LONG:
  1791. {
  1792. long_ad *lad;
  1793. if (!(lad = udf_get_filelongad((*bh)->b_data, alen, extoffset, inc)))
  1794. return -1;
  1795. etype = le32_to_cpu(lad->extLength) >> 30;
  1796. *eloc = lelb_to_cpu(lad->extLocation);
  1797. *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK;
  1798. break;
  1799. }
  1800. default:
  1801. {
  1802. udf_debug("alloc_type = %d unsupportedn", UDF_I_ALLOCTYPE(inode));
  1803. return -1;
  1804. }
  1805. }
  1806. if (*elen)
  1807. return etype;
  1808. udf_debug("Empty Extent!n");
  1809. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
  1810. *extoffset -= sizeof(short_ad);
  1811. else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
  1812. *extoffset -= sizeof(long_ad);
  1813. return -1;
  1814. }
  1815. int8_t udf_insert_aext(struct inode *inode, lb_addr bloc, int extoffset,
  1816. lb_addr neloc, uint32_t nelen, struct buffer_head *bh)
  1817. {
  1818. lb_addr oeloc;
  1819. uint32_t oelen;
  1820. int8_t etype;
  1821. if (!bh)
  1822. {
  1823. if (!(bh = udf_tread(inode->i_sb,
  1824. udf_get_lb_pblock(inode->i_sb, bloc, 0))))
  1825. {
  1826. udf_debug("reading block %d failed!n",
  1827. udf_get_lb_pblock(inode->i_sb, bloc, 0));
  1828. return -1;
  1829. }
  1830. }
  1831. else
  1832. atomic_inc(&bh->b_count);
  1833. while ((etype = udf_next_aext(inode, &bloc, &extoffset, &oeloc, &oelen, &bh, 0)) != -1)
  1834. {
  1835. udf_write_aext(inode, bloc, &extoffset, neloc, nelen, bh, 1);
  1836. neloc = oeloc;
  1837. nelen = (etype << 30) | oelen;
  1838. }
  1839. udf_add_aext(inode, &bloc, &extoffset, neloc, nelen, &bh, 1);
  1840. udf_release_data(bh);
  1841. return (nelen >> 30);
  1842. }
  1843. int8_t udf_delete_aext(struct inode *inode, lb_addr nbloc, int nextoffset,
  1844. lb_addr eloc, uint32_t elen, struct buffer_head *nbh)
  1845. {
  1846. struct buffer_head *obh;
  1847. lb_addr obloc;
  1848. int oextoffset, adsize;
  1849. int8_t etype;
  1850. struct allocExtDesc *aed;
  1851. if (!(nbh))
  1852. {
  1853. if (!(nbh = udf_tread(inode->i_sb,
  1854. udf_get_lb_pblock(inode->i_sb, nbloc, 0))))
  1855. {
  1856. udf_debug("reading block %d failed!n",
  1857. udf_get_lb_pblock(inode->i_sb, nbloc, 0));
  1858. return -1;
  1859. }
  1860. }
  1861. else
  1862. atomic_inc(&nbh->b_count);
  1863. atomic_inc(&nbh->b_count);
  1864. if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
  1865. adsize = sizeof(short_ad);
  1866. else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
  1867. adsize = sizeof(long_ad);
  1868. else
  1869. adsize = 0;
  1870. obh = nbh;
  1871. obloc = nbloc;
  1872. oextoffset = nextoffset;
  1873. if (udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1) == -1)
  1874. return -1;
  1875. while ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) != -1)
  1876. {
  1877. udf_write_aext(inode, obloc, &oextoffset, eloc, (etype << 30) | elen, obh, 1);
  1878. if (memcmp(&nbloc, &obloc, sizeof(lb_addr)))
  1879. {
  1880. obloc = nbloc;
  1881. udf_release_data(obh);
  1882. atomic_inc(&nbh->b_count);
  1883. obh = nbh;
  1884. oextoffset = nextoffset - adsize;
  1885. }
  1886. }
  1887. memset(&eloc, 0x00, sizeof(lb_addr));
  1888. elen = 0;
  1889. if (memcmp(&nbloc, &obloc, sizeof(lb_addr)))
  1890. {
  1891. udf_free_blocks(inode->i_sb, inode, nbloc, 0, 1);
  1892. udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
  1893. udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
  1894. if (!memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr)))
  1895. {
  1896. UDF_I_LENALLOC(inode) -= (adsize * 2);
  1897. mark_inode_dirty(inode);
  1898. }
  1899. else
  1900. {
  1901. aed = (struct allocExtDesc *)(obh)->b_data;
  1902. aed->lengthAllocDescs =
  1903. cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2*adsize));
  1904. if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
  1905. udf_update_tag((obh)->b_data, oextoffset - (2*adsize));
  1906. else
  1907. udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
  1908. mark_buffer_dirty_inode(obh, inode);
  1909. }
  1910. }
  1911. else
  1912. {
  1913. udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
  1914. if (!memcmp(&UDF_I_LOCATION(inode), &obloc, sizeof(lb_addr)))
  1915. {
  1916. UDF_I_LENALLOC(inode) -= adsize;
  1917. mark_inode_dirty(inode);
  1918. }
  1919. else
  1920. {
  1921. aed = (struct allocExtDesc *)(obh)->b_data;
  1922. aed->lengthAllocDescs =
  1923. cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize);
  1924. if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
  1925. udf_update_tag((obh)->b_data, oextoffset - adsize);
  1926. else
  1927. udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
  1928. mark_buffer_dirty_inode(obh, inode);
  1929. }
  1930. }
  1931. udf_release_data(nbh);
  1932. udf_release_data(obh);
  1933. return (elen >> 30);
  1934. }
  1935. int8_t inode_bmap(struct inode *inode, int block, lb_addr *bloc, uint32_t *extoffset,
  1936. lb_addr *eloc, uint32_t *elen, uint32_t *offset, struct buffer_head **bh)
  1937. {
  1938. uint64_t lbcount = 0, bcount = (uint64_t)block << inode->i_sb->s_blocksize_bits;
  1939. int8_t etype;
  1940. if (block < 0)
  1941. {
  1942. printk(KERN_ERR "udf: inode_bmap: block < 0n");
  1943. return -1;
  1944. }
  1945. if (!inode)
  1946. {
  1947. printk(KERN_ERR "udf: inode_bmap: NULL inoden");
  1948. return -1;
  1949. }
  1950. *extoffset = 0;
  1951. *elen = 0;
  1952. *bloc = UDF_I_LOCATION(inode);
  1953. do
  1954. {
  1955. if ((etype = udf_next_aext(inode, bloc, extoffset, eloc, elen, bh, 1)) == -1)
  1956. {
  1957. *offset = bcount - lbcount;
  1958. UDF_I_LENEXTENTS(inode) = lbcount;
  1959. return -1;
  1960. }
  1961. lbcount += *elen;
  1962. } while (lbcount <= bcount);
  1963. *offset = bcount + *elen - lbcount;
  1964. return etype;
  1965. }
  1966. long udf_block_map(struct inode *inode, long block)
  1967. {
  1968. lb_addr eloc, bloc;
  1969. uint32_t offset, extoffset, elen;
  1970. struct buffer_head *bh = NULL;
  1971. int ret;
  1972. lock_kernel();
  1973. if (inode_bmap(inode, block, &bloc, &extoffset, &eloc, &elen, &offset, &bh) == (EXT_RECORDED_ALLOCATED >> 30))
  1974. ret = udf_get_lb_pblock(inode->i_sb, eloc, offset >> inode->i_sb->s_blocksize_bits);
  1975. else
  1976. ret = 0;
  1977. unlock_kernel();
  1978. if (bh)
  1979. udf_release_data(bh);
  1980. if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
  1981. return udf_fixed_to_variable(ret);
  1982. else
  1983. return ret;
  1984. }