1 /* 2 * namei.c 3 * 4 * PURPOSE 5 * Inode name 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-2004 Ben Fennema 14 * (C) 1999-2000 Stelias Computing Inc 15 * 16 * HISTORY 17 * 18 * 12/12/98 blf Created. Split out the lookup code from dir.c 19 * 04/19/99 blf link, mknod, symlink support 20 */ 21 22 #include "udfdecl.h" 23 24 #include "udf_i.h" 25 #include "udf_sb.h" 26 #include <linux/string.h> 27 #include <linux/errno.h> 28 #include <linux/mm.h> 29 #include <linux/slab.h> 30 #include <linux/sched.h> 31 #include <linux/crc-itu-t.h> 32 #include <linux/exportfs.h> 33 34 static inline int udf_match(int len1, const unsigned char *name1, int len2, 35 const unsigned char *name2) 36 { 37 if (len1 != len2) 38 return 0; 39 40 return !memcmp(name1, name2, len1); 41 } 42 43 int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi, 44 struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh, 45 uint8_t *impuse, uint8_t *fileident) 46 { 47 uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(struct tag); 48 uint16_t crc; 49 int offset; 50 uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse); 51 uint8_t lfi = cfi->lengthFileIdent; 52 int padlen = fibh->eoffset - fibh->soffset - liu - lfi - 53 sizeof(struct fileIdentDesc); 54 int adinicb = 0; 55 56 if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 57 adinicb = 1; 58 59 offset = fibh->soffset + sizeof(struct fileIdentDesc); 60 61 if (impuse) { 62 if (adinicb || (offset + liu < 0)) { 63 memcpy((uint8_t *)sfi->impUse, impuse, liu); 64 } else if (offset >= 0) { 65 memcpy(fibh->ebh->b_data + offset, impuse, liu); 66 } else { 67 memcpy((uint8_t *)sfi->impUse, impuse, -offset); 68 memcpy(fibh->ebh->b_data, impuse - offset, 69 liu + offset); 70 } 71 } 72 73 offset += liu; 74 75 if (fileident) { 76 if (adinicb || (offset + lfi < 0)) { 77 memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi); 78 } else if (offset >= 0) { 79 memcpy(fibh->ebh->b_data + offset, fileident, lfi); 80 } else { 81 memcpy((uint8_t *)sfi->fileIdent + liu, fileident, 82 -offset); 83 memcpy(fibh->ebh->b_data, fileident - offset, 84 lfi + offset); 85 } 86 } 87 88 offset += lfi; 89 90 if (adinicb || (offset + padlen < 0)) { 91 memset((uint8_t *)sfi->padding + liu + lfi, 0x00, padlen); 92 } else if (offset >= 0) { 93 memset(fibh->ebh->b_data + offset, 0x00, padlen); 94 } else { 95 memset((uint8_t *)sfi->padding + liu + lfi, 0x00, -offset); 96 memset(fibh->ebh->b_data, 0x00, padlen + offset); 97 } 98 99 crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(struct tag), 100 sizeof(struct fileIdentDesc) - sizeof(struct tag)); 101 102 if (fibh->sbh == fibh->ebh) { 103 crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, 104 crclen + sizeof(struct tag) - 105 sizeof(struct fileIdentDesc)); 106 } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) { 107 crc = crc_itu_t(crc, fibh->ebh->b_data + 108 sizeof(struct fileIdentDesc) + 109 fibh->soffset, 110 crclen + sizeof(struct tag) - 111 sizeof(struct fileIdentDesc)); 112 } else { 113 crc = crc_itu_t(crc, (uint8_t *)sfi->impUse, 114 -fibh->soffset - sizeof(struct fileIdentDesc)); 115 crc = crc_itu_t(crc, fibh->ebh->b_data, fibh->eoffset); 116 } 117 118 cfi->descTag.descCRC = cpu_to_le16(crc); 119 cfi->descTag.descCRCLength = cpu_to_le16(crclen); 120 cfi->descTag.tagChecksum = udf_tag_checksum(&cfi->descTag); 121 122 if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) { 123 memcpy((uint8_t *)sfi, (uint8_t *)cfi, 124 sizeof(struct fileIdentDesc)); 125 } else { 126 memcpy((uint8_t *)sfi, (uint8_t *)cfi, -fibh->soffset); 127 memcpy(fibh->ebh->b_data, (uint8_t *)cfi - fibh->soffset, 128 sizeof(struct fileIdentDesc) + fibh->soffset); 129 } 130 131 if (adinicb) { 132 mark_inode_dirty(inode); 133 } else { 134 if (fibh->sbh != fibh->ebh) 135 mark_buffer_dirty_inode(fibh->ebh, inode); 136 mark_buffer_dirty_inode(fibh->sbh, inode); 137 } 138 return 0; 139 } 140 141 /** 142 * udf_find_entry - find entry in given directory. 143 * 144 * @dir: directory inode to search in 145 * @child: qstr of the name 146 * @fibh: buffer head / inode with file identifier descriptor we found 147 * @cfi: found file identifier descriptor with given name 148 * 149 * This function searches in the directory @dir for a file name @child. When 150 * found, @fibh points to the buffer head(s) (bh is NULL for in ICB 151 * directories) containing the file identifier descriptor (FID). In that case 152 * the function returns pointer to the FID in the buffer or inode - but note 153 * that FID may be split among two buffers (blocks) so accessing it via that 154 * pointer isn't easily possible. This pointer can be used only as an iterator 155 * for other directory manipulation functions. For inspection of the FID @cfi 156 * can be used - the found FID is copied there. 157 * 158 * Returns pointer to FID, NULL when nothing found, or error code. 159 */ 160 static struct fileIdentDesc *udf_find_entry(struct inode *dir, 161 const struct qstr *child, 162 struct udf_fileident_bh *fibh, 163 struct fileIdentDesc *cfi) 164 { 165 struct fileIdentDesc *fi = NULL; 166 loff_t f_pos; 167 int block, flen; 168 unsigned char *fname = NULL, *copy_name = NULL; 169 unsigned char *nameptr; 170 uint8_t lfi; 171 uint16_t liu; 172 loff_t size; 173 struct kernel_lb_addr eloc; 174 uint32_t elen; 175 sector_t offset; 176 struct extent_position epos = {}; 177 struct udf_inode_info *dinfo = UDF_I(dir); 178 int isdotdot = child->len == 2 && 179 child->name[0] == '.' && child->name[1] == '.'; 180 struct super_block *sb = dir->i_sb; 181 182 size = udf_ext0_offset(dir) + dir->i_size; 183 f_pos = udf_ext0_offset(dir); 184 185 fibh->sbh = fibh->ebh = NULL; 186 fibh->soffset = fibh->eoffset = f_pos & (sb->s_blocksize - 1); 187 if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { 188 if (inode_bmap(dir, f_pos >> sb->s_blocksize_bits, &epos, 189 &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { 190 fi = ERR_PTR(-EIO); 191 goto out_err; 192 } 193 194 block = udf_get_lb_pblock(sb, &eloc, offset); 195 if ((++offset << sb->s_blocksize_bits) < elen) { 196 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) 197 epos.offset -= sizeof(struct short_ad); 198 else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) 199 epos.offset -= sizeof(struct long_ad); 200 } else 201 offset = 0; 202 203 fibh->sbh = fibh->ebh = udf_tread(sb, block); 204 if (!fibh->sbh) { 205 fi = ERR_PTR(-EIO); 206 goto out_err; 207 } 208 } 209 210 fname = kmalloc(UDF_NAME_LEN, GFP_NOFS); 211 if (!fname) { 212 fi = ERR_PTR(-ENOMEM); 213 goto out_err; 214 } 215 216 while (f_pos < size) { 217 fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, 218 &elen, &offset); 219 if (!fi) { 220 fi = ERR_PTR(-EIO); 221 goto out_err; 222 } 223 224 liu = le16_to_cpu(cfi->lengthOfImpUse); 225 lfi = cfi->lengthFileIdent; 226 227 if (fibh->sbh == fibh->ebh) { 228 nameptr = fi->fileIdent + liu; 229 } else { 230 int poffset; /* Unpaded ending offset */ 231 232 poffset = fibh->soffset + sizeof(struct fileIdentDesc) + 233 liu + lfi; 234 235 if (poffset >= lfi) 236 nameptr = (uint8_t *)(fibh->ebh->b_data + 237 poffset - lfi); 238 else { 239 if (!copy_name) { 240 copy_name = kmalloc(UDF_NAME_LEN, 241 GFP_NOFS); 242 if (!copy_name) { 243 fi = ERR_PTR(-ENOMEM); 244 goto out_err; 245 } 246 } 247 nameptr = copy_name; 248 memcpy(nameptr, fi->fileIdent + liu, 249 lfi - poffset); 250 memcpy(nameptr + lfi - poffset, 251 fibh->ebh->b_data, poffset); 252 } 253 } 254 255 if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { 256 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE)) 257 continue; 258 } 259 260 if ((cfi->fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) { 261 if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE)) 262 continue; 263 } 264 265 if ((cfi->fileCharacteristics & FID_FILE_CHAR_PARENT) && 266 isdotdot) 267 goto out_ok; 268 269 if (!lfi) 270 continue; 271 272 flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN); 273 if (flen < 0) { 274 fi = ERR_PTR(flen); 275 goto out_err; 276 } 277 278 if (udf_match(flen, fname, child->len, child->name)) 279 goto out_ok; 280 } 281 282 fi = NULL; 283 out_err: 284 if (fibh->sbh != fibh->ebh) 285 brelse(fibh->ebh); 286 brelse(fibh->sbh); 287 out_ok: 288 brelse(epos.bh); 289 kfree(fname); 290 kfree(copy_name); 291 292 return fi; 293 } 294 295 static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, 296 unsigned int flags) 297 { 298 struct inode *inode = NULL; 299 struct fileIdentDesc cfi; 300 struct udf_fileident_bh fibh; 301 struct fileIdentDesc *fi; 302 303 if (dentry->d_name.len > UDF_NAME_LEN) 304 return ERR_PTR(-ENAMETOOLONG); 305 306 #ifdef UDF_RECOVERY 307 /* temporary shorthand for specifying files by inode number */ 308 if (!strncmp(dentry->d_name.name, ".B=", 3)) { 309 struct kernel_lb_addr lb = { 310 .logicalBlockNum = 0, 311 .partitionReferenceNum = 312 simple_strtoul(dentry->d_name.name + 3, 313 NULL, 0), 314 }; 315 inode = udf_iget(dir->i_sb, lb); 316 if (IS_ERR(inode)) 317 return inode; 318 } else 319 #endif /* UDF_RECOVERY */ 320 321 fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); 322 if (IS_ERR(fi)) 323 return ERR_CAST(fi); 324 325 if (fi) { 326 struct kernel_lb_addr loc; 327 328 if (fibh.sbh != fibh.ebh) 329 brelse(fibh.ebh); 330 brelse(fibh.sbh); 331 332 loc = lelb_to_cpu(cfi.icb.extLocation); 333 inode = udf_iget(dir->i_sb, &loc); 334 if (IS_ERR(inode)) 335 return ERR_CAST(inode); 336 } 337 338 return d_splice_alias(inode, dentry); 339 } 340 341 static struct fileIdentDesc *udf_add_entry(struct inode *dir, 342 struct dentry *dentry, 343 struct udf_fileident_bh *fibh, 344 struct fileIdentDesc *cfi, int *err) 345 { 346 struct super_block *sb = dir->i_sb; 347 struct fileIdentDesc *fi = NULL; 348 unsigned char *name = NULL; 349 int namelen; 350 loff_t f_pos; 351 loff_t size = udf_ext0_offset(dir) + dir->i_size; 352 int nfidlen; 353 uint8_t lfi; 354 uint16_t liu; 355 int block; 356 struct kernel_lb_addr eloc; 357 uint32_t elen = 0; 358 sector_t offset; 359 struct extent_position epos = {}; 360 struct udf_inode_info *dinfo; 361 362 fibh->sbh = fibh->ebh = NULL; 363 name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS); 364 if (!name) { 365 *err = -ENOMEM; 366 goto out_err; 367 } 368 369 if (dentry) { 370 if (!dentry->d_name.len) { 371 *err = -EINVAL; 372 goto out_err; 373 } 374 namelen = udf_put_filename(sb, dentry->d_name.name, 375 dentry->d_name.len, 376 name, UDF_NAME_LEN_CS0); 377 if (!namelen) { 378 *err = -ENAMETOOLONG; 379 goto out_err; 380 } 381 } else { 382 namelen = 0; 383 } 384 385 nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3; 386 387 f_pos = udf_ext0_offset(dir); 388 389 fibh->soffset = fibh->eoffset = f_pos & (dir->i_sb->s_blocksize - 1); 390 dinfo = UDF_I(dir); 391 if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { 392 if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos, 393 &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) { 394 block = udf_get_lb_pblock(dir->i_sb, 395 &dinfo->i_location, 0); 396 fibh->soffset = fibh->eoffset = sb->s_blocksize; 397 goto add; 398 } 399 block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); 400 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { 401 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) 402 epos.offset -= sizeof(struct short_ad); 403 else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) 404 epos.offset -= sizeof(struct long_ad); 405 } else 406 offset = 0; 407 408 fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block); 409 if (!fibh->sbh) { 410 *err = -EIO; 411 goto out_err; 412 } 413 414 block = dinfo->i_location.logicalBlockNum; 415 } 416 417 while (f_pos < size) { 418 fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, 419 &elen, &offset); 420 421 if (!fi) { 422 *err = -EIO; 423 goto out_err; 424 } 425 426 liu = le16_to_cpu(cfi->lengthOfImpUse); 427 lfi = cfi->lengthFileIdent; 428 429 if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { 430 if (((sizeof(struct fileIdentDesc) + 431 liu + lfi + 3) & ~3) == nfidlen) { 432 cfi->descTag.tagSerialNum = cpu_to_le16(1); 433 cfi->fileVersionNum = cpu_to_le16(1); 434 cfi->fileCharacteristics = 0; 435 cfi->lengthFileIdent = namelen; 436 cfi->lengthOfImpUse = cpu_to_le16(0); 437 if (!udf_write_fi(dir, cfi, fi, fibh, NULL, 438 name)) 439 goto out_ok; 440 else { 441 *err = -EIO; 442 goto out_err; 443 } 444 } 445 } 446 } 447 448 add: 449 f_pos += nfidlen; 450 451 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB && 452 sb->s_blocksize - fibh->eoffset < nfidlen) { 453 brelse(epos.bh); 454 epos.bh = NULL; 455 fibh->soffset -= udf_ext0_offset(dir); 456 fibh->eoffset -= udf_ext0_offset(dir); 457 f_pos -= udf_ext0_offset(dir); 458 if (fibh->sbh != fibh->ebh) 459 brelse(fibh->ebh); 460 brelse(fibh->sbh); 461 fibh->sbh = fibh->ebh = 462 udf_expand_dir_adinicb(dir, &block, err); 463 if (!fibh->sbh) 464 goto out_err; 465 epos.block = dinfo->i_location; 466 epos.offset = udf_file_entry_alloc_offset(dir); 467 /* Load extent udf_expand_dir_adinicb() has created */ 468 udf_current_aext(dir, &epos, &eloc, &elen, 1); 469 } 470 471 /* Entry fits into current block? */ 472 if (sb->s_blocksize - fibh->eoffset >= nfidlen) { 473 fibh->soffset = fibh->eoffset; 474 fibh->eoffset += nfidlen; 475 if (fibh->sbh != fibh->ebh) { 476 brelse(fibh->sbh); 477 fibh->sbh = fibh->ebh; 478 } 479 480 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { 481 block = dinfo->i_location.logicalBlockNum; 482 fi = (struct fileIdentDesc *) 483 (dinfo->i_ext.i_data + 484 fibh->soffset - 485 udf_ext0_offset(dir) + 486 dinfo->i_lenEAttr); 487 } else { 488 block = eloc.logicalBlockNum + 489 ((elen - 1) >> 490 dir->i_sb->s_blocksize_bits); 491 fi = (struct fileIdentDesc *) 492 (fibh->sbh->b_data + fibh->soffset); 493 } 494 } else { 495 /* Round up last extent in the file */ 496 elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1); 497 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) 498 epos.offset -= sizeof(struct short_ad); 499 else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) 500 epos.offset -= sizeof(struct long_ad); 501 udf_write_aext(dir, &epos, &eloc, elen, 1); 502 dinfo->i_lenExtents = (dinfo->i_lenExtents + sb->s_blocksize 503 - 1) & ~(sb->s_blocksize - 1); 504 505 fibh->soffset = fibh->eoffset - sb->s_blocksize; 506 fibh->eoffset += nfidlen - sb->s_blocksize; 507 if (fibh->sbh != fibh->ebh) { 508 brelse(fibh->sbh); 509 fibh->sbh = fibh->ebh; 510 } 511 512 block = eloc.logicalBlockNum + ((elen - 1) >> 513 dir->i_sb->s_blocksize_bits); 514 fibh->ebh = udf_bread(dir, 515 f_pos >> dir->i_sb->s_blocksize_bits, 1, err); 516 if (!fibh->ebh) 517 goto out_err; 518 /* Extents could have been merged, invalidate our position */ 519 brelse(epos.bh); 520 epos.bh = NULL; 521 epos.block = dinfo->i_location; 522 epos.offset = udf_file_entry_alloc_offset(dir); 523 524 if (!fibh->soffset) { 525 /* Find the freshly allocated block */ 526 while (udf_next_aext(dir, &epos, &eloc, &elen, 1) == 527 (EXT_RECORDED_ALLOCATED >> 30)) 528 ; 529 block = eloc.logicalBlockNum + ((elen - 1) >> 530 dir->i_sb->s_blocksize_bits); 531 brelse(fibh->sbh); 532 fibh->sbh = fibh->ebh; 533 fi = (struct fileIdentDesc *)(fibh->sbh->b_data); 534 } else { 535 fi = (struct fileIdentDesc *) 536 (fibh->sbh->b_data + sb->s_blocksize + 537 fibh->soffset); 538 } 539 } 540 541 memset(cfi, 0, sizeof(struct fileIdentDesc)); 542 if (UDF_SB(sb)->s_udfrev >= 0x0200) 543 udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, 544 sizeof(struct tag)); 545 else 546 udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, 547 sizeof(struct tag)); 548 cfi->fileVersionNum = cpu_to_le16(1); 549 cfi->lengthFileIdent = namelen; 550 cfi->lengthOfImpUse = cpu_to_le16(0); 551 if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) { 552 dir->i_size += nfidlen; 553 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 554 dinfo->i_lenAlloc += nfidlen; 555 else { 556 /* Find the last extent and truncate it to proper size */ 557 while (udf_next_aext(dir, &epos, &eloc, &elen, 1) == 558 (EXT_RECORDED_ALLOCATED >> 30)) 559 ; 560 elen -= dinfo->i_lenExtents - dir->i_size; 561 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) 562 epos.offset -= sizeof(struct short_ad); 563 else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) 564 epos.offset -= sizeof(struct long_ad); 565 udf_write_aext(dir, &epos, &eloc, elen, 1); 566 dinfo->i_lenExtents = dir->i_size; 567 } 568 569 mark_inode_dirty(dir); 570 goto out_ok; 571 } else { 572 *err = -EIO; 573 goto out_err; 574 } 575 576 out_err: 577 fi = NULL; 578 if (fibh->sbh != fibh->ebh) 579 brelse(fibh->ebh); 580 brelse(fibh->sbh); 581 out_ok: 582 brelse(epos.bh); 583 kfree(name); 584 return fi; 585 } 586 587 static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, 588 struct udf_fileident_bh *fibh, 589 struct fileIdentDesc *cfi) 590 { 591 cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED; 592 593 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) 594 memset(&(cfi->icb), 0x00, sizeof(struct long_ad)); 595 596 return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); 597 } 598 599 static int udf_add_nondir(struct dentry *dentry, struct inode *inode) 600 { 601 struct udf_inode_info *iinfo = UDF_I(inode); 602 struct inode *dir = d_inode(dentry->d_parent); 603 struct udf_fileident_bh fibh; 604 struct fileIdentDesc cfi, *fi; 605 int err; 606 607 fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); 608 if (unlikely(!fi)) { 609 inode_dec_link_count(inode); 610 unlock_new_inode(inode); 611 iput(inode); 612 return err; 613 } 614 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 615 cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location); 616 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 617 cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL); 618 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 619 dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); 620 mark_inode_dirty(dir); 621 if (fibh.sbh != fibh.ebh) 622 brelse(fibh.ebh); 623 brelse(fibh.sbh); 624 unlock_new_inode(inode); 625 d_instantiate(dentry, inode); 626 627 return 0; 628 } 629 630 static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode, 631 bool excl) 632 { 633 struct inode *inode = udf_new_inode(dir, mode); 634 635 if (IS_ERR(inode)) 636 return PTR_ERR(inode); 637 638 if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 639 inode->i_data.a_ops = &udf_adinicb_aops; 640 else 641 inode->i_data.a_ops = &udf_aops; 642 inode->i_op = &udf_file_inode_operations; 643 inode->i_fop = &udf_file_operations; 644 mark_inode_dirty(inode); 645 646 return udf_add_nondir(dentry, inode); 647 } 648 649 static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) 650 { 651 struct inode *inode = udf_new_inode(dir, mode); 652 653 if (IS_ERR(inode)) 654 return PTR_ERR(inode); 655 656 if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 657 inode->i_data.a_ops = &udf_adinicb_aops; 658 else 659 inode->i_data.a_ops = &udf_aops; 660 inode->i_op = &udf_file_inode_operations; 661 inode->i_fop = &udf_file_operations; 662 mark_inode_dirty(inode); 663 d_tmpfile(dentry, inode); 664 unlock_new_inode(inode); 665 return 0; 666 } 667 668 static int udf_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, 669 dev_t rdev) 670 { 671 struct inode *inode; 672 673 if (!old_valid_dev(rdev)) 674 return -EINVAL; 675 676 inode = udf_new_inode(dir, mode); 677 if (IS_ERR(inode)) 678 return PTR_ERR(inode); 679 680 init_special_inode(inode, mode, rdev); 681 return udf_add_nondir(dentry, inode); 682 } 683 684 static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) 685 { 686 struct inode *inode; 687 struct udf_fileident_bh fibh; 688 struct fileIdentDesc cfi, *fi; 689 int err; 690 struct udf_inode_info *dinfo = UDF_I(dir); 691 struct udf_inode_info *iinfo; 692 693 inode = udf_new_inode(dir, S_IFDIR | mode); 694 if (IS_ERR(inode)) 695 return PTR_ERR(inode); 696 697 iinfo = UDF_I(inode); 698 inode->i_op = &udf_dir_inode_operations; 699 inode->i_fop = &udf_dir_operations; 700 fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err); 701 if (!fi) { 702 inode_dec_link_count(inode); 703 unlock_new_inode(inode); 704 iput(inode); 705 goto out; 706 } 707 set_nlink(inode, 2); 708 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 709 cfi.icb.extLocation = cpu_to_lelb(dinfo->i_location); 710 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 711 cpu_to_le32(dinfo->i_unique & 0x00000000FFFFFFFFUL); 712 cfi.fileCharacteristics = 713 FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT; 714 udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL); 715 brelse(fibh.sbh); 716 mark_inode_dirty(inode); 717 718 fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); 719 if (!fi) { 720 clear_nlink(inode); 721 mark_inode_dirty(inode); 722 unlock_new_inode(inode); 723 iput(inode); 724 goto out; 725 } 726 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 727 cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location); 728 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 729 cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL); 730 cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; 731 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 732 inc_nlink(dir); 733 dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); 734 mark_inode_dirty(dir); 735 unlock_new_inode(inode); 736 d_instantiate(dentry, inode); 737 if (fibh.sbh != fibh.ebh) 738 brelse(fibh.ebh); 739 brelse(fibh.sbh); 740 err = 0; 741 742 out: 743 return err; 744 } 745 746 static int empty_dir(struct inode *dir) 747 { 748 struct fileIdentDesc *fi, cfi; 749 struct udf_fileident_bh fibh; 750 loff_t f_pos; 751 loff_t size = udf_ext0_offset(dir) + dir->i_size; 752 int block; 753 struct kernel_lb_addr eloc; 754 uint32_t elen; 755 sector_t offset; 756 struct extent_position epos = {}; 757 struct udf_inode_info *dinfo = UDF_I(dir); 758 759 f_pos = udf_ext0_offset(dir); 760 fibh.soffset = fibh.eoffset = f_pos & (dir->i_sb->s_blocksize - 1); 761 762 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 763 fibh.sbh = fibh.ebh = NULL; 764 else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, 765 &epos, &eloc, &elen, &offset) == 766 (EXT_RECORDED_ALLOCATED >> 30)) { 767 block = udf_get_lb_pblock(dir->i_sb, &eloc, offset); 768 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { 769 if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) 770 epos.offset -= sizeof(struct short_ad); 771 else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG) 772 epos.offset -= sizeof(struct long_ad); 773 } else 774 offset = 0; 775 776 fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block); 777 if (!fibh.sbh) { 778 brelse(epos.bh); 779 return 0; 780 } 781 } else { 782 brelse(epos.bh); 783 return 0; 784 } 785 786 while (f_pos < size) { 787 fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc, 788 &elen, &offset); 789 if (!fi) { 790 if (fibh.sbh != fibh.ebh) 791 brelse(fibh.ebh); 792 brelse(fibh.sbh); 793 brelse(epos.bh); 794 return 0; 795 } 796 797 if (cfi.lengthFileIdent && 798 (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) { 799 if (fibh.sbh != fibh.ebh) 800 brelse(fibh.ebh); 801 brelse(fibh.sbh); 802 brelse(epos.bh); 803 return 0; 804 } 805 } 806 807 if (fibh.sbh != fibh.ebh) 808 brelse(fibh.ebh); 809 brelse(fibh.sbh); 810 brelse(epos.bh); 811 812 return 1; 813 } 814 815 static int udf_rmdir(struct inode *dir, struct dentry *dentry) 816 { 817 int retval; 818 struct inode *inode = d_inode(dentry); 819 struct udf_fileident_bh fibh; 820 struct fileIdentDesc *fi, cfi; 821 struct kernel_lb_addr tloc; 822 823 retval = -ENOENT; 824 fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); 825 if (IS_ERR_OR_NULL(fi)) { 826 if (fi) 827 retval = PTR_ERR(fi); 828 goto out; 829 } 830 831 retval = -EIO; 832 tloc = lelb_to_cpu(cfi.icb.extLocation); 833 if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) 834 goto end_rmdir; 835 retval = -ENOTEMPTY; 836 if (!empty_dir(inode)) 837 goto end_rmdir; 838 retval = udf_delete_entry(dir, fi, &fibh, &cfi); 839 if (retval) 840 goto end_rmdir; 841 if (inode->i_nlink != 2) 842 udf_warn(inode->i_sb, "empty directory has nlink != 2 (%d)\n", 843 inode->i_nlink); 844 clear_nlink(inode); 845 inode->i_size = 0; 846 inode_dec_link_count(dir); 847 inode->i_ctime = dir->i_ctime = dir->i_mtime = 848 current_fs_time(dir->i_sb); 849 mark_inode_dirty(dir); 850 851 end_rmdir: 852 if (fibh.sbh != fibh.ebh) 853 brelse(fibh.ebh); 854 brelse(fibh.sbh); 855 856 out: 857 return retval; 858 } 859 860 static int udf_unlink(struct inode *dir, struct dentry *dentry) 861 { 862 int retval; 863 struct inode *inode = d_inode(dentry); 864 struct udf_fileident_bh fibh; 865 struct fileIdentDesc *fi; 866 struct fileIdentDesc cfi; 867 struct kernel_lb_addr tloc; 868 869 retval = -ENOENT; 870 fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi); 871 872 if (IS_ERR_OR_NULL(fi)) { 873 if (fi) 874 retval = PTR_ERR(fi); 875 goto out; 876 } 877 878 retval = -EIO; 879 tloc = lelb_to_cpu(cfi.icb.extLocation); 880 if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino) 881 goto end_unlink; 882 883 if (!inode->i_nlink) { 884 udf_debug("Deleting nonexistent file (%lu), %d\n", 885 inode->i_ino, inode->i_nlink); 886 set_nlink(inode, 1); 887 } 888 retval = udf_delete_entry(dir, fi, &fibh, &cfi); 889 if (retval) 890 goto end_unlink; 891 dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); 892 mark_inode_dirty(dir); 893 inode_dec_link_count(inode); 894 inode->i_ctime = dir->i_ctime; 895 retval = 0; 896 897 end_unlink: 898 if (fibh.sbh != fibh.ebh) 899 brelse(fibh.ebh); 900 brelse(fibh.sbh); 901 902 out: 903 return retval; 904 } 905 906 static int udf_symlink(struct inode *dir, struct dentry *dentry, 907 const char *symname) 908 { 909 struct inode *inode = udf_new_inode(dir, S_IFLNK | S_IRWXUGO); 910 struct pathComponent *pc; 911 const char *compstart; 912 struct extent_position epos = {}; 913 int eoffset, elen = 0; 914 uint8_t *ea; 915 int err; 916 int block; 917 unsigned char *name = NULL; 918 int namelen; 919 struct udf_inode_info *iinfo; 920 struct super_block *sb = dir->i_sb; 921 922 if (IS_ERR(inode)) 923 return PTR_ERR(inode); 924 925 iinfo = UDF_I(inode); 926 down_write(&iinfo->i_data_sem); 927 name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS); 928 if (!name) { 929 err = -ENOMEM; 930 goto out_no_entry; 931 } 932 933 inode->i_data.a_ops = &udf_symlink_aops; 934 inode->i_op = &page_symlink_inode_operations; 935 inode_nohighmem(inode); 936 937 if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) { 938 struct kernel_lb_addr eloc; 939 uint32_t bsize; 940 941 block = udf_new_block(sb, inode, 942 iinfo->i_location.partitionReferenceNum, 943 iinfo->i_location.logicalBlockNum, &err); 944 if (!block) 945 goto out_no_entry; 946 epos.block = iinfo->i_location; 947 epos.offset = udf_file_entry_alloc_offset(inode); 948 epos.bh = NULL; 949 eloc.logicalBlockNum = block; 950 eloc.partitionReferenceNum = 951 iinfo->i_location.partitionReferenceNum; 952 bsize = sb->s_blocksize; 953 iinfo->i_lenExtents = bsize; 954 udf_add_aext(inode, &epos, &eloc, bsize, 0); 955 brelse(epos.bh); 956 957 block = udf_get_pblock(sb, block, 958 iinfo->i_location.partitionReferenceNum, 959 0); 960 epos.bh = udf_tgetblk(sb, block); 961 lock_buffer(epos.bh); 962 memset(epos.bh->b_data, 0x00, bsize); 963 set_buffer_uptodate(epos.bh); 964 unlock_buffer(epos.bh); 965 mark_buffer_dirty_inode(epos.bh, inode); 966 ea = epos.bh->b_data + udf_ext0_offset(inode); 967 } else 968 ea = iinfo->i_ext.i_data + iinfo->i_lenEAttr; 969 970 eoffset = sb->s_blocksize - udf_ext0_offset(inode); 971 pc = (struct pathComponent *)ea; 972 973 if (*symname == '/') { 974 do { 975 symname++; 976 } while (*symname == '/'); 977 978 pc->componentType = 1; 979 pc->lengthComponentIdent = 0; 980 pc->componentFileVersionNum = 0; 981 elen += sizeof(struct pathComponent); 982 } 983 984 err = -ENAMETOOLONG; 985 986 while (*symname) { 987 if (elen + sizeof(struct pathComponent) > eoffset) 988 goto out_no_entry; 989 990 pc = (struct pathComponent *)(ea + elen); 991 992 compstart = symname; 993 994 do { 995 symname++; 996 } while (*symname && *symname != '/'); 997 998 pc->componentType = 5; 999 pc->lengthComponentIdent = 0; 1000 pc->componentFileVersionNum = 0; 1001 if (compstart[0] == '.') { 1002 if ((symname - compstart) == 1) 1003 pc->componentType = 4; 1004 else if ((symname - compstart) == 2 && 1005 compstart[1] == '.') 1006 pc->componentType = 3; 1007 } 1008 1009 if (pc->componentType == 5) { 1010 namelen = udf_put_filename(sb, compstart, 1011 symname - compstart, 1012 name, UDF_NAME_LEN_CS0); 1013 if (!namelen) 1014 goto out_no_entry; 1015 1016 if (elen + sizeof(struct pathComponent) + namelen > 1017 eoffset) 1018 goto out_no_entry; 1019 else 1020 pc->lengthComponentIdent = namelen; 1021 1022 memcpy(pc->componentIdent, name, namelen); 1023 } 1024 1025 elen += sizeof(struct pathComponent) + pc->lengthComponentIdent; 1026 1027 if (*symname) { 1028 do { 1029 symname++; 1030 } while (*symname == '/'); 1031 } 1032 } 1033 1034 brelse(epos.bh); 1035 inode->i_size = elen; 1036 if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 1037 iinfo->i_lenAlloc = inode->i_size; 1038 else 1039 udf_truncate_tail_extent(inode); 1040 mark_inode_dirty(inode); 1041 up_write(&iinfo->i_data_sem); 1042 1043 err = udf_add_nondir(dentry, inode); 1044 out: 1045 kfree(name); 1046 return err; 1047 1048 out_no_entry: 1049 up_write(&iinfo->i_data_sem); 1050 inode_dec_link_count(inode); 1051 unlock_new_inode(inode); 1052 iput(inode); 1053 goto out; 1054 } 1055 1056 static int udf_link(struct dentry *old_dentry, struct inode *dir, 1057 struct dentry *dentry) 1058 { 1059 struct inode *inode = d_inode(old_dentry); 1060 struct udf_fileident_bh fibh; 1061 struct fileIdentDesc cfi, *fi; 1062 int err; 1063 1064 fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err); 1065 if (!fi) { 1066 return err; 1067 } 1068 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 1069 cfi.icb.extLocation = cpu_to_lelb(UDF_I(inode)->i_location); 1070 if (UDF_SB(inode->i_sb)->s_lvid_bh) { 1071 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 1072 cpu_to_le32(lvid_get_unique_id(inode->i_sb)); 1073 } 1074 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 1075 if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 1076 mark_inode_dirty(dir); 1077 1078 if (fibh.sbh != fibh.ebh) 1079 brelse(fibh.ebh); 1080 brelse(fibh.sbh); 1081 inc_nlink(inode); 1082 inode->i_ctime = current_fs_time(inode->i_sb); 1083 mark_inode_dirty(inode); 1084 dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); 1085 mark_inode_dirty(dir); 1086 ihold(inode); 1087 d_instantiate(dentry, inode); 1088 1089 return 0; 1090 } 1091 1092 /* Anybody can rename anything with this: the permission checks are left to the 1093 * higher-level routines. 1094 */ 1095 static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, 1096 struct inode *new_dir, struct dentry *new_dentry) 1097 { 1098 struct inode *old_inode = d_inode(old_dentry); 1099 struct inode *new_inode = d_inode(new_dentry); 1100 struct udf_fileident_bh ofibh, nfibh; 1101 struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = NULL; 1102 struct fileIdentDesc ocfi, ncfi; 1103 struct buffer_head *dir_bh = NULL; 1104 int retval = -ENOENT; 1105 struct kernel_lb_addr tloc; 1106 struct udf_inode_info *old_iinfo = UDF_I(old_inode); 1107 1108 ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi); 1109 if (IS_ERR(ofi)) { 1110 retval = PTR_ERR(ofi); 1111 goto end_rename; 1112 } 1113 1114 if (ofibh.sbh != ofibh.ebh) 1115 brelse(ofibh.ebh); 1116 1117 brelse(ofibh.sbh); 1118 tloc = lelb_to_cpu(ocfi.icb.extLocation); 1119 if (!ofi || udf_get_lb_pblock(old_dir->i_sb, &tloc, 0) 1120 != old_inode->i_ino) 1121 goto end_rename; 1122 1123 nfi = udf_find_entry(new_dir, &new_dentry->d_name, &nfibh, &ncfi); 1124 if (IS_ERR(nfi)) { 1125 retval = PTR_ERR(nfi); 1126 goto end_rename; 1127 } 1128 if (nfi && !new_inode) { 1129 if (nfibh.sbh != nfibh.ebh) 1130 brelse(nfibh.ebh); 1131 brelse(nfibh.sbh); 1132 nfi = NULL; 1133 } 1134 if (S_ISDIR(old_inode->i_mode)) { 1135 int offset = udf_ext0_offset(old_inode); 1136 1137 if (new_inode) { 1138 retval = -ENOTEMPTY; 1139 if (!empty_dir(new_inode)) 1140 goto end_rename; 1141 } 1142 retval = -EIO; 1143 if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) { 1144 dir_fi = udf_get_fileident( 1145 old_iinfo->i_ext.i_data - 1146 (old_iinfo->i_efe ? 1147 sizeof(struct extendedFileEntry) : 1148 sizeof(struct fileEntry)), 1149 old_inode->i_sb->s_blocksize, &offset); 1150 } else { 1151 dir_bh = udf_bread(old_inode, 0, 0, &retval); 1152 if (!dir_bh) 1153 goto end_rename; 1154 dir_fi = udf_get_fileident(dir_bh->b_data, 1155 old_inode->i_sb->s_blocksize, &offset); 1156 } 1157 if (!dir_fi) 1158 goto end_rename; 1159 tloc = lelb_to_cpu(dir_fi->icb.extLocation); 1160 if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) != 1161 old_dir->i_ino) 1162 goto end_rename; 1163 } 1164 if (!nfi) { 1165 nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi, 1166 &retval); 1167 if (!nfi) 1168 goto end_rename; 1169 } 1170 1171 /* 1172 * Like most other Unix systems, set the ctime for inodes on a 1173 * rename. 1174 */ 1175 old_inode->i_ctime = current_fs_time(old_inode->i_sb); 1176 mark_inode_dirty(old_inode); 1177 1178 /* 1179 * ok, that's it 1180 */ 1181 ncfi.fileVersionNum = ocfi.fileVersionNum; 1182 ncfi.fileCharacteristics = ocfi.fileCharacteristics; 1183 memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(struct long_ad)); 1184 udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL); 1185 1186 /* The old fid may have moved - find it again */ 1187 ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi); 1188 udf_delete_entry(old_dir, ofi, &ofibh, &ocfi); 1189 1190 if (new_inode) { 1191 new_inode->i_ctime = current_fs_time(new_inode->i_sb); 1192 inode_dec_link_count(new_inode); 1193 } 1194 old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb); 1195 new_dir->i_ctime = new_dir->i_mtime = current_fs_time(new_dir->i_sb); 1196 mark_inode_dirty(old_dir); 1197 mark_inode_dirty(new_dir); 1198 1199 if (dir_fi) { 1200 dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location); 1201 udf_update_tag((char *)dir_fi, 1202 (sizeof(struct fileIdentDesc) + 1203 le16_to_cpu(dir_fi->lengthOfImpUse) + 3) & ~3); 1204 if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) 1205 mark_inode_dirty(old_inode); 1206 else 1207 mark_buffer_dirty_inode(dir_bh, old_inode); 1208 1209 inode_dec_link_count(old_dir); 1210 if (new_inode) 1211 inode_dec_link_count(new_inode); 1212 else { 1213 inc_nlink(new_dir); 1214 mark_inode_dirty(new_dir); 1215 } 1216 } 1217 1218 if (ofi) { 1219 if (ofibh.sbh != ofibh.ebh) 1220 brelse(ofibh.ebh); 1221 brelse(ofibh.sbh); 1222 } 1223 1224 retval = 0; 1225 1226 end_rename: 1227 brelse(dir_bh); 1228 if (nfi) { 1229 if (nfibh.sbh != nfibh.ebh) 1230 brelse(nfibh.ebh); 1231 brelse(nfibh.sbh); 1232 } 1233 1234 return retval; 1235 } 1236 1237 static struct dentry *udf_get_parent(struct dentry *child) 1238 { 1239 struct kernel_lb_addr tloc; 1240 struct inode *inode = NULL; 1241 struct qstr dotdot = QSTR_INIT("..", 2); 1242 struct fileIdentDesc cfi; 1243 struct udf_fileident_bh fibh; 1244 1245 if (!udf_find_entry(d_inode(child), &dotdot, &fibh, &cfi)) 1246 return ERR_PTR(-EACCES); 1247 1248 if (fibh.sbh != fibh.ebh) 1249 brelse(fibh.ebh); 1250 brelse(fibh.sbh); 1251 1252 tloc = lelb_to_cpu(cfi.icb.extLocation); 1253 inode = udf_iget(child->d_sb, &tloc); 1254 if (IS_ERR(inode)) 1255 return ERR_CAST(inode); 1256 1257 return d_obtain_alias(inode); 1258 } 1259 1260 1261 static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block, 1262 u16 partref, __u32 generation) 1263 { 1264 struct inode *inode; 1265 struct kernel_lb_addr loc; 1266 1267 if (block == 0) 1268 return ERR_PTR(-ESTALE); 1269 1270 loc.logicalBlockNum = block; 1271 loc.partitionReferenceNum = partref; 1272 inode = udf_iget(sb, &loc); 1273 1274 if (IS_ERR(inode)) 1275 return ERR_CAST(inode); 1276 1277 if (generation && inode->i_generation != generation) { 1278 iput(inode); 1279 return ERR_PTR(-ESTALE); 1280 } 1281 return d_obtain_alias(inode); 1282 } 1283 1284 static struct dentry *udf_fh_to_dentry(struct super_block *sb, 1285 struct fid *fid, int fh_len, int fh_type) 1286 { 1287 if (fh_len < 3 || 1288 (fh_type != FILEID_UDF_WITH_PARENT && 1289 fh_type != FILEID_UDF_WITHOUT_PARENT)) 1290 return NULL; 1291 1292 return udf_nfs_get_inode(sb, fid->udf.block, fid->udf.partref, 1293 fid->udf.generation); 1294 } 1295 1296 static struct dentry *udf_fh_to_parent(struct super_block *sb, 1297 struct fid *fid, int fh_len, int fh_type) 1298 { 1299 if (fh_len < 5 || fh_type != FILEID_UDF_WITH_PARENT) 1300 return NULL; 1301 1302 return udf_nfs_get_inode(sb, fid->udf.parent_block, 1303 fid->udf.parent_partref, 1304 fid->udf.parent_generation); 1305 } 1306 static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp, 1307 struct inode *parent) 1308 { 1309 int len = *lenp; 1310 struct kernel_lb_addr location = UDF_I(inode)->i_location; 1311 struct fid *fid = (struct fid *)fh; 1312 int type = FILEID_UDF_WITHOUT_PARENT; 1313 1314 if (parent && (len < 5)) { 1315 *lenp = 5; 1316 return FILEID_INVALID; 1317 } else if (len < 3) { 1318 *lenp = 3; 1319 return FILEID_INVALID; 1320 } 1321 1322 *lenp = 3; 1323 fid->udf.block = location.logicalBlockNum; 1324 fid->udf.partref = location.partitionReferenceNum; 1325 fid->udf.parent_partref = 0; 1326 fid->udf.generation = inode->i_generation; 1327 1328 if (parent) { 1329 location = UDF_I(parent)->i_location; 1330 fid->udf.parent_block = location.logicalBlockNum; 1331 fid->udf.parent_partref = location.partitionReferenceNum; 1332 fid->udf.parent_generation = inode->i_generation; 1333 *lenp = 5; 1334 type = FILEID_UDF_WITH_PARENT; 1335 } 1336 1337 return type; 1338 } 1339 1340 const struct export_operations udf_export_ops = { 1341 .encode_fh = udf_encode_fh, 1342 .fh_to_dentry = udf_fh_to_dentry, 1343 .fh_to_parent = udf_fh_to_parent, 1344 .get_parent = udf_get_parent, 1345 }; 1346 1347 const struct inode_operations udf_dir_inode_operations = { 1348 .lookup = udf_lookup, 1349 .create = udf_create, 1350 .link = udf_link, 1351 .unlink = udf_unlink, 1352 .symlink = udf_symlink, 1353 .mkdir = udf_mkdir, 1354 .rmdir = udf_rmdir, 1355 .mknod = udf_mknod, 1356 .rename = udf_rename, 1357 .tmpfile = udf_tmpfile, 1358 }; 1359