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/buffer_head.h>
31 #include <linux/sched.h>
32 #include <linux/crc-itu-t.h>
33 #include <linux/exportfs.h>
35 static inline int udf_match(int len1
, const unsigned char *name1
, int len2
,
36 const unsigned char *name2
)
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(struct tag
);
51 uint16_t liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
52 uint8_t lfi
= cfi
->lengthFileIdent
;
53 int padlen
= fibh
->eoffset
- fibh
->soffset
- liu
- lfi
-
54 sizeof(struct fileIdentDesc
);
57 if (UDF_I(inode
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
60 offset
= fibh
->soffset
+ sizeof(struct fileIdentDesc
);
63 if (adinicb
|| (offset
+ liu
< 0)) {
64 memcpy((uint8_t *)sfi
->impUse
, impuse
, liu
);
65 } else if (offset
>= 0) {
66 memcpy(fibh
->ebh
->b_data
+ offset
, impuse
, liu
);
68 memcpy((uint8_t *)sfi
->impUse
, impuse
, -offset
);
69 memcpy(fibh
->ebh
->b_data
, impuse
- offset
,
77 if (adinicb
|| (offset
+ lfi
< 0)) {
78 memcpy((uint8_t *)sfi
->fileIdent
+ liu
, fileident
, lfi
);
79 } else if (offset
>= 0) {
80 memcpy(fibh
->ebh
->b_data
+ offset
, fileident
, lfi
);
82 memcpy((uint8_t *)sfi
->fileIdent
+ liu
, fileident
,
84 memcpy(fibh
->ebh
->b_data
, fileident
- offset
,
91 if (adinicb
|| (offset
+ padlen
< 0)) {
92 memset((uint8_t *)sfi
->padding
+ liu
+ lfi
, 0x00, padlen
);
93 } else if (offset
>= 0) {
94 memset(fibh
->ebh
->b_data
+ offset
, 0x00, padlen
);
96 memset((uint8_t *)sfi
->padding
+ liu
+ lfi
, 0x00, -offset
);
97 memset(fibh
->ebh
->b_data
, 0x00, padlen
+ offset
);
100 crc
= crc_itu_t(0, (uint8_t *)cfi
+ sizeof(struct tag
),
101 sizeof(struct fileIdentDesc
) - sizeof(struct tag
));
103 if (fibh
->sbh
== fibh
->ebh
) {
104 crc
= crc_itu_t(crc
, (uint8_t *)sfi
->impUse
,
105 crclen
+ sizeof(struct tag
) -
106 sizeof(struct fileIdentDesc
));
107 } else if (sizeof(struct fileIdentDesc
) >= -fibh
->soffset
) {
108 crc
= crc_itu_t(crc
, fibh
->ebh
->b_data
+
109 sizeof(struct fileIdentDesc
) +
111 crclen
+ sizeof(struct tag
) -
112 sizeof(struct fileIdentDesc
));
114 crc
= crc_itu_t(crc
, (uint8_t *)sfi
->impUse
,
115 -fibh
->soffset
- sizeof(struct fileIdentDesc
));
116 crc
= crc_itu_t(crc
, fibh
->ebh
->b_data
, fibh
->eoffset
);
119 cfi
->descTag
.descCRC
= cpu_to_le16(crc
);
120 cfi
->descTag
.descCRCLength
= cpu_to_le16(crclen
);
121 cfi
->descTag
.tagChecksum
= udf_tag_checksum(&cfi
->descTag
);
123 if (adinicb
|| (sizeof(struct fileIdentDesc
) <= -fibh
->soffset
)) {
124 memcpy((uint8_t *)sfi
, (uint8_t *)cfi
,
125 sizeof(struct fileIdentDesc
));
127 memcpy((uint8_t *)sfi
, (uint8_t *)cfi
, -fibh
->soffset
);
128 memcpy(fibh
->ebh
->b_data
, (uint8_t *)cfi
- fibh
->soffset
,
129 sizeof(struct fileIdentDesc
) + fibh
->soffset
);
133 mark_inode_dirty(inode
);
135 if (fibh
->sbh
!= fibh
->ebh
)
136 mark_buffer_dirty_inode(fibh
->ebh
, inode
);
137 mark_buffer_dirty_inode(fibh
->sbh
, inode
);
142 static struct fileIdentDesc
*udf_find_entry(struct inode
*dir
,
143 const struct qstr
*child
,
144 struct udf_fileident_bh
*fibh
,
145 struct fileIdentDesc
*cfi
)
147 struct fileIdentDesc
*fi
= NULL
;
150 unsigned char *fname
= NULL
;
151 unsigned char *nameptr
;
155 struct kernel_lb_addr eloc
;
158 struct extent_position epos
= {};
159 struct udf_inode_info
*dinfo
= UDF_I(dir
);
160 int isdotdot
= child
->len
== 2 &&
161 child
->name
[0] == '.' && child
->name
[1] == '.';
163 size
= udf_ext0_offset(dir
) + dir
->i_size
;
164 f_pos
= udf_ext0_offset(dir
);
166 fibh
->sbh
= fibh
->ebh
= NULL
;
167 fibh
->soffset
= fibh
->eoffset
= f_pos
& (dir
->i_sb
->s_blocksize
- 1);
168 if (dinfo
->i_alloc_type
!= ICBTAG_FLAG_AD_IN_ICB
) {
169 if (inode_bmap(dir
, f_pos
>> dir
->i_sb
->s_blocksize_bits
, &epos
,
170 &eloc
, &elen
, &offset
) != (EXT_RECORDED_ALLOCATED
>> 30))
172 block
= udf_get_lb_pblock(dir
->i_sb
, &eloc
, offset
);
173 if ((++offset
<< dir
->i_sb
->s_blocksize_bits
) < elen
) {
174 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
175 epos
.offset
-= sizeof(struct short_ad
);
176 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
177 epos
.offset
-= sizeof(struct long_ad
);
181 fibh
->sbh
= fibh
->ebh
= udf_tread(dir
->i_sb
, block
);
186 fname
= kmalloc(UDF_NAME_LEN
, GFP_NOFS
);
190 while (f_pos
< size
) {
191 fi
= udf_fileident_read(dir
, &f_pos
, fibh
, cfi
, &epos
, &eloc
,
196 liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
197 lfi
= cfi
->lengthFileIdent
;
199 if (fibh
->sbh
== fibh
->ebh
) {
200 nameptr
= fi
->fileIdent
+ liu
;
202 int poffset
; /* Unpaded ending offset */
204 poffset
= fibh
->soffset
+ sizeof(struct fileIdentDesc
) +
208 nameptr
= (uint8_t *)(fibh
->ebh
->b_data
+
212 memcpy(nameptr
, fi
->fileIdent
+ liu
,
214 memcpy(nameptr
+ lfi
- poffset
,
215 fibh
->ebh
->b_data
, poffset
);
219 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_DELETED
) != 0) {
220 if (!UDF_QUERY_FLAG(dir
->i_sb
, UDF_FLAG_UNDELETE
))
224 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_HIDDEN
) != 0) {
225 if (!UDF_QUERY_FLAG(dir
->i_sb
, UDF_FLAG_UNHIDE
))
229 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_PARENT
) &&
236 flen
= udf_get_filename(dir
->i_sb
, nameptr
, fname
, lfi
);
237 if (flen
&& udf_match(flen
, fname
, child
->len
, child
->name
))
243 if (fibh
->sbh
!= fibh
->ebh
)
253 static struct dentry
*udf_lookup(struct inode
*dir
, struct dentry
*dentry
,
256 struct inode
*inode
= NULL
;
257 struct fileIdentDesc cfi
;
258 struct udf_fileident_bh fibh
;
260 if (dentry
->d_name
.len
> UDF_NAME_LEN
- 2)
261 return ERR_PTR(-ENAMETOOLONG
);
264 /* temporary shorthand for specifying files by inode number */
265 if (!strncmp(dentry
->d_name
.name
, ".B=", 3)) {
266 struct kernel_lb_addr lb
= {
267 .logicalBlockNum
= 0,
268 .partitionReferenceNum
=
269 simple_strtoul(dentry
->d_name
.name
+ 3,
272 inode
= udf_iget(dir
->i_sb
, lb
);
274 return ERR_PTR(-EACCES
);
277 #endif /* UDF_RECOVERY */
279 if (udf_find_entry(dir
, &dentry
->d_name
, &fibh
, &cfi
)) {
280 struct kernel_lb_addr loc
;
282 if (fibh
.sbh
!= fibh
.ebh
)
286 loc
= lelb_to_cpu(cfi
.icb
.extLocation
);
287 inode
= udf_iget(dir
->i_sb
, &loc
);
289 return ERR_PTR(-EACCES
);
293 return d_splice_alias(inode
, dentry
);
296 static struct fileIdentDesc
*udf_add_entry(struct inode
*dir
,
297 struct dentry
*dentry
,
298 struct udf_fileident_bh
*fibh
,
299 struct fileIdentDesc
*cfi
, int *err
)
301 struct super_block
*sb
= dir
->i_sb
;
302 struct fileIdentDesc
*fi
= NULL
;
303 unsigned char *name
= NULL
;
306 loff_t size
= udf_ext0_offset(dir
) + dir
->i_size
;
311 struct kernel_lb_addr eloc
;
314 struct extent_position epos
= {};
315 struct udf_inode_info
*dinfo
;
317 fibh
->sbh
= fibh
->ebh
= NULL
;
318 name
= kmalloc(UDF_NAME_LEN
, GFP_NOFS
);
325 if (!dentry
->d_name
.len
) {
329 namelen
= udf_put_filename(sb
, dentry
->d_name
.name
, name
,
332 *err
= -ENAMETOOLONG
;
339 nfidlen
= (sizeof(struct fileIdentDesc
) + namelen
+ 3) & ~3;
341 f_pos
= udf_ext0_offset(dir
);
343 fibh
->soffset
= fibh
->eoffset
= f_pos
& (dir
->i_sb
->s_blocksize
- 1);
345 if (dinfo
->i_alloc_type
!= ICBTAG_FLAG_AD_IN_ICB
) {
346 if (inode_bmap(dir
, f_pos
>> dir
->i_sb
->s_blocksize_bits
, &epos
,
347 &eloc
, &elen
, &offset
) != (EXT_RECORDED_ALLOCATED
>> 30)) {
348 block
= udf_get_lb_pblock(dir
->i_sb
,
349 &dinfo
->i_location
, 0);
350 fibh
->soffset
= fibh
->eoffset
= sb
->s_blocksize
;
353 block
= udf_get_lb_pblock(dir
->i_sb
, &eloc
, offset
);
354 if ((++offset
<< dir
->i_sb
->s_blocksize_bits
) < elen
) {
355 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
356 epos
.offset
-= sizeof(struct short_ad
);
357 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
358 epos
.offset
-= sizeof(struct long_ad
);
362 fibh
->sbh
= fibh
->ebh
= udf_tread(dir
->i_sb
, block
);
368 block
= dinfo
->i_location
.logicalBlockNum
;
371 while (f_pos
< size
) {
372 fi
= udf_fileident_read(dir
, &f_pos
, fibh
, cfi
, &epos
, &eloc
,
380 liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
381 lfi
= cfi
->lengthFileIdent
;
383 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_DELETED
) != 0) {
384 if (((sizeof(struct fileIdentDesc
) +
385 liu
+ lfi
+ 3) & ~3) == nfidlen
) {
386 cfi
->descTag
.tagSerialNum
= cpu_to_le16(1);
387 cfi
->fileVersionNum
= cpu_to_le16(1);
388 cfi
->fileCharacteristics
= 0;
389 cfi
->lengthFileIdent
= namelen
;
390 cfi
->lengthOfImpUse
= cpu_to_le16(0);
391 if (!udf_write_fi(dir
, cfi
, fi
, fibh
, NULL
,
405 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
&&
406 sb
->s_blocksize
- fibh
->eoffset
< nfidlen
) {
409 fibh
->soffset
-= udf_ext0_offset(dir
);
410 fibh
->eoffset
-= udf_ext0_offset(dir
);
411 f_pos
-= udf_ext0_offset(dir
);
412 if (fibh
->sbh
!= fibh
->ebh
)
415 fibh
->sbh
= fibh
->ebh
=
416 udf_expand_dir_adinicb(dir
, &block
, err
);
419 epos
.block
= dinfo
->i_location
;
420 epos
.offset
= udf_file_entry_alloc_offset(dir
);
421 /* Load extent udf_expand_dir_adinicb() has created */
422 udf_current_aext(dir
, &epos
, &eloc
, &elen
, 1);
425 /* Entry fits into current block? */
426 if (sb
->s_blocksize
- fibh
->eoffset
>= nfidlen
) {
427 fibh
->soffset
= fibh
->eoffset
;
428 fibh
->eoffset
+= nfidlen
;
429 if (fibh
->sbh
!= fibh
->ebh
) {
431 fibh
->sbh
= fibh
->ebh
;
434 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
) {
435 block
= dinfo
->i_location
.logicalBlockNum
;
436 fi
= (struct fileIdentDesc
*)
437 (dinfo
->i_ext
.i_data
+
439 udf_ext0_offset(dir
) +
442 block
= eloc
.logicalBlockNum
+
444 dir
->i_sb
->s_blocksize_bits
);
445 fi
= (struct fileIdentDesc
*)
446 (fibh
->sbh
->b_data
+ fibh
->soffset
);
449 /* Round up last extent in the file */
450 elen
= (elen
+ sb
->s_blocksize
- 1) & ~(sb
->s_blocksize
- 1);
451 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
452 epos
.offset
-= sizeof(struct short_ad
);
453 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
454 epos
.offset
-= sizeof(struct long_ad
);
455 udf_write_aext(dir
, &epos
, &eloc
, elen
, 1);
456 dinfo
->i_lenExtents
= (dinfo
->i_lenExtents
+ sb
->s_blocksize
457 - 1) & ~(sb
->s_blocksize
- 1);
459 fibh
->soffset
= fibh
->eoffset
- sb
->s_blocksize
;
460 fibh
->eoffset
+= nfidlen
- sb
->s_blocksize
;
461 if (fibh
->sbh
!= fibh
->ebh
) {
463 fibh
->sbh
= fibh
->ebh
;
466 block
= eloc
.logicalBlockNum
+ ((elen
- 1) >>
467 dir
->i_sb
->s_blocksize_bits
);
468 fibh
->ebh
= udf_bread(dir
,
469 f_pos
>> dir
->i_sb
->s_blocksize_bits
, 1, err
);
472 /* Extents could have been merged, invalidate our position */
475 epos
.block
= dinfo
->i_location
;
476 epos
.offset
= udf_file_entry_alloc_offset(dir
);
478 if (!fibh
->soffset
) {
479 /* Find the freshly allocated block */
480 while (udf_next_aext(dir
, &epos
, &eloc
, &elen
, 1) ==
481 (EXT_RECORDED_ALLOCATED
>> 30))
483 block
= eloc
.logicalBlockNum
+ ((elen
- 1) >>
484 dir
->i_sb
->s_blocksize_bits
);
486 fibh
->sbh
= fibh
->ebh
;
487 fi
= (struct fileIdentDesc
*)(fibh
->sbh
->b_data
);
489 fi
= (struct fileIdentDesc
*)
490 (fibh
->sbh
->b_data
+ sb
->s_blocksize
+
495 memset(cfi
, 0, sizeof(struct fileIdentDesc
));
496 if (UDF_SB(sb
)->s_udfrev
>= 0x0200)
497 udf_new_tag((char *)cfi
, TAG_IDENT_FID
, 3, 1, block
,
500 udf_new_tag((char *)cfi
, TAG_IDENT_FID
, 2, 1, block
,
502 cfi
->fileVersionNum
= cpu_to_le16(1);
503 cfi
->lengthFileIdent
= namelen
;
504 cfi
->lengthOfImpUse
= cpu_to_le16(0);
505 if (!udf_write_fi(dir
, cfi
, fi
, fibh
, NULL
, name
)) {
506 dir
->i_size
+= nfidlen
;
507 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
508 dinfo
->i_lenAlloc
+= nfidlen
;
510 /* Find the last extent and truncate it to proper size */
511 while (udf_next_aext(dir
, &epos
, &eloc
, &elen
, 1) ==
512 (EXT_RECORDED_ALLOCATED
>> 30))
514 elen
-= dinfo
->i_lenExtents
- dir
->i_size
;
515 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
516 epos
.offset
-= sizeof(struct short_ad
);
517 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
518 epos
.offset
-= sizeof(struct long_ad
);
519 udf_write_aext(dir
, &epos
, &eloc
, elen
, 1);
520 dinfo
->i_lenExtents
= dir
->i_size
;
523 mark_inode_dirty(dir
);
532 if (fibh
->sbh
!= fibh
->ebh
)
541 static int udf_delete_entry(struct inode
*inode
, struct fileIdentDesc
*fi
,
542 struct udf_fileident_bh
*fibh
,
543 struct fileIdentDesc
*cfi
)
545 cfi
->fileCharacteristics
|= FID_FILE_CHAR_DELETED
;
547 if (UDF_QUERY_FLAG(inode
->i_sb
, UDF_FLAG_STRICT
))
548 memset(&(cfi
->icb
), 0x00, sizeof(struct long_ad
));
550 return udf_write_fi(inode
, cfi
, fi
, fibh
, NULL
, NULL
);
553 static int udf_create(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
,
556 struct udf_fileident_bh fibh
;
558 struct fileIdentDesc cfi
, *fi
;
560 struct udf_inode_info
*iinfo
;
562 inode
= udf_new_inode(dir
, mode
, &err
);
567 iinfo
= UDF_I(inode
);
568 if (iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
569 inode
->i_data
.a_ops
= &udf_adinicb_aops
;
571 inode
->i_data
.a_ops
= &udf_aops
;
572 inode
->i_op
= &udf_file_inode_operations
;
573 inode
->i_fop
= &udf_file_operations
;
574 mark_inode_dirty(inode
);
576 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
578 inode_dec_link_count(inode
);
582 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
583 cfi
.icb
.extLocation
= cpu_to_lelb(iinfo
->i_location
);
584 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
585 cpu_to_le32(iinfo
->i_unique
& 0x00000000FFFFFFFFUL
);
586 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
587 if (UDF_I(dir
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
588 mark_inode_dirty(dir
);
589 if (fibh
.sbh
!= fibh
.ebh
)
592 d_instantiate(dentry
, inode
);
597 static int udf_tmpfile(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
)
600 struct udf_inode_info
*iinfo
;
603 inode
= udf_new_inode(dir
, mode
, &err
);
607 iinfo
= UDF_I(inode
);
608 if (iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
609 inode
->i_data
.a_ops
= &udf_adinicb_aops
;
611 inode
->i_data
.a_ops
= &udf_aops
;
612 inode
->i_op
= &udf_file_inode_operations
;
613 inode
->i_fop
= &udf_file_operations
;
614 mark_inode_dirty(inode
);
616 d_tmpfile(dentry
, inode
);
620 static int udf_mknod(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
,
624 struct udf_fileident_bh fibh
;
625 struct fileIdentDesc cfi
, *fi
;
627 struct udf_inode_info
*iinfo
;
629 if (!old_valid_dev(rdev
))
633 inode
= udf_new_inode(dir
, mode
, &err
);
637 iinfo
= UDF_I(inode
);
638 init_special_inode(inode
, mode
, rdev
);
639 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
641 inode_dec_link_count(inode
);
645 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
646 cfi
.icb
.extLocation
= cpu_to_lelb(iinfo
->i_location
);
647 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
648 cpu_to_le32(iinfo
->i_unique
& 0x00000000FFFFFFFFUL
);
649 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
650 if (UDF_I(dir
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
651 mark_inode_dirty(dir
);
652 mark_inode_dirty(inode
);
654 if (fibh
.sbh
!= fibh
.ebh
)
657 d_instantiate(dentry
, inode
);
664 static int udf_mkdir(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
)
667 struct udf_fileident_bh fibh
;
668 struct fileIdentDesc cfi
, *fi
;
670 struct udf_inode_info
*dinfo
= UDF_I(dir
);
671 struct udf_inode_info
*iinfo
;
674 inode
= udf_new_inode(dir
, S_IFDIR
| mode
, &err
);
678 iinfo
= UDF_I(inode
);
679 inode
->i_op
= &udf_dir_inode_operations
;
680 inode
->i_fop
= &udf_dir_operations
;
681 fi
= udf_add_entry(inode
, NULL
, &fibh
, &cfi
, &err
);
683 inode_dec_link_count(inode
);
688 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
689 cfi
.icb
.extLocation
= cpu_to_lelb(dinfo
->i_location
);
690 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
691 cpu_to_le32(dinfo
->i_unique
& 0x00000000FFFFFFFFUL
);
692 cfi
.fileCharacteristics
=
693 FID_FILE_CHAR_DIRECTORY
| FID_FILE_CHAR_PARENT
;
694 udf_write_fi(inode
, &cfi
, fi
, &fibh
, NULL
, NULL
);
696 mark_inode_dirty(inode
);
698 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
701 mark_inode_dirty(inode
);
705 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
706 cfi
.icb
.extLocation
= cpu_to_lelb(iinfo
->i_location
);
707 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
708 cpu_to_le32(iinfo
->i_unique
& 0x00000000FFFFFFFFUL
);
709 cfi
.fileCharacteristics
|= FID_FILE_CHAR_DIRECTORY
;
710 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
712 mark_inode_dirty(dir
);
713 d_instantiate(dentry
, inode
);
714 if (fibh
.sbh
!= fibh
.ebh
)
723 static int empty_dir(struct inode
*dir
)
725 struct fileIdentDesc
*fi
, cfi
;
726 struct udf_fileident_bh fibh
;
728 loff_t size
= udf_ext0_offset(dir
) + dir
->i_size
;
730 struct kernel_lb_addr eloc
;
733 struct extent_position epos
= {};
734 struct udf_inode_info
*dinfo
= UDF_I(dir
);
736 f_pos
= udf_ext0_offset(dir
);
737 fibh
.soffset
= fibh
.eoffset
= f_pos
& (dir
->i_sb
->s_blocksize
- 1);
739 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
740 fibh
.sbh
= fibh
.ebh
= NULL
;
741 else if (inode_bmap(dir
, f_pos
>> dir
->i_sb
->s_blocksize_bits
,
742 &epos
, &eloc
, &elen
, &offset
) ==
743 (EXT_RECORDED_ALLOCATED
>> 30)) {
744 block
= udf_get_lb_pblock(dir
->i_sb
, &eloc
, offset
);
745 if ((++offset
<< dir
->i_sb
->s_blocksize_bits
) < elen
) {
746 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
747 epos
.offset
-= sizeof(struct short_ad
);
748 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
749 epos
.offset
-= sizeof(struct long_ad
);
753 fibh
.sbh
= fibh
.ebh
= udf_tread(dir
->i_sb
, block
);
763 while (f_pos
< size
) {
764 fi
= udf_fileident_read(dir
, &f_pos
, &fibh
, &cfi
, &epos
, &eloc
,
767 if (fibh
.sbh
!= fibh
.ebh
)
774 if (cfi
.lengthFileIdent
&&
775 (cfi
.fileCharacteristics
& FID_FILE_CHAR_DELETED
) == 0) {
776 if (fibh
.sbh
!= fibh
.ebh
)
784 if (fibh
.sbh
!= fibh
.ebh
)
792 static int udf_rmdir(struct inode
*dir
, struct dentry
*dentry
)
795 struct inode
*inode
= dentry
->d_inode
;
796 struct udf_fileident_bh fibh
;
797 struct fileIdentDesc
*fi
, cfi
;
798 struct kernel_lb_addr tloc
;
801 fi
= udf_find_entry(dir
, &dentry
->d_name
, &fibh
, &cfi
);
806 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
807 if (udf_get_lb_pblock(dir
->i_sb
, &tloc
, 0) != inode
->i_ino
)
810 if (!empty_dir(inode
))
812 retval
= udf_delete_entry(dir
, fi
, &fibh
, &cfi
);
815 if (inode
->i_nlink
!= 2)
816 udf_warn(inode
->i_sb
, "empty directory has nlink != 2 (%d)\n",
820 inode_dec_link_count(dir
);
821 inode
->i_ctime
= dir
->i_ctime
= dir
->i_mtime
=
822 current_fs_time(dir
->i_sb
);
823 mark_inode_dirty(dir
);
826 if (fibh
.sbh
!= fibh
.ebh
)
834 static int udf_unlink(struct inode
*dir
, struct dentry
*dentry
)
837 struct inode
*inode
= dentry
->d_inode
;
838 struct udf_fileident_bh fibh
;
839 struct fileIdentDesc
*fi
;
840 struct fileIdentDesc cfi
;
841 struct kernel_lb_addr tloc
;
844 fi
= udf_find_entry(dir
, &dentry
->d_name
, &fibh
, &cfi
);
849 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
850 if (udf_get_lb_pblock(dir
->i_sb
, &tloc
, 0) != inode
->i_ino
)
853 if (!inode
->i_nlink
) {
854 udf_debug("Deleting nonexistent file (%lu), %d\n",
855 inode
->i_ino
, inode
->i_nlink
);
858 retval
= udf_delete_entry(dir
, fi
, &fibh
, &cfi
);
861 dir
->i_ctime
= dir
->i_mtime
= current_fs_time(dir
->i_sb
);
862 mark_inode_dirty(dir
);
863 inode_dec_link_count(inode
);
864 inode
->i_ctime
= dir
->i_ctime
;
868 if (fibh
.sbh
!= fibh
.ebh
)
876 static int udf_symlink(struct inode
*dir
, struct dentry
*dentry
,
880 struct pathComponent
*pc
;
881 const char *compstart
;
882 struct udf_fileident_bh fibh
;
883 struct extent_position epos
= {};
884 int eoffset
, elen
= 0;
885 struct fileIdentDesc
*fi
;
886 struct fileIdentDesc cfi
;
890 unsigned char *name
= NULL
;
892 struct udf_inode_info
*iinfo
;
893 struct super_block
*sb
= dir
->i_sb
;
895 inode
= udf_new_inode(dir
, S_IFLNK
| S_IRWXUGO
, &err
);
899 iinfo
= UDF_I(inode
);
900 down_write(&iinfo
->i_data_sem
);
901 name
= kmalloc(UDF_NAME_LEN
, GFP_NOFS
);
907 inode
->i_data
.a_ops
= &udf_symlink_aops
;
908 inode
->i_op
= &udf_symlink_inode_operations
;
910 if (iinfo
->i_alloc_type
!= ICBTAG_FLAG_AD_IN_ICB
) {
911 struct kernel_lb_addr eloc
;
914 block
= udf_new_block(sb
, inode
,
915 iinfo
->i_location
.partitionReferenceNum
,
916 iinfo
->i_location
.logicalBlockNum
, &err
);
919 epos
.block
= iinfo
->i_location
;
920 epos
.offset
= udf_file_entry_alloc_offset(inode
);
922 eloc
.logicalBlockNum
= block
;
923 eloc
.partitionReferenceNum
=
924 iinfo
->i_location
.partitionReferenceNum
;
925 bsize
= sb
->s_blocksize
;
926 iinfo
->i_lenExtents
= bsize
;
927 udf_add_aext(inode
, &epos
, &eloc
, bsize
, 0);
930 block
= udf_get_pblock(sb
, block
,
931 iinfo
->i_location
.partitionReferenceNum
,
933 epos
.bh
= udf_tgetblk(sb
, block
);
934 lock_buffer(epos
.bh
);
935 memset(epos
.bh
->b_data
, 0x00, bsize
);
936 set_buffer_uptodate(epos
.bh
);
937 unlock_buffer(epos
.bh
);
938 mark_buffer_dirty_inode(epos
.bh
, inode
);
939 ea
= epos
.bh
->b_data
+ udf_ext0_offset(inode
);
941 ea
= iinfo
->i_ext
.i_data
+ iinfo
->i_lenEAttr
;
943 eoffset
= sb
->s_blocksize
- udf_ext0_offset(inode
);
944 pc
= (struct pathComponent
*)ea
;
946 if (*symname
== '/') {
949 } while (*symname
== '/');
951 pc
->componentType
= 1;
952 pc
->lengthComponentIdent
= 0;
953 pc
->componentFileVersionNum
= 0;
954 elen
+= sizeof(struct pathComponent
);
960 if (elen
+ sizeof(struct pathComponent
) > eoffset
)
963 pc
= (struct pathComponent
*)(ea
+ elen
);
969 } while (*symname
&& *symname
!= '/');
971 pc
->componentType
= 5;
972 pc
->lengthComponentIdent
= 0;
973 pc
->componentFileVersionNum
= 0;
974 if (compstart
[0] == '.') {
975 if ((symname
- compstart
) == 1)
976 pc
->componentType
= 4;
977 else if ((symname
- compstart
) == 2 &&
979 pc
->componentType
= 3;
982 if (pc
->componentType
== 5) {
983 namelen
= udf_put_filename(sb
, compstart
, name
,
984 symname
- compstart
);
988 if (elen
+ sizeof(struct pathComponent
) + namelen
>
992 pc
->lengthComponentIdent
= namelen
;
994 memcpy(pc
->componentIdent
, name
, namelen
);
997 elen
+= sizeof(struct pathComponent
) + pc
->lengthComponentIdent
;
1002 } while (*symname
== '/');
1007 inode
->i_size
= elen
;
1008 if (iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
1009 iinfo
->i_lenAlloc
= inode
->i_size
;
1011 udf_truncate_tail_extent(inode
);
1012 mark_inode_dirty(inode
);
1014 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
1017 cfi
.icb
.extLength
= cpu_to_le32(sb
->s_blocksize
);
1018 cfi
.icb
.extLocation
= cpu_to_lelb(iinfo
->i_location
);
1019 if (UDF_SB(inode
->i_sb
)->s_lvid_bh
) {
1020 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
1021 cpu_to_le32(lvid_get_unique_id(sb
));
1023 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
1024 if (UDF_I(dir
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
1025 mark_inode_dirty(dir
);
1026 up_write(&iinfo
->i_data_sem
);
1027 if (fibh
.sbh
!= fibh
.ebh
)
1030 d_instantiate(dentry
, inode
);
1038 up_write(&iinfo
->i_data_sem
);
1039 inode_dec_link_count(inode
);
1044 static int udf_link(struct dentry
*old_dentry
, struct inode
*dir
,
1045 struct dentry
*dentry
)
1047 struct inode
*inode
= old_dentry
->d_inode
;
1048 struct udf_fileident_bh fibh
;
1049 struct fileIdentDesc cfi
, *fi
;
1052 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
1056 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
1057 cfi
.icb
.extLocation
= cpu_to_lelb(UDF_I(inode
)->i_location
);
1058 if (UDF_SB(inode
->i_sb
)->s_lvid_bh
) {
1059 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
1060 cpu_to_le32(lvid_get_unique_id(inode
->i_sb
));
1062 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
1063 if (UDF_I(dir
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
1064 mark_inode_dirty(dir
);
1066 if (fibh
.sbh
!= fibh
.ebh
)
1070 inode
->i_ctime
= current_fs_time(inode
->i_sb
);
1071 mark_inode_dirty(inode
);
1073 d_instantiate(dentry
, inode
);
1078 /* Anybody can rename anything with this: the permission checks are left to the
1079 * higher-level routines.
1081 static int udf_rename(struct inode
*old_dir
, struct dentry
*old_dentry
,
1082 struct inode
*new_dir
, struct dentry
*new_dentry
)
1084 struct inode
*old_inode
= old_dentry
->d_inode
;
1085 struct inode
*new_inode
= new_dentry
->d_inode
;
1086 struct udf_fileident_bh ofibh
, nfibh
;
1087 struct fileIdentDesc
*ofi
= NULL
, *nfi
= NULL
, *dir_fi
= NULL
;
1088 struct fileIdentDesc ocfi
, ncfi
;
1089 struct buffer_head
*dir_bh
= NULL
;
1090 int retval
= -ENOENT
;
1091 struct kernel_lb_addr tloc
;
1092 struct udf_inode_info
*old_iinfo
= UDF_I(old_inode
);
1094 ofi
= udf_find_entry(old_dir
, &old_dentry
->d_name
, &ofibh
, &ocfi
);
1096 if (ofibh
.sbh
!= ofibh
.ebh
)
1100 tloc
= lelb_to_cpu(ocfi
.icb
.extLocation
);
1101 if (!ofi
|| udf_get_lb_pblock(old_dir
->i_sb
, &tloc
, 0)
1102 != old_inode
->i_ino
)
1105 nfi
= udf_find_entry(new_dir
, &new_dentry
->d_name
, &nfibh
, &ncfi
);
1108 if (nfibh
.sbh
!= nfibh
.ebh
)
1114 if (S_ISDIR(old_inode
->i_mode
)) {
1115 int offset
= udf_ext0_offset(old_inode
);
1118 retval
= -ENOTEMPTY
;
1119 if (!empty_dir(new_inode
))
1123 if (old_iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
) {
1124 dir_fi
= udf_get_fileident(
1125 old_iinfo
->i_ext
.i_data
-
1127 sizeof(struct extendedFileEntry
) :
1128 sizeof(struct fileEntry
)),
1129 old_inode
->i_sb
->s_blocksize
, &offset
);
1131 dir_bh
= udf_bread(old_inode
, 0, 0, &retval
);
1134 dir_fi
= udf_get_fileident(dir_bh
->b_data
,
1135 old_inode
->i_sb
->s_blocksize
, &offset
);
1139 tloc
= lelb_to_cpu(dir_fi
->icb
.extLocation
);
1140 if (udf_get_lb_pblock(old_inode
->i_sb
, &tloc
, 0) !=
1145 nfi
= udf_add_entry(new_dir
, new_dentry
, &nfibh
, &ncfi
,
1152 * Like most other Unix systems, set the ctime for inodes on a
1155 old_inode
->i_ctime
= current_fs_time(old_inode
->i_sb
);
1156 mark_inode_dirty(old_inode
);
1161 ncfi
.fileVersionNum
= ocfi
.fileVersionNum
;
1162 ncfi
.fileCharacteristics
= ocfi
.fileCharacteristics
;
1163 memcpy(&(ncfi
.icb
), &(ocfi
.icb
), sizeof(struct long_ad
));
1164 udf_write_fi(new_dir
, &ncfi
, nfi
, &nfibh
, NULL
, NULL
);
1166 /* The old fid may have moved - find it again */
1167 ofi
= udf_find_entry(old_dir
, &old_dentry
->d_name
, &ofibh
, &ocfi
);
1168 udf_delete_entry(old_dir
, ofi
, &ofibh
, &ocfi
);
1171 new_inode
->i_ctime
= current_fs_time(new_inode
->i_sb
);
1172 inode_dec_link_count(new_inode
);
1174 old_dir
->i_ctime
= old_dir
->i_mtime
= current_fs_time(old_dir
->i_sb
);
1175 mark_inode_dirty(old_dir
);
1178 dir_fi
->icb
.extLocation
= cpu_to_lelb(UDF_I(new_dir
)->i_location
);
1179 udf_update_tag((char *)dir_fi
,
1180 (sizeof(struct fileIdentDesc
) +
1181 le16_to_cpu(dir_fi
->lengthOfImpUse
) + 3) & ~3);
1182 if (old_iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
1183 mark_inode_dirty(old_inode
);
1185 mark_buffer_dirty_inode(dir_bh
, old_inode
);
1187 inode_dec_link_count(old_dir
);
1189 inode_dec_link_count(new_inode
);
1192 mark_inode_dirty(new_dir
);
1197 if (ofibh
.sbh
!= ofibh
.ebh
)
1207 if (nfibh
.sbh
!= nfibh
.ebh
)
1215 static struct dentry
*udf_get_parent(struct dentry
*child
)
1217 struct kernel_lb_addr tloc
;
1218 struct inode
*inode
= NULL
;
1219 struct qstr dotdot
= QSTR_INIT("..", 2);
1220 struct fileIdentDesc cfi
;
1221 struct udf_fileident_bh fibh
;
1223 if (!udf_find_entry(child
->d_inode
, &dotdot
, &fibh
, &cfi
))
1226 if (fibh
.sbh
!= fibh
.ebh
)
1230 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
1231 inode
= udf_iget(child
->d_inode
->i_sb
, &tloc
);
1235 return d_obtain_alias(inode
);
1237 return ERR_PTR(-EACCES
);
1241 static struct dentry
*udf_nfs_get_inode(struct super_block
*sb
, u32 block
,
1242 u16 partref
, __u32 generation
)
1244 struct inode
*inode
;
1245 struct kernel_lb_addr loc
;
1248 return ERR_PTR(-ESTALE
);
1250 loc
.logicalBlockNum
= block
;
1251 loc
.partitionReferenceNum
= partref
;
1252 inode
= udf_iget(sb
, &loc
);
1255 return ERR_PTR(-ENOMEM
);
1257 if (generation
&& inode
->i_generation
!= generation
) {
1259 return ERR_PTR(-ESTALE
);
1261 return d_obtain_alias(inode
);
1264 static struct dentry
*udf_fh_to_dentry(struct super_block
*sb
,
1265 struct fid
*fid
, int fh_len
, int fh_type
)
1267 if ((fh_len
!= 3 && fh_len
!= 5) ||
1268 (fh_type
!= FILEID_UDF_WITH_PARENT
&&
1269 fh_type
!= FILEID_UDF_WITHOUT_PARENT
))
1272 return udf_nfs_get_inode(sb
, fid
->udf
.block
, fid
->udf
.partref
,
1273 fid
->udf
.generation
);
1276 static struct dentry
*udf_fh_to_parent(struct super_block
*sb
,
1277 struct fid
*fid
, int fh_len
, int fh_type
)
1279 if (fh_len
!= 5 || fh_type
!= FILEID_UDF_WITH_PARENT
)
1282 return udf_nfs_get_inode(sb
, fid
->udf
.parent_block
,
1283 fid
->udf
.parent_partref
,
1284 fid
->udf
.parent_generation
);
1286 static int udf_encode_fh(struct inode
*inode
, __u32
*fh
, int *lenp
,
1287 struct inode
*parent
)
1290 struct kernel_lb_addr location
= UDF_I(inode
)->i_location
;
1291 struct fid
*fid
= (struct fid
*)fh
;
1292 int type
= FILEID_UDF_WITHOUT_PARENT
;
1294 if (parent
&& (len
< 5)) {
1296 return FILEID_INVALID
;
1297 } else if (len
< 3) {
1299 return FILEID_INVALID
;
1303 fid
->udf
.block
= location
.logicalBlockNum
;
1304 fid
->udf
.partref
= location
.partitionReferenceNum
;
1305 fid
->udf
.parent_partref
= 0;
1306 fid
->udf
.generation
= inode
->i_generation
;
1309 location
= UDF_I(parent
)->i_location
;
1310 fid
->udf
.parent_block
= location
.logicalBlockNum
;
1311 fid
->udf
.parent_partref
= location
.partitionReferenceNum
;
1312 fid
->udf
.parent_generation
= inode
->i_generation
;
1314 type
= FILEID_UDF_WITH_PARENT
;
1320 const struct export_operations udf_export_ops
= {
1321 .encode_fh
= udf_encode_fh
,
1322 .fh_to_dentry
= udf_fh_to_dentry
,
1323 .fh_to_parent
= udf_fh_to_parent
,
1324 .get_parent
= udf_get_parent
,
1327 const struct inode_operations udf_dir_inode_operations
= {
1328 .lookup
= udf_lookup
,
1329 .create
= udf_create
,
1331 .unlink
= udf_unlink
,
1332 .symlink
= udf_symlink
,
1336 .rename
= udf_rename
,
1337 .tmpfile
= udf_tmpfile
,
1339 const struct inode_operations udf_symlink_inode_operations
= {
1340 .readlink
= generic_readlink
,
1341 .follow_link
= page_follow_link_light
,
1342 .put_link
= page_put_link
,