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