5 * Inode name handling routines for the OSTA-UDF(tm) filesystem.
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.
13 * (C) 1998-2004 Ben Fennema
14 * (C) 1999-2000 Stelias Computing Inc
18 * 12/12/98 blf Created. Split out the lookup code from dir.c
19 * 04/19/99 blf link, mknod, symlink support
26 #include <linux/string.h>
27 #include <linux/errno.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>
35 static inline int udf_match(int len1
, const char *name1
, int len2
,
41 return !memcmp(name1
, name2
, len1
);
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
)
48 uint16_t crclen
= fibh
->eoffset
- fibh
->soffset
- sizeof(tag
);
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
);
59 if (UDF_I_ALLOCTYPE(inode
) == ICBTAG_FLAG_AD_IN_ICB
)
62 offset
= fibh
->soffset
+ sizeof(struct fileIdentDesc
);
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
);
70 memcpy((uint8_t *)sfi
->impUse
, impuse
, -offset
);
71 memcpy(fibh
->ebh
->b_data
, impuse
- offset
, liu
+ offset
);
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
);
83 memcpy((uint8_t *)sfi
->fileIdent
+ liu
, fileident
, -offset
);
84 memcpy(fibh
->ebh
->b_data
, fileident
- offset
, lfi
+ offset
);
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
);
95 memset((uint8_t *)sfi
->padding
+ liu
+ lfi
, 0x00, -offset
);
96 memset(fibh
->ebh
->b_data
, 0x00, padlen
+ offset
);
99 crc
= udf_crc((uint8_t *)cfi
+ sizeof(tag
),
100 sizeof(struct fileIdentDesc
) - sizeof(tag
), 0);
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
);
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
);
114 cfi
->descTag
.descCRC
= cpu_to_le16(crc
);
115 cfi
->descTag
.descCRCLength
= cpu_to_le16(crclen
);
117 for (i
= 0; i
< 16; i
++) {
119 checksum
+= ((uint8_t *)&cfi
->descTag
)[i
];
122 cfi
->descTag
.tagChecksum
= checksum
;
123 if (adinicb
|| (sizeof(struct fileIdentDesc
) <= -fibh
->soffset
)) {
124 memcpy((uint8_t *)sfi
, (uint8_t *)cfi
, sizeof(struct fileIdentDesc
));
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
);
132 mark_inode_dirty(inode
);
134 if (fibh
->sbh
!= fibh
->ebh
)
135 mark_buffer_dirty_inode(fibh
->ebh
, inode
);
136 mark_buffer_dirty_inode(fibh
->sbh
, inode
);
141 static struct fileIdentDesc
*udf_find_entry(struct inode
*dir
,
142 struct dentry
*dentry
,
143 struct udf_fileident_bh
*fibh
,
144 struct fileIdentDesc
*cfi
)
146 struct fileIdentDesc
*fi
= NULL
;
149 char fname
[UDF_NAME_LEN
];
157 struct extent_position epos
= {};
159 size
= (udf_ext0_offset(dir
) + dir
->i_size
) >> 2;
160 f_pos
= (udf_ext0_offset(dir
) >> 2);
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
);
177 if (!(fibh
->sbh
= fibh
->ebh
= udf_tread(dir
->i_sb
, block
))) {
186 while ((f_pos
< size
)) {
187 fi
= udf_fileident_read(dir
, &f_pos
, fibh
, cfi
, &epos
, &eloc
,
190 if (fibh
->sbh
!= fibh
->ebh
)
197 liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
198 lfi
= cfi
->lengthFileIdent
;
200 if (fibh
->sbh
== fibh
->ebh
) {
201 nameptr
= fi
->fileIdent
+ liu
;
203 int poffset
; /* Unpaded ending offset */
205 poffset
= fibh
->soffset
+ sizeof(struct fileIdentDesc
) + liu
+ lfi
;
207 if (poffset
>= lfi
) {
208 nameptr
= (uint8_t *)(fibh
->ebh
->b_data
+ poffset
- lfi
);
211 memcpy(nameptr
, fi
->fileIdent
+ liu
, lfi
- poffset
);
212 memcpy(nameptr
+ lfi
- poffset
, fibh
->ebh
->b_data
, poffset
);
216 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_DELETED
) != 0) {
217 if (!UDF_QUERY_FLAG(dir
->i_sb
, UDF_FLAG_UNDELETE
))
221 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_HIDDEN
) != 0) {
222 if (!UDF_QUERY_FLAG(dir
->i_sb
, UDF_FLAG_UNHIDE
))
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
)) {
237 if (fibh
->sbh
!= fibh
->ebh
)
249 * Look-up the inode for a given name.
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.
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.
262 * Refer to lookup_dentry() in fs/namei.c
263 * lookup_dentry() -> lookup() -> real_lookup() -> .
266 * dir Pointer to inode of parent directory.
267 * dentry Pointer to dentry to complete.
268 * nd Pointer to lookup nameidata
271 * <return> Zero on success.
274 * July 1, 1997 - Andrew E. Mileski
275 * Written, tested, and released.
278 static struct dentry
*udf_lookup(struct inode
*dir
, struct dentry
*dentry
,
279 struct nameidata
*nd
)
281 struct inode
*inode
= NULL
;
282 struct fileIdentDesc cfi
;
283 struct udf_fileident_bh fibh
;
285 if (dentry
->d_name
.len
> UDF_NAME_LEN
- 2)
286 return ERR_PTR(-ENAMETOOLONG
);
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,
297 inode
= udf_iget(dir
->i_sb
, lb
);
300 return ERR_PTR(-EACCES
);
304 #endif /* UDF_RECOVERY */
306 if (udf_find_entry(dir
, dentry
, &fibh
, &cfi
)) {
307 if (fibh
.sbh
!= fibh
.ebh
)
311 inode
= udf_iget(dir
->i_sb
, lelb_to_cpu(cfi
.icb
.extLocation
));
314 return ERR_PTR(-EACCES
);
318 d_add(dentry
, inode
);
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
)
328 struct super_block
*sb
;
329 struct fileIdentDesc
*fi
= NULL
;
330 char name
[UDF_NAME_LEN
], fname
[UDF_NAME_LEN
];
335 loff_t size
= (udf_ext0_offset(dir
) + dir
->i_size
) >> 2;
343 struct extent_position epos
= {};
348 if (!dentry
->d_name
.len
) {
352 if (!(namelen
= udf_put_filename(sb
, dentry
->d_name
.name
, name
,
353 dentry
->d_name
.len
))) {
354 *err
= -ENAMETOOLONG
;
361 nfidlen
= (sizeof(struct fileIdentDesc
) + namelen
+ 3) & ~3;
363 f_pos
= (udf_ext0_offset(dir
) >> 2);
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
);
380 if (!(fibh
->sbh
= fibh
->ebh
= udf_tread(dir
->i_sb
, block
))) {
386 block
= UDF_I_LOCATION(dir
).logicalBlockNum
;
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
;
395 while ((f_pos
< size
)) {
396 fi
= udf_fileident_read(dir
, &f_pos
, fibh
, cfi
, &epos
, &eloc
,
400 if (fibh
->sbh
!= fibh
->ebh
)
408 liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
409 lfi
= cfi
->lengthFileIdent
;
411 if (fibh
->sbh
== fibh
->ebh
) {
412 nameptr
= fi
->fileIdent
+ liu
;
414 int poffset
; /* Unpaded ending offset */
416 poffset
= fibh
->soffset
+ sizeof(struct fileIdentDesc
) + liu
+ lfi
;
418 if (poffset
>= lfi
) {
419 nameptr
= (char *)(fibh
->ebh
->b_data
+ poffset
- lfi
);
422 memcpy(nameptr
, fi
->fileIdent
+ liu
, lfi
- poffset
);
423 memcpy(nameptr
+ lfi
- poffset
, fibh
->ebh
->b_data
, poffset
);
427 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_DELETED
) != 0) {
428 if (((sizeof(struct fileIdentDesc
) + liu
+ lfi
+ 3) & ~3) == nfidlen
) {
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
)) {
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
)
461 if (UDF_I_ALLOCTYPE(dir
) == ICBTAG_FLAG_AD_IN_ICB
&&
462 sb
->s_blocksize
- fibh
->eoffset
< nfidlen
) {
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
)
471 if (!(fibh
->sbh
= fibh
->ebh
= udf_expand_dir_adinicb(dir
, &block
, err
)))
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
);
484 if (sb
->s_blocksize
- fibh
->eoffset
>= nfidlen
) {
485 fibh
->soffset
= fibh
->eoffset
;
486 fibh
->eoffset
+= nfidlen
;
487 if (fibh
->sbh
!= fibh
->ebh
) {
489 fibh
->sbh
= fibh
->ebh
;
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
));
498 block
= eloc
.logicalBlockNum
+ ((elen
- 1) >>
499 dir
->i_sb
->s_blocksize_bits
);
500 fi
= (struct fileIdentDesc
*)(fibh
->sbh
->b_data
+ fibh
->soffset
);
503 fibh
->soffset
= fibh
->eoffset
- sb
->s_blocksize
;
504 fibh
->eoffset
+= nfidlen
- sb
->s_blocksize
;
505 if (fibh
->sbh
!= fibh
->ebh
) {
507 fibh
->sbh
= fibh
->ebh
;
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
);
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
);
529 fibh
->sbh
= fibh
->ebh
;
530 fi
= (struct fileIdentDesc
*)(fibh
->sbh
->b_data
);
532 fi
= (struct fileIdentDesc
*)
533 (fibh
->sbh
->b_data
+ sb
->s_blocksize
+ fibh
->soffset
);
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
));
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
)) {
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
);
554 if (fibh
->sbh
!= fibh
->ebh
)
562 static int udf_delete_entry(struct inode
*inode
, struct fileIdentDesc
*fi
,
563 struct udf_fileident_bh
*fibh
,
564 struct fileIdentDesc
*cfi
)
566 cfi
->fileCharacteristics
|= FID_FILE_CHAR_DELETED
;
568 if (UDF_QUERY_FLAG(inode
->i_sb
, UDF_FLAG_STRICT
))
569 memset(&(cfi
->icb
), 0x00, sizeof(long_ad
));
571 return udf_write_fi(inode
, cfi
, fi
, fibh
, NULL
, NULL
);
574 static int udf_create(struct inode
*dir
, struct dentry
*dentry
, int mode
,
575 struct nameidata
*nd
)
577 struct udf_fileident_bh fibh
;
579 struct fileIdentDesc cfi
, *fi
;
583 inode
= udf_new_inode(dir
, mode
, &err
);
589 if (UDF_I_ALLOCTYPE(inode
) == ICBTAG_FLAG_AD_IN_ICB
)
590 inode
->i_data
.a_ops
= &udf_adinicb_aops
;
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
);
598 if (!(fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
))) {
600 mark_inode_dirty(inode
);
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
);
613 if (fibh
.sbh
!= fibh
.ebh
)
617 d_instantiate(dentry
, inode
);
622 static int udf_mknod(struct inode
*dir
, struct dentry
*dentry
, int mode
,
626 struct udf_fileident_bh fibh
;
627 struct fileIdentDesc cfi
, *fi
;
630 if (!old_valid_dev(rdev
))
635 inode
= udf_new_inode(dir
, mode
, &err
);
639 inode
->i_uid
= current
->fsuid
;
640 init_special_inode(inode
, mode
, rdev
);
641 if (!(fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
))) {
643 mark_inode_dirty(inode
);
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
);
656 mark_inode_dirty(inode
);
658 if (fibh
.sbh
!= fibh
.ebh
)
661 d_instantiate(dentry
, inode
);
669 static int udf_mkdir(struct inode
*dir
, struct dentry
*dentry
, int mode
)
672 struct udf_fileident_bh fibh
;
673 struct fileIdentDesc cfi
, *fi
;
678 if (dir
->i_nlink
>= (256 << sizeof(dir
->i_nlink
)) - 1)
682 inode
= udf_new_inode(dir
, S_IFDIR
, &err
);
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
))) {
690 mark_inode_dirty(inode
);
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
);
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
);
707 if (!(fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
))) {
709 mark_inode_dirty(inode
);
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
);
720 mark_inode_dirty(dir
);
721 d_instantiate(dentry
, inode
);
722 if (fibh
.sbh
!= fibh
.ebh
)
732 static int empty_dir(struct inode
*dir
)
734 struct fileIdentDesc
*fi
, cfi
;
735 struct udf_fileident_bh fibh
;
737 loff_t size
= (udf_ext0_offset(dir
) + dir
->i_size
) >> 2;
742 struct extent_position epos
= {};
744 f_pos
= (udf_ext0_offset(dir
) >> 2);
746 fibh
.soffset
= fibh
.eoffset
= (f_pos
& ((dir
->i_sb
->s_blocksize
- 1) >> 2)) << 2;
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
);
762 if (!(fibh
.sbh
= fibh
.ebh
= udf_tread(dir
->i_sb
, block
))) {
771 while ((f_pos
< size
)) {
772 fi
= udf_fileident_read(dir
, &f_pos
, &fibh
, &cfi
, &epos
, &eloc
,
775 if (fibh
.sbh
!= fibh
.ebh
)
782 if (cfi
.lengthFileIdent
&&
783 (cfi
.fileCharacteristics
& FID_FILE_CHAR_DELETED
) == 0) {
784 if (fibh
.sbh
!= fibh
.ebh
)
792 if (fibh
.sbh
!= fibh
.ebh
)
800 static int udf_rmdir(struct inode
*dir
, struct dentry
*dentry
)
803 struct inode
*inode
= dentry
->d_inode
;
804 struct udf_fileident_bh fibh
;
805 struct fileIdentDesc
*fi
, cfi
;
810 fi
= udf_find_entry(dir
, dentry
, &fibh
, &cfi
);
815 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
816 if (udf_get_lb_pblock(dir
->i_sb
, tloc
, 0) != inode
->i_ino
)
819 if (!empty_dir(inode
))
821 retval
= udf_delete_entry(dir
, fi
, &fibh
, &cfi
);
824 if (inode
->i_nlink
!= 2)
825 udf_warning(inode
->i_sb
, "udf_rmdir",
826 "empty directory has nlink != 2 (%d)",
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
);
835 if (fibh
.sbh
!= fibh
.ebh
)
844 static int udf_unlink(struct inode
*dir
, struct dentry
*dentry
)
847 struct inode
*inode
= dentry
->d_inode
;
848 struct udf_fileident_bh fibh
;
849 struct fileIdentDesc
*fi
;
850 struct fileIdentDesc cfi
;
855 fi
= udf_find_entry(dir
, dentry
, &fibh
, &cfi
);
860 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
861 if (udf_get_lb_pblock(dir
->i_sb
, tloc
, 0) != inode
->i_ino
)
864 if (!inode
->i_nlink
) {
865 udf_debug("Deleting nonexistent file (%lu), %d\n",
866 inode
->i_ino
, inode
->i_nlink
);
869 retval
= udf_delete_entry(dir
, fi
, &fibh
, &cfi
);
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
;
879 if (fibh
.sbh
!= fibh
.ebh
)
888 static int udf_symlink(struct inode
*dir
, struct dentry
*dentry
,
892 struct pathComponent
*pc
;
894 struct udf_fileident_bh fibh
;
895 struct extent_position epos
= {};
896 int eoffset
, elen
= 0;
897 struct fileIdentDesc
*fi
;
898 struct fileIdentDesc cfi
;
902 char name
[UDF_NAME_LEN
];
906 if (!(inode
= udf_new_inode(dir
, S_IFLNK
, &err
)))
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
;
913 if (UDF_I_ALLOCTYPE(inode
) != ICBTAG_FLAG_AD_IN_ICB
) {
917 block
= udf_new_block(inode
->i_sb
, inode
,
918 UDF_I_LOCATION(inode
).partitionReferenceNum
,
919 UDF_I_LOCATION(inode
).logicalBlockNum
, &err
);
922 epos
.block
= UDF_I_LOCATION(inode
);
923 epos
.offset
= udf_file_entry_alloc_offset(inode
);
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);
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
);
942 ea
= UDF_I_DATA(inode
) + UDF_I_LENEATTR(inode
);
945 eoffset
= inode
->i_sb
->s_blocksize
- udf_ext0_offset(inode
);
946 pc
= (struct pathComponent
*)ea
;
948 if (*symname
== '/') {
951 } while (*symname
== '/');
953 pc
->componentType
= 1;
954 pc
->lengthComponentIdent
= 0;
955 pc
->componentFileVersionNum
= 0;
956 pc
+= sizeof(struct pathComponent
);
957 elen
+= sizeof(struct pathComponent
);
963 if (elen
+ sizeof(struct pathComponent
) > eoffset
)
966 pc
= (struct pathComponent
*)(ea
+ elen
);
968 compstart
= (char *)symname
;
972 } while (*symname
&& *symname
!= '/');
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;
984 if (pc
->componentType
== 5) {
985 namelen
= udf_put_filename(inode
->i_sb
, compstart
, name
,
986 symname
- compstart
);
990 if (elen
+ sizeof(struct pathComponent
) + namelen
> eoffset
)
993 pc
->lengthComponentIdent
= namelen
;
995 memcpy(pc
->componentIdent
, name
, namelen
);
998 elen
+= sizeof(struct pathComponent
) + pc
->lengthComponentIdent
;
1003 } while (*symname
== '/');
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
);
1013 if (!(fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
)))
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
;
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
))
1026 lvhd
->uniqueID
= cpu_to_le64(uniqueID
);
1027 mark_buffer_dirty(UDF_SB_LVIDBH(inode
->i_sb
));
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
);
1033 if (fibh
.sbh
!= fibh
.ebh
)
1036 d_instantiate(dentry
, inode
);
1044 inode_dec_link_count(inode
);
1049 static int udf_link(struct dentry
*old_dentry
, struct inode
*dir
,
1050 struct dentry
*dentry
)
1052 struct inode
*inode
= old_dentry
->d_inode
;
1053 struct udf_fileident_bh fibh
;
1054 struct fileIdentDesc cfi
, *fi
;
1058 if (inode
->i_nlink
>= (256 << sizeof(inode
->i_nlink
)) - 1) {
1063 if (!(fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
))) {
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
;
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
))
1078 lvhd
->uniqueID
= cpu_to_le64(uniqueID
);
1079 mark_buffer_dirty(UDF_SB_LVIDBH(inode
->i_sb
));
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
);
1086 if (fibh
.sbh
!= fibh
.ebh
)
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
);
1099 /* Anybody can rename anything with this: the permission checks are left to the
1100 * higher-level routines.
1102 static int udf_rename(struct inode
*old_dir
, struct dentry
*old_dentry
,
1103 struct inode
*new_dir
, struct dentry
*new_dentry
)
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
;
1114 if ((ofi
= udf_find_entry(old_dir
, old_dentry
, &ofibh
, &ocfi
))) {
1115 if (ofibh
.sbh
!= ofibh
.ebh
)
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
)
1124 nfi
= udf_find_entry(new_dir
, new_dentry
, &nfibh
, &ncfi
);
1127 if (nfibh
.sbh
!= nfibh
.ebh
)
1133 if (S_ISDIR(old_inode
->i_mode
)) {
1134 uint32_t offset
= udf_ext0_offset(old_inode
);
1137 retval
= -ENOTEMPTY
;
1138 if (!empty_dir(new_inode
))
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
);
1149 dir_bh
= udf_bread(old_inode
, 0, 0, &retval
);
1152 dir_fi
= udf_get_fileident(dir_bh
->b_data
, old_inode
->i_sb
->s_blocksize
, &offset
);
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
)
1161 if (!new_inode
&& new_dir
->i_nlink
>= (256 << sizeof(new_dir
->i_nlink
)) - 1)
1165 nfi
= udf_add_entry(new_dir
, new_dentry
, &nfibh
, &ncfi
, &retval
);
1171 * Like most other Unix systems, set the ctime for inodes on a
1174 old_inode
->i_ctime
= current_fs_time(old_inode
->i_sb
);
1175 mark_inode_dirty(old_inode
);
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
);
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
);
1190 new_inode
->i_ctime
= current_fs_time(new_inode
->i_sb
);
1191 inode_dec_link_count(new_inode
);
1193 old_dir
->i_ctime
= old_dir
->i_mtime
= current_fs_time(old_dir
->i_sb
);
1194 mark_inode_dirty(old_dir
);
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
);
1203 mark_buffer_dirty_inode(dir_bh
, old_inode
);
1205 inode_dec_link_count(old_dir
);
1207 inode_dec_link_count(new_inode
);
1210 mark_inode_dirty(new_dir
);
1215 if (ofibh
.sbh
!= ofibh
.ebh
)
1225 if (nfibh
.sbh
!= nfibh
.ebh
)
1234 const struct inode_operations udf_dir_inode_operations
= {
1235 .lookup
= udf_lookup
,
1236 .create
= udf_create
,
1238 .unlink
= udf_unlink
,
1239 .symlink
= udf_symlink
,
1243 .rename
= udf_rename
,