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/quotaops.h> 31 #include <linux/smp_lock.h> 32 #include <linux/buffer_head.h> 33 #include <linux/sched.h> 34 35 static inline int udf_match(int len1, const char *name1, int len2, 36 const char *name2) 37 { 38 if (len1 != len2) 39 return 0; 40 41 return !memcmp(name1, name2, len1); 42 } 43 44 int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi, 45 struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh, 46 uint8_t * impuse, uint8_t * fileident) 47 { 48 uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(tag); 49 uint16_t crc; 50 uint8_t checksum = 0; 51 int i; 52 int offset; 53 uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse); 54 uint8_t lfi = cfi->lengthFileIdent; 55 int padlen = fibh->eoffset - fibh->soffset - liu - lfi - 56 sizeof(struct fileIdentDesc); 57 int adinicb = 0; 58 59 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) 60 adinicb = 1; 61 62 offset = fibh->soffset + sizeof(struct fileIdentDesc); 63 64 if (impuse) { 65 if (adinicb || (offset + liu < 0)) { 66 memcpy((uint8_t *)sfi->impUse, impuse, liu); 67 } else if (offset >= 0) { 68 memcpy(fibh->ebh->b_data + offset, impuse, liu); 69 } else { 70 memcpy((uint8_t *)sfi->impUse, impuse, -offset); 71 memcpy(fibh->ebh->b_data, impuse - offset, liu + offset); 72 } 73 } 74 75 offset += liu; 76 77 if (fileident) { 78 if (adinicb || (offset + lfi < 0)) { 79 memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi); 80 } else if (offset >= 0) { 81 memcpy(fibh->ebh->b_data + offset, fileident, lfi); 82 } else { 83 memcpy((uint8_t *)sfi->fileIdent + liu, fileident, -offset); 84 memcpy(fibh->ebh->b_data, fileident - offset, 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 = udf_crc((uint8_t *)cfi + sizeof(tag), 100 sizeof(struct fileIdentDesc) - sizeof(tag), 0); 101 102 if (fibh->sbh == fibh->ebh) { 103 crc = udf_crc((uint8_t *)sfi->impUse, 104 crclen + sizeof(tag) - sizeof(struct fileIdentDesc), crc); 105 } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) { 106 crc = udf_crc(fibh->ebh->b_data + sizeof(struct fileIdentDesc) + fibh->soffset, 107 crclen + sizeof(tag) - sizeof(struct fileIdentDesc), crc); 108 } else { 109 crc = udf_crc((uint8_t *)sfi->impUse, 110 -fibh->soffset - sizeof(struct fileIdentDesc), crc); 111 crc = udf_crc(fibh->ebh->b_data, fibh->eoffset, crc); 112 } 113 114 cfi->descTag.descCRC = cpu_to_le16(crc); 115 cfi->descTag.descCRCLength = cpu_to_le16(crclen); 116 117 for (i = 0; i < 16; i++) { 118 if (i != 4) 119 checksum += ((uint8_t *)&cfi->descTag)[i]; 120 } 121 122 cfi->descTag.tagChecksum = checksum; 123 if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) { 124 memcpy((uint8_t *)sfi, (uint8_t *)cfi, 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 static struct fileIdentDesc *udf_find_entry(struct inode *dir, 142 struct dentry *dentry, 143 struct udf_fileident_bh *fibh, 144 struct fileIdentDesc *cfi) 145 { 146 struct fileIdentDesc *fi = NULL; 147 loff_t f_pos; 148 int block, flen; 149 char fname[UDF_NAME_LEN]; 150 char *nameptr; 151 uint8_t lfi; 152 uint16_t liu; 153 loff_t size; 154 kernel_lb_addr eloc; 155 uint32_t elen; 156 sector_t offset; 157 struct extent_position epos = {}; 158 159 size = (udf_ext0_offset(dir) + dir->i_size) >> 2; 160 f_pos = (udf_ext0_offset(dir) >> 2); 161 162 fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; 163 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 164 fibh->sbh = fibh->ebh = NULL; 165 } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 166 &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { 167 block = udf_get_lb_pblock(dir->i_sb, eloc, offset); 168 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { 169 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) 170 epos.offset -= sizeof(short_ad); 171 else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) 172 epos.offset -= sizeof(long_ad); 173 } else { 174 offset = 0; 175 } 176 177 if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) { 178 brelse(epos.bh); 179 return NULL; 180 } 181 } else { 182 brelse(epos.bh); 183 return NULL; 184 } 185 186 while ((f_pos < size)) { 187 fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, 188 &elen, &offset); 189 if (!fi) { 190 if (fibh->sbh != fibh->ebh) 191 brelse(fibh->ebh); 192 brelse(fibh->sbh); 193 brelse(epos.bh); 194 return NULL; 195 } 196 197 liu = le16_to_cpu(cfi->lengthOfImpUse); 198 lfi = cfi->lengthFileIdent; 199 200 if (fibh->sbh == fibh->ebh) { 201 nameptr = fi->fileIdent + liu; 202 } else { 203 int poffset; /* Unpaded ending offset */ 204 205 poffset = fibh->soffset + sizeof(struct fileIdentDesc) + liu + lfi; 206 207 if (poffset >= lfi) { 208 nameptr = (uint8_t *)(fibh->ebh->b_data + poffset - lfi); 209 } else { 210 nameptr = fname; 211 memcpy(nameptr, fi->fileIdent + liu, lfi - poffset); 212 memcpy(nameptr + lfi - poffset, fibh->ebh->b_data, poffset); 213 } 214 } 215 216 if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { 217 if (!UDF_QUERY_FLAG(dir->i_sb, UDF_FLAG_UNDELETE)) 218 continue; 219 } 220 221 if ((cfi->fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) { 222 if (!UDF_QUERY_FLAG(dir->i_sb, UDF_FLAG_UNHIDE)) 223 continue; 224 } 225 226 if (!lfi) 227 continue; 228 229 if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi))) { 230 if (udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name)) { 231 brelse(epos.bh); 232 return fi; 233 } 234 } 235 } 236 237 if (fibh->sbh != fibh->ebh) 238 brelse(fibh->ebh); 239 brelse(fibh->sbh); 240 brelse(epos.bh); 241 242 return NULL; 243 } 244 245 /* 246 * udf_lookup 247 * 248 * PURPOSE 249 * Look-up the inode for a given name. 250 * 251 * DESCRIPTION 252 * Required - lookup_dentry() will return -ENOTDIR if this routine is not 253 * available for a directory. The filesystem is useless if this routine is 254 * not available for at least the filesystem's root directory. 255 * 256 * This routine is passed an incomplete dentry - it must be completed by 257 * calling d_add(dentry, inode). If the name does not exist, then the 258 * specified inode must be set to null. An error should only be returned 259 * when the lookup fails for a reason other than the name not existing. 260 * Note that the directory inode semaphore is held during the call. 261 * 262 * Refer to lookup_dentry() in fs/namei.c 263 * lookup_dentry() -> lookup() -> real_lookup() -> . 264 * 265 * PRE-CONDITIONS 266 * dir Pointer to inode of parent directory. 267 * dentry Pointer to dentry to complete. 268 * nd Pointer to lookup nameidata 269 * 270 * POST-CONDITIONS 271 * <return> Zero on success. 272 * 273 * HISTORY 274 * July 1, 1997 - Andrew E. Mileski 275 * Written, tested, and released. 276 */ 277 278 static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry, 279 struct nameidata *nd) 280 { 281 struct inode *inode = NULL; 282 struct fileIdentDesc cfi; 283 struct udf_fileident_bh fibh; 284 285 if (dentry->d_name.len > UDF_NAME_LEN - 2) 286 return ERR_PTR(-ENAMETOOLONG); 287 288 lock_kernel(); 289 #ifdef UDF_RECOVERY 290 /* temporary shorthand for specifying files by inode number */ 291 if (!strncmp(dentry->d_name.name, ".B=", 3)) { 292 kernel_lb_addr lb = { 293 .logicalBlockNum = 0, 294 .partitionReferenceNum = simple_strtoul(dentry->d_name.name + 3, 295 NULL, 0), 296 }; 297 inode = udf_iget(dir->i_sb, lb); 298 if (!inode) { 299 unlock_kernel(); 300 return ERR_PTR(-EACCES); 301 } 302 } 303 else 304 #endif /* UDF_RECOVERY */ 305 306 if (udf_find_entry(dir, dentry, &fibh, &cfi)) { 307 if (fibh.sbh != fibh.ebh) 308 brelse(fibh.ebh); 309 brelse(fibh.sbh); 310 311 inode = udf_iget(dir->i_sb, lelb_to_cpu(cfi.icb.extLocation)); 312 if (!inode) { 313 unlock_kernel(); 314 return ERR_PTR(-EACCES); 315 } 316 } 317 unlock_kernel(); 318 d_add(dentry, inode); 319 320 return NULL; 321 } 322 323 static struct fileIdentDesc *udf_add_entry(struct inode *dir, 324 struct dentry *dentry, 325 struct udf_fileident_bh *fibh, 326 struct fileIdentDesc *cfi, int *err) 327 { 328 struct super_block *sb; 329 struct fileIdentDesc *fi = NULL; 330 char name[UDF_NAME_LEN], fname[UDF_NAME_LEN]; 331 int namelen; 332 loff_t f_pos; 333 int flen; 334 char *nameptr; 335 loff_t size = (udf_ext0_offset(dir) + dir->i_size) >> 2; 336 int nfidlen; 337 uint8_t lfi; 338 uint16_t liu; 339 int block; 340 kernel_lb_addr eloc; 341 uint32_t elen; 342 sector_t offset; 343 struct extent_position epos = {}; 344 345 sb = dir->i_sb; 346 347 if (dentry) { 348 if (!dentry->d_name.len) { 349 *err = -EINVAL; 350 return NULL; 351 } 352 if (!(namelen = udf_put_filename(sb, dentry->d_name.name, name, 353 dentry->d_name.len))) { 354 *err = -ENAMETOOLONG; 355 return NULL; 356 } 357 } else { 358 namelen = 0; 359 } 360 361 nfidlen = (sizeof(struct fileIdentDesc) + namelen + 3) & ~3; 362 363 f_pos = (udf_ext0_offset(dir) >> 2); 364 365 fibh->soffset = fibh->eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; 366 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 367 fibh->sbh = fibh->ebh = NULL; 368 } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 369 &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { 370 block = udf_get_lb_pblock(dir->i_sb, eloc, offset); 371 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { 372 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) 373 epos.offset -= sizeof(short_ad); 374 else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) 375 epos.offset -= sizeof(long_ad); 376 } else { 377 offset = 0; 378 } 379 380 if (!(fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block))) { 381 brelse(epos.bh); 382 *err = -EIO; 383 return NULL; 384 } 385 386 block = UDF_I_LOCATION(dir).logicalBlockNum; 387 388 } else { 389 block = udf_get_lb_pblock(dir->i_sb, UDF_I_LOCATION(dir), 0); 390 fibh->sbh = fibh->ebh = NULL; 391 fibh->soffset = fibh->eoffset = sb->s_blocksize; 392 goto add; 393 } 394 395 while ((f_pos < size)) { 396 fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc, 397 &elen, &offset); 398 399 if (!fi) { 400 if (fibh->sbh != fibh->ebh) 401 brelse(fibh->ebh); 402 brelse(fibh->sbh); 403 brelse(epos.bh); 404 *err = -EIO; 405 return NULL; 406 } 407 408 liu = le16_to_cpu(cfi->lengthOfImpUse); 409 lfi = cfi->lengthFileIdent; 410 411 if (fibh->sbh == fibh->ebh) { 412 nameptr = fi->fileIdent + liu; 413 } else { 414 int poffset; /* Unpaded ending offset */ 415 416 poffset = fibh->soffset + sizeof(struct fileIdentDesc) + liu + lfi; 417 418 if (poffset >= lfi) { 419 nameptr = (char *)(fibh->ebh->b_data + poffset - lfi); 420 } else { 421 nameptr = fname; 422 memcpy(nameptr, fi->fileIdent + liu, lfi - poffset); 423 memcpy(nameptr + lfi - poffset, fibh->ebh->b_data, poffset); 424 } 425 } 426 427 if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) { 428 if (((sizeof(struct fileIdentDesc) + liu + lfi + 3) & ~3) == nfidlen) { 429 brelse(epos.bh); 430 cfi->descTag.tagSerialNum = cpu_to_le16(1); 431 cfi->fileVersionNum = cpu_to_le16(1); 432 cfi->fileCharacteristics = 0; 433 cfi->lengthFileIdent = namelen; 434 cfi->lengthOfImpUse = cpu_to_le16(0); 435 if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) { 436 return fi; 437 } else { 438 *err = -EIO; 439 return NULL; 440 } 441 } 442 } 443 444 if (!lfi || !dentry) 445 continue; 446 447 if ((flen = udf_get_filename(dir->i_sb, nameptr, fname, lfi)) && 448 udf_match(flen, fname, dentry->d_name.len, dentry->d_name.name)) { 449 if (fibh->sbh != fibh->ebh) 450 brelse(fibh->ebh); 451 brelse(fibh->sbh); 452 brelse(epos.bh); 453 *err = -EEXIST; 454 return NULL; 455 } 456 } 457 458 add: 459 f_pos += nfidlen; 460 461 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB && 462 sb->s_blocksize - fibh->eoffset < nfidlen) { 463 brelse(epos.bh); 464 epos.bh = NULL; 465 fibh->soffset -= udf_ext0_offset(dir); 466 fibh->eoffset -= udf_ext0_offset(dir); 467 f_pos -= (udf_ext0_offset(dir) >> 2); 468 if (fibh->sbh != fibh->ebh) 469 brelse(fibh->ebh); 470 brelse(fibh->sbh); 471 if (!(fibh->sbh = fibh->ebh = udf_expand_dir_adinicb(dir, &block, err))) 472 return NULL; 473 epos.block = UDF_I_LOCATION(dir); 474 eloc.logicalBlockNum = block; 475 eloc.partitionReferenceNum = UDF_I_LOCATION(dir).partitionReferenceNum; 476 elen = dir->i_sb->s_blocksize; 477 epos.offset = udf_file_entry_alloc_offset(dir); 478 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) 479 epos.offset += sizeof(short_ad); 480 else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) 481 epos.offset += sizeof(long_ad); 482 } 483 484 if (sb->s_blocksize - fibh->eoffset >= nfidlen) { 485 fibh->soffset = fibh->eoffset; 486 fibh->eoffset += nfidlen; 487 if (fibh->sbh != fibh->ebh) { 488 brelse(fibh->sbh); 489 fibh->sbh = fibh->ebh; 490 } 491 492 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 493 block = UDF_I_LOCATION(dir).logicalBlockNum; 494 fi = (struct fileIdentDesc *)(UDF_I_DATA(dir) + fibh->soffset - 495 udf_ext0_offset(dir) + 496 UDF_I_LENEATTR(dir)); 497 } else { 498 block = eloc.logicalBlockNum + ((elen - 1) >> 499 dir->i_sb->s_blocksize_bits); 500 fi = (struct fileIdentDesc *)(fibh->sbh->b_data + fibh->soffset); 501 } 502 } else { 503 fibh->soffset = fibh->eoffset - sb->s_blocksize; 504 fibh->eoffset += nfidlen - sb->s_blocksize; 505 if (fibh->sbh != fibh->ebh) { 506 brelse(fibh->sbh); 507 fibh->sbh = fibh->ebh; 508 } 509 510 block = eloc.logicalBlockNum + ((elen - 1) >> 511 dir->i_sb->s_blocksize_bits); 512 fibh->ebh = udf_bread(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 1, err); 513 if (!fibh->ebh) { 514 brelse(epos.bh); 515 brelse(fibh->sbh); 516 return NULL; 517 } 518 519 if (!fibh->soffset) { 520 if (udf_next_aext(dir, &epos, &eloc, &elen, 1) == 521 (EXT_RECORDED_ALLOCATED >> 30)) { 522 block = eloc.logicalBlockNum + ((elen - 1) >> 523 dir->i_sb->s_blocksize_bits); 524 } else { 525 block++; 526 } 527 528 brelse(fibh->sbh); 529 fibh->sbh = fibh->ebh; 530 fi = (struct fileIdentDesc *)(fibh->sbh->b_data); 531 } else { 532 fi = (struct fileIdentDesc *) 533 (fibh->sbh->b_data + sb->s_blocksize + fibh->soffset); 534 } 535 } 536 537 memset(cfi, 0, sizeof(struct fileIdentDesc)); 538 if (UDF_SB_UDFREV(sb) >= 0x0200) 539 udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block, sizeof(tag)); 540 else 541 udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block, sizeof(tag)); 542 cfi->fileVersionNum = cpu_to_le16(1); 543 cfi->lengthFileIdent = namelen; 544 cfi->lengthOfImpUse = cpu_to_le16(0); 545 if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) { 546 brelse(epos.bh); 547 dir->i_size += nfidlen; 548 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) 549 UDF_I_LENALLOC(dir) += nfidlen; 550 mark_inode_dirty(dir); 551 return fi; 552 } else { 553 brelse(epos.bh); 554 if (fibh->sbh != fibh->ebh) 555 brelse(fibh->ebh); 556 brelse(fibh->sbh); 557 *err = -EIO; 558 return NULL; 559 } 560 } 561 562 static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi, 563 struct udf_fileident_bh *fibh, 564 struct fileIdentDesc *cfi) 565 { 566 cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED; 567 568 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT)) 569 memset(&(cfi->icb), 0x00, sizeof(long_ad)); 570 571 return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL); 572 } 573 574 static int udf_create(struct inode *dir, struct dentry *dentry, int mode, 575 struct nameidata *nd) 576 { 577 struct udf_fileident_bh fibh; 578 struct inode *inode; 579 struct fileIdentDesc cfi, *fi; 580 int err; 581 582 lock_kernel(); 583 inode = udf_new_inode(dir, mode, &err); 584 if (!inode) { 585 unlock_kernel(); 586 return err; 587 } 588 589 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) 590 inode->i_data.a_ops = &udf_adinicb_aops; 591 else 592 inode->i_data.a_ops = &udf_aops; 593 inode->i_op = &udf_file_inode_operations; 594 inode->i_fop = &udf_file_operations; 595 inode->i_mode = mode; 596 mark_inode_dirty(inode); 597 598 if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) { 599 inode->i_nlink--; 600 mark_inode_dirty(inode); 601 iput(inode); 602 unlock_kernel(); 603 return err; 604 } 605 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 606 cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); 607 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 608 cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); 609 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 610 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 611 mark_inode_dirty(dir); 612 } 613 if (fibh.sbh != fibh.ebh) 614 brelse(fibh.ebh); 615 brelse(fibh.sbh); 616 unlock_kernel(); 617 d_instantiate(dentry, inode); 618 619 return 0; 620 } 621 622 static int udf_mknod(struct inode *dir, struct dentry *dentry, int mode, 623 dev_t rdev) 624 { 625 struct inode *inode; 626 struct udf_fileident_bh fibh; 627 struct fileIdentDesc cfi, *fi; 628 int err; 629 630 if (!old_valid_dev(rdev)) 631 return -EINVAL; 632 633 lock_kernel(); 634 err = -EIO; 635 inode = udf_new_inode(dir, mode, &err); 636 if (!inode) 637 goto out; 638 639 inode->i_uid = current->fsuid; 640 init_special_inode(inode, mode, rdev); 641 if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) { 642 inode->i_nlink--; 643 mark_inode_dirty(inode); 644 iput(inode); 645 unlock_kernel(); 646 return err; 647 } 648 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 649 cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); 650 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 651 cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); 652 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 653 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 654 mark_inode_dirty(dir); 655 } 656 mark_inode_dirty(inode); 657 658 if (fibh.sbh != fibh.ebh) 659 brelse(fibh.ebh); 660 brelse(fibh.sbh); 661 d_instantiate(dentry, inode); 662 err = 0; 663 664 out: 665 unlock_kernel(); 666 return err; 667 } 668 669 static int udf_mkdir(struct inode *dir, struct dentry *dentry, int mode) 670 { 671 struct inode *inode; 672 struct udf_fileident_bh fibh; 673 struct fileIdentDesc cfi, *fi; 674 int err; 675 676 lock_kernel(); 677 err = -EMLINK; 678 if (dir->i_nlink >= (256 << sizeof(dir->i_nlink)) - 1) 679 goto out; 680 681 err = -EIO; 682 inode = udf_new_inode(dir, S_IFDIR, &err); 683 if (!inode) 684 goto out; 685 686 inode->i_op = &udf_dir_inode_operations; 687 inode->i_fop = &udf_dir_operations; 688 if (!(fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err))) { 689 inode->i_nlink--; 690 mark_inode_dirty(inode); 691 iput(inode); 692 goto out; 693 } 694 inode->i_nlink = 2; 695 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 696 cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(dir)); 697 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 698 cpu_to_le32(UDF_I_UNIQUE(dir) & 0x00000000FFFFFFFFUL); 699 cfi.fileCharacteristics = FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT; 700 udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL); 701 brelse(fibh.sbh); 702 inode->i_mode = S_IFDIR | mode; 703 if (dir->i_mode & S_ISGID) 704 inode->i_mode |= S_ISGID; 705 mark_inode_dirty(inode); 706 707 if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) { 708 inode->i_nlink = 0; 709 mark_inode_dirty(inode); 710 iput(inode); 711 goto out; 712 } 713 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 714 cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); 715 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 716 cpu_to_le32(UDF_I_UNIQUE(inode) & 0x00000000FFFFFFFFUL); 717 cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY; 718 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 719 inc_nlink(dir); 720 mark_inode_dirty(dir); 721 d_instantiate(dentry, inode); 722 if (fibh.sbh != fibh.ebh) 723 brelse(fibh.ebh); 724 brelse(fibh.sbh); 725 err = 0; 726 727 out: 728 unlock_kernel(); 729 return err; 730 } 731 732 static int empty_dir(struct inode *dir) 733 { 734 struct fileIdentDesc *fi, cfi; 735 struct udf_fileident_bh fibh; 736 loff_t f_pos; 737 loff_t size = (udf_ext0_offset(dir) + dir->i_size) >> 2; 738 int block; 739 kernel_lb_addr eloc; 740 uint32_t elen; 741 sector_t offset; 742 struct extent_position epos = {}; 743 744 f_pos = (udf_ext0_offset(dir) >> 2); 745 746 fibh.soffset = fibh.eoffset = (f_pos & ((dir->i_sb->s_blocksize - 1) >> 2)) << 2; 747 748 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 749 fibh.sbh = fibh.ebh = NULL; 750 } else if (inode_bmap(dir, f_pos >> (dir->i_sb->s_blocksize_bits - 2), 751 &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30)) { 752 block = udf_get_lb_pblock(dir->i_sb, eloc, offset); 753 if ((++offset << dir->i_sb->s_blocksize_bits) < elen) { 754 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_SHORT) 755 epos.offset -= sizeof(short_ad); 756 else if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_LONG) 757 epos.offset -= sizeof(long_ad); 758 } else { 759 offset = 0; 760 } 761 762 if (!(fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block))) { 763 brelse(epos.bh); 764 return 0; 765 } 766 } else { 767 brelse(epos.bh); 768 return 0; 769 } 770 771 while ((f_pos < size)) { 772 fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc, 773 &elen, &offset); 774 if (!fi) { 775 if (fibh.sbh != fibh.ebh) 776 brelse(fibh.ebh); 777 brelse(fibh.sbh); 778 brelse(epos.bh); 779 return 0; 780 } 781 782 if (cfi.lengthFileIdent && 783 (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) { 784 if (fibh.sbh != fibh.ebh) 785 brelse(fibh.ebh); 786 brelse(fibh.sbh); 787 brelse(epos.bh); 788 return 0; 789 } 790 } 791 792 if (fibh.sbh != fibh.ebh) 793 brelse(fibh.ebh); 794 brelse(fibh.sbh); 795 brelse(epos.bh); 796 797 return 1; 798 } 799 800 static int udf_rmdir(struct inode *dir, struct dentry *dentry) 801 { 802 int retval; 803 struct inode *inode = dentry->d_inode; 804 struct udf_fileident_bh fibh; 805 struct fileIdentDesc *fi, cfi; 806 kernel_lb_addr tloc; 807 808 retval = -ENOENT; 809 lock_kernel(); 810 fi = udf_find_entry(dir, dentry, &fibh, &cfi); 811 if (!fi) 812 goto out; 813 814 retval = -EIO; 815 tloc = lelb_to_cpu(cfi.icb.extLocation); 816 if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino) 817 goto end_rmdir; 818 retval = -ENOTEMPTY; 819 if (!empty_dir(inode)) 820 goto end_rmdir; 821 retval = udf_delete_entry(dir, fi, &fibh, &cfi); 822 if (retval) 823 goto end_rmdir; 824 if (inode->i_nlink != 2) 825 udf_warning(inode->i_sb, "udf_rmdir", 826 "empty directory has nlink != 2 (%d)", 827 inode->i_nlink); 828 clear_nlink(inode); 829 inode->i_size = 0; 830 inode_dec_link_count(dir); 831 inode->i_ctime = dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); 832 mark_inode_dirty(dir); 833 834 end_rmdir: 835 if (fibh.sbh != fibh.ebh) 836 brelse(fibh.ebh); 837 brelse(fibh.sbh); 838 839 out: 840 unlock_kernel(); 841 return retval; 842 } 843 844 static int udf_unlink(struct inode *dir, struct dentry *dentry) 845 { 846 int retval; 847 struct inode *inode = dentry->d_inode; 848 struct udf_fileident_bh fibh; 849 struct fileIdentDesc *fi; 850 struct fileIdentDesc cfi; 851 kernel_lb_addr tloc; 852 853 retval = -ENOENT; 854 lock_kernel(); 855 fi = udf_find_entry(dir, dentry, &fibh, &cfi); 856 if (!fi) 857 goto out; 858 859 retval = -EIO; 860 tloc = lelb_to_cpu(cfi.icb.extLocation); 861 if (udf_get_lb_pblock(dir->i_sb, tloc, 0) != inode->i_ino) 862 goto end_unlink; 863 864 if (!inode->i_nlink) { 865 udf_debug("Deleting nonexistent file (%lu), %d\n", 866 inode->i_ino, inode->i_nlink); 867 inode->i_nlink = 1; 868 } 869 retval = udf_delete_entry(dir, fi, &fibh, &cfi); 870 if (retval) 871 goto end_unlink; 872 dir->i_ctime = dir->i_mtime = current_fs_time(dir->i_sb); 873 mark_inode_dirty(dir); 874 inode_dec_link_count(inode); 875 inode->i_ctime = dir->i_ctime; 876 retval = 0; 877 878 end_unlink: 879 if (fibh.sbh != fibh.ebh) 880 brelse(fibh.ebh); 881 brelse(fibh.sbh); 882 883 out: 884 unlock_kernel(); 885 return retval; 886 } 887 888 static int udf_symlink(struct inode *dir, struct dentry *dentry, 889 const char *symname) 890 { 891 struct inode *inode; 892 struct pathComponent *pc; 893 char *compstart; 894 struct udf_fileident_bh fibh; 895 struct extent_position epos = {}; 896 int eoffset, elen = 0; 897 struct fileIdentDesc *fi; 898 struct fileIdentDesc cfi; 899 char *ea; 900 int err; 901 int block; 902 char name[UDF_NAME_LEN]; 903 int namelen; 904 905 lock_kernel(); 906 if (!(inode = udf_new_inode(dir, S_IFLNK, &err))) 907 goto out; 908 909 inode->i_mode = S_IFLNK | S_IRWXUGO; 910 inode->i_data.a_ops = &udf_symlink_aops; 911 inode->i_op = &page_symlink_inode_operations; 912 913 if (UDF_I_ALLOCTYPE(inode) != ICBTAG_FLAG_AD_IN_ICB) { 914 kernel_lb_addr eloc; 915 uint32_t elen; 916 917 block = udf_new_block(inode->i_sb, inode, 918 UDF_I_LOCATION(inode).partitionReferenceNum, 919 UDF_I_LOCATION(inode).logicalBlockNum, &err); 920 if (!block) 921 goto out_no_entry; 922 epos.block = UDF_I_LOCATION(inode); 923 epos.offset = udf_file_entry_alloc_offset(inode); 924 epos.bh = NULL; 925 eloc.logicalBlockNum = block; 926 eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum; 927 elen = inode->i_sb->s_blocksize; 928 UDF_I_LENEXTENTS(inode) = elen; 929 udf_add_aext(inode, &epos, eloc, elen, 0); 930 brelse(epos.bh); 931 932 block = udf_get_pblock(inode->i_sb, block, 933 UDF_I_LOCATION(inode).partitionReferenceNum, 0); 934 epos.bh = udf_tread(inode->i_sb, block); 935 lock_buffer(epos.bh); 936 memset(epos.bh->b_data, 0x00, inode->i_sb->s_blocksize); 937 set_buffer_uptodate(epos.bh); 938 unlock_buffer(epos.bh); 939 mark_buffer_dirty_inode(epos.bh, inode); 940 ea = epos.bh->b_data + udf_ext0_offset(inode); 941 } else { 942 ea = UDF_I_DATA(inode) + UDF_I_LENEATTR(inode); 943 } 944 945 eoffset = inode->i_sb->s_blocksize - udf_ext0_offset(inode); 946 pc = (struct pathComponent *)ea; 947 948 if (*symname == '/') { 949 do { 950 symname++; 951 } while (*symname == '/'); 952 953 pc->componentType = 1; 954 pc->lengthComponentIdent = 0; 955 pc->componentFileVersionNum = 0; 956 pc += sizeof(struct pathComponent); 957 elen += sizeof(struct pathComponent); 958 } 959 960 err = -ENAMETOOLONG; 961 962 while (*symname) { 963 if (elen + sizeof(struct pathComponent) > eoffset) 964 goto out_no_entry; 965 966 pc = (struct pathComponent *)(ea + elen); 967 968 compstart = (char *)symname; 969 970 do { 971 symname++; 972 } while (*symname && *symname != '/'); 973 974 pc->componentType = 5; 975 pc->lengthComponentIdent = 0; 976 pc->componentFileVersionNum = 0; 977 if (compstart[0] == '.') { 978 if ((symname - compstart) == 1) 979 pc->componentType = 4; 980 else if ((symname - compstart) == 2 && compstart[1] == '.') 981 pc->componentType = 3; 982 } 983 984 if (pc->componentType == 5) { 985 namelen = udf_put_filename(inode->i_sb, compstart, name, 986 symname - compstart); 987 if (!namelen) 988 goto out_no_entry; 989 990 if (elen + sizeof(struct pathComponent) + namelen > eoffset) 991 goto out_no_entry; 992 else 993 pc->lengthComponentIdent = namelen; 994 995 memcpy(pc->componentIdent, name, namelen); 996 } 997 998 elen += sizeof(struct pathComponent) + pc->lengthComponentIdent; 999 1000 if (*symname) { 1001 do { 1002 symname++; 1003 } while (*symname == '/'); 1004 } 1005 } 1006 1007 brelse(epos.bh); 1008 inode->i_size = elen; 1009 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB) 1010 UDF_I_LENALLOC(inode) = inode->i_size; 1011 mark_inode_dirty(inode); 1012 1013 if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) 1014 goto out_no_entry; 1015 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 1016 cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); 1017 if (UDF_SB_LVIDBH(inode->i_sb)) { 1018 struct logicalVolHeaderDesc *lvhd; 1019 uint64_t uniqueID; 1020 lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse); 1021 uniqueID = le64_to_cpu(lvhd->uniqueID); 1022 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 1023 cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); 1024 if (!(++uniqueID & 0x00000000FFFFFFFFUL)) 1025 uniqueID += 16; 1026 lvhd->uniqueID = cpu_to_le64(uniqueID); 1027 mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb)); 1028 } 1029 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 1030 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 1031 mark_inode_dirty(dir); 1032 } 1033 if (fibh.sbh != fibh.ebh) 1034 brelse(fibh.ebh); 1035 brelse(fibh.sbh); 1036 d_instantiate(dentry, inode); 1037 err = 0; 1038 1039 out: 1040 unlock_kernel(); 1041 return err; 1042 1043 out_no_entry: 1044 inode_dec_link_count(inode); 1045 iput(inode); 1046 goto out; 1047 } 1048 1049 static int udf_link(struct dentry *old_dentry, struct inode *dir, 1050 struct dentry *dentry) 1051 { 1052 struct inode *inode = old_dentry->d_inode; 1053 struct udf_fileident_bh fibh; 1054 struct fileIdentDesc cfi, *fi; 1055 int err; 1056 1057 lock_kernel(); 1058 if (inode->i_nlink >= (256 << sizeof(inode->i_nlink)) - 1) { 1059 unlock_kernel(); 1060 return -EMLINK; 1061 } 1062 1063 if (!(fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err))) { 1064 unlock_kernel(); 1065 return err; 1066 } 1067 cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize); 1068 cfi.icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(inode)); 1069 if (UDF_SB_LVIDBH(inode->i_sb)) { 1070 struct logicalVolHeaderDesc *lvhd; 1071 uint64_t uniqueID; 1072 lvhd = (struct logicalVolHeaderDesc *)(UDF_SB_LVID(inode->i_sb)->logicalVolContentsUse); 1073 uniqueID = le64_to_cpu(lvhd->uniqueID); 1074 *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse = 1075 cpu_to_le32(uniqueID & 0x00000000FFFFFFFFUL); 1076 if (!(++uniqueID & 0x00000000FFFFFFFFUL)) 1077 uniqueID += 16; 1078 lvhd->uniqueID = cpu_to_le64(uniqueID); 1079 mark_buffer_dirty(UDF_SB_LVIDBH(inode->i_sb)); 1080 } 1081 udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL); 1082 if (UDF_I_ALLOCTYPE(dir) == ICBTAG_FLAG_AD_IN_ICB) { 1083 mark_inode_dirty(dir); 1084 } 1085 1086 if (fibh.sbh != fibh.ebh) 1087 brelse(fibh.ebh); 1088 brelse(fibh.sbh); 1089 inc_nlink(inode); 1090 inode->i_ctime = current_fs_time(inode->i_sb); 1091 mark_inode_dirty(inode); 1092 atomic_inc(&inode->i_count); 1093 d_instantiate(dentry, inode); 1094 unlock_kernel(); 1095 1096 return 0; 1097 } 1098 1099 /* Anybody can rename anything with this: the permission checks are left to the 1100 * higher-level routines. 1101 */ 1102 static int udf_rename(struct inode *old_dir, struct dentry *old_dentry, 1103 struct inode *new_dir, struct dentry *new_dentry) 1104 { 1105 struct inode *old_inode = old_dentry->d_inode; 1106 struct inode *new_inode = new_dentry->d_inode; 1107 struct udf_fileident_bh ofibh, nfibh; 1108 struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = NULL, ocfi, ncfi; 1109 struct buffer_head *dir_bh = NULL; 1110 int retval = -ENOENT; 1111 kernel_lb_addr tloc; 1112 1113 lock_kernel(); 1114 if ((ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi))) { 1115 if (ofibh.sbh != ofibh.ebh) 1116 brelse(ofibh.ebh); 1117 brelse(ofibh.sbh); 1118 } 1119 tloc = lelb_to_cpu(ocfi.icb.extLocation); 1120 if (!ofi || udf_get_lb_pblock(old_dir->i_sb, tloc, 0) 1121 != old_inode->i_ino) 1122 goto end_rename; 1123 1124 nfi = udf_find_entry(new_dir, new_dentry, &nfibh, &ncfi); 1125 if (nfi) { 1126 if (!new_inode) { 1127 if (nfibh.sbh != nfibh.ebh) 1128 brelse(nfibh.ebh); 1129 brelse(nfibh.sbh); 1130 nfi = NULL; 1131 } 1132 } 1133 if (S_ISDIR(old_inode->i_mode)) { 1134 uint32_t offset = udf_ext0_offset(old_inode); 1135 1136 if (new_inode) { 1137 retval = -ENOTEMPTY; 1138 if (!empty_dir(new_inode)) 1139 goto end_rename; 1140 } 1141 retval = -EIO; 1142 if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) { 1143 dir_fi = udf_get_fileident(UDF_I_DATA(old_inode) - 1144 (UDF_I_EFE(old_inode) ? 1145 sizeof(struct extendedFileEntry) : 1146 sizeof(struct fileEntry)), 1147 old_inode->i_sb->s_blocksize, &offset); 1148 } else { 1149 dir_bh = udf_bread(old_inode, 0, 0, &retval); 1150 if (!dir_bh) 1151 goto end_rename; 1152 dir_fi = udf_get_fileident(dir_bh->b_data, old_inode->i_sb->s_blocksize, &offset); 1153 } 1154 if (!dir_fi) 1155 goto end_rename; 1156 tloc = lelb_to_cpu(dir_fi->icb.extLocation); 1157 if (udf_get_lb_pblock(old_inode->i_sb, tloc, 0) != old_dir->i_ino) 1158 goto end_rename; 1159 1160 retval = -EMLINK; 1161 if (!new_inode && new_dir->i_nlink >= (256 << sizeof(new_dir->i_nlink)) - 1) 1162 goto end_rename; 1163 } 1164 if (!nfi) { 1165 nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi, &retval); 1166 if (!nfi) 1167 goto end_rename; 1168 } 1169 1170 /* 1171 * Like most other Unix systems, set the ctime for inodes on a 1172 * rename. 1173 */ 1174 old_inode->i_ctime = current_fs_time(old_inode->i_sb); 1175 mark_inode_dirty(old_inode); 1176 1177 /* 1178 * ok, that's it 1179 */ 1180 ncfi.fileVersionNum = ocfi.fileVersionNum; 1181 ncfi.fileCharacteristics = ocfi.fileCharacteristics; 1182 memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(long_ad)); 1183 udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL); 1184 1185 /* The old fid may have moved - find it again */ 1186 ofi = udf_find_entry(old_dir, old_dentry, &ofibh, &ocfi); 1187 udf_delete_entry(old_dir, ofi, &ofibh, &ocfi); 1188 1189 if (new_inode) { 1190 new_inode->i_ctime = current_fs_time(new_inode->i_sb); 1191 inode_dec_link_count(new_inode); 1192 } 1193 old_dir->i_ctime = old_dir->i_mtime = current_fs_time(old_dir->i_sb); 1194 mark_inode_dirty(old_dir); 1195 1196 if (dir_fi) { 1197 dir_fi->icb.extLocation = cpu_to_lelb(UDF_I_LOCATION(new_dir)); 1198 udf_update_tag((char *)dir_fi, (sizeof(struct fileIdentDesc) + 1199 le16_to_cpu(dir_fi->lengthOfImpUse) + 3) & ~3); 1200 if (UDF_I_ALLOCTYPE(old_inode) == ICBTAG_FLAG_AD_IN_ICB) { 1201 mark_inode_dirty(old_inode); 1202 } else { 1203 mark_buffer_dirty_inode(dir_bh, old_inode); 1204 } 1205 inode_dec_link_count(old_dir); 1206 if (new_inode) { 1207 inode_dec_link_count(new_inode); 1208 } else { 1209 inc_nlink(new_dir); 1210 mark_inode_dirty(new_dir); 1211 } 1212 } 1213 1214 if (ofi) { 1215 if (ofibh.sbh != ofibh.ebh) 1216 brelse(ofibh.ebh); 1217 brelse(ofibh.sbh); 1218 } 1219 1220 retval = 0; 1221 1222 end_rename: 1223 brelse(dir_bh); 1224 if (nfi) { 1225 if (nfibh.sbh != nfibh.ebh) 1226 brelse(nfibh.ebh); 1227 brelse(nfibh.sbh); 1228 } 1229 unlock_kernel(); 1230 1231 return retval; 1232 } 1233 1234 const struct inode_operations udf_dir_inode_operations = { 1235 .lookup = udf_lookup, 1236 .create = udf_create, 1237 .link = udf_link, 1238 .unlink = udf_unlink, 1239 .symlink = udf_symlink, 1240 .mkdir = udf_mkdir, 1241 .rmdir = udf_rmdir, 1242 .mknod = udf_mknod, 1243 .rename = udf_rename, 1244 }; 1245