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/sched.h>
31 #include <linux/crc-itu-t.h>
32 #include <linux/exportfs.h>
34 static inline int udf_match(int len1
, const unsigned char *name1
, int len2
,
35 const unsigned char *name2
)
40 return !memcmp(name1
, name2
, len1
);
43 int udf_write_fi(struct inode
*inode
, struct fileIdentDesc
*cfi
,
44 struct fileIdentDesc
*sfi
, struct udf_fileident_bh
*fibh
,
45 uint8_t *impuse
, uint8_t *fileident
)
47 uint16_t crclen
= fibh
->eoffset
- fibh
->soffset
- sizeof(struct tag
);
50 uint16_t liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
51 uint8_t lfi
= cfi
->lengthFileIdent
;
52 int padlen
= fibh
->eoffset
- fibh
->soffset
- liu
- lfi
-
53 sizeof(struct fileIdentDesc
);
56 if (UDF_I(inode
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
59 offset
= fibh
->soffset
+ sizeof(struct fileIdentDesc
);
62 if (adinicb
|| (offset
+ liu
< 0)) {
63 memcpy((uint8_t *)sfi
->impUse
, impuse
, liu
);
64 } else if (offset
>= 0) {
65 memcpy(fibh
->ebh
->b_data
+ offset
, impuse
, liu
);
67 memcpy((uint8_t *)sfi
->impUse
, impuse
, -offset
);
68 memcpy(fibh
->ebh
->b_data
, impuse
- offset
,
76 if (adinicb
|| (offset
+ lfi
< 0)) {
77 memcpy((uint8_t *)sfi
->fileIdent
+ liu
, fileident
, lfi
);
78 } else if (offset
>= 0) {
79 memcpy(fibh
->ebh
->b_data
+ offset
, fileident
, lfi
);
81 memcpy((uint8_t *)sfi
->fileIdent
+ liu
, fileident
,
83 memcpy(fibh
->ebh
->b_data
, fileident
- 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
= crc_itu_t(0, (uint8_t *)cfi
+ sizeof(struct tag
),
100 sizeof(struct fileIdentDesc
) - sizeof(struct tag
));
102 if (fibh
->sbh
== fibh
->ebh
) {
103 crc
= crc_itu_t(crc
, (uint8_t *)sfi
->impUse
,
104 crclen
+ sizeof(struct tag
) -
105 sizeof(struct fileIdentDesc
));
106 } else if (sizeof(struct fileIdentDesc
) >= -fibh
->soffset
) {
107 crc
= crc_itu_t(crc
, fibh
->ebh
->b_data
+
108 sizeof(struct fileIdentDesc
) +
110 crclen
+ sizeof(struct tag
) -
111 sizeof(struct fileIdentDesc
));
113 crc
= crc_itu_t(crc
, (uint8_t *)sfi
->impUse
,
114 -fibh
->soffset
- sizeof(struct fileIdentDesc
));
115 crc
= crc_itu_t(crc
, fibh
->ebh
->b_data
, fibh
->eoffset
);
118 cfi
->descTag
.descCRC
= cpu_to_le16(crc
);
119 cfi
->descTag
.descCRCLength
= cpu_to_le16(crclen
);
120 cfi
->descTag
.tagChecksum
= udf_tag_checksum(&cfi
->descTag
);
122 if (adinicb
|| (sizeof(struct fileIdentDesc
) <= -fibh
->soffset
)) {
123 memcpy((uint8_t *)sfi
, (uint8_t *)cfi
,
124 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
);
142 * udf_find_entry - find entry in given directory.
144 * @dir: directory inode to search in
145 * @child: qstr of the name
146 * @fibh: buffer head / inode with file identifier descriptor we found
147 * @cfi: found file identifier descriptor with given name
149 * This function searches in the directory @dir for a file name @child. When
150 * found, @fibh points to the buffer head(s) (bh is NULL for in ICB
151 * directories) containing the file identifier descriptor (FID). In that case
152 * the function returns pointer to the FID in the buffer or inode - but note
153 * that FID may be split among two buffers (blocks) so accessing it via that
154 * pointer isn't easily possible. This pointer can be used only as an iterator
155 * for other directory manipulation functions. For inspection of the FID @cfi
156 * can be used - the found FID is copied there.
158 * Returns pointer to FID, NULL when nothing found, or error code.
160 static struct fileIdentDesc
*udf_find_entry(struct inode
*dir
,
161 const struct qstr
*child
,
162 struct udf_fileident_bh
*fibh
,
163 struct fileIdentDesc
*cfi
)
165 struct fileIdentDesc
*fi
= NULL
;
169 unsigned char *fname
= NULL
, *copy_name
= NULL
;
170 unsigned char *nameptr
;
174 struct kernel_lb_addr eloc
;
177 struct extent_position epos
= {};
178 struct udf_inode_info
*dinfo
= UDF_I(dir
);
179 int isdotdot
= child
->len
== 2 &&
180 child
->name
[0] == '.' && child
->name
[1] == '.';
181 struct super_block
*sb
= dir
->i_sb
;
183 size
= udf_ext0_offset(dir
) + dir
->i_size
;
184 f_pos
= udf_ext0_offset(dir
);
186 fibh
->sbh
= fibh
->ebh
= NULL
;
187 fibh
->soffset
= fibh
->eoffset
= f_pos
& (sb
->s_blocksize
- 1);
188 if (dinfo
->i_alloc_type
!= ICBTAG_FLAG_AD_IN_ICB
) {
189 if (inode_bmap(dir
, f_pos
>> sb
->s_blocksize_bits
, &epos
,
190 &eloc
, &elen
, &offset
) != (EXT_RECORDED_ALLOCATED
>> 30)) {
195 block
= udf_get_lb_pblock(sb
, &eloc
, offset
);
196 if ((++offset
<< sb
->s_blocksize_bits
) < elen
) {
197 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
198 epos
.offset
-= sizeof(struct short_ad
);
199 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
200 epos
.offset
-= sizeof(struct long_ad
);
204 fibh
->sbh
= fibh
->ebh
= udf_tread(sb
, block
);
211 fname
= kmalloc(UDF_NAME_LEN
, GFP_NOFS
);
213 fi
= ERR_PTR(-ENOMEM
);
217 while (f_pos
< size
) {
218 fi
= udf_fileident_read(dir
, &f_pos
, fibh
, cfi
, &epos
, &eloc
,
225 liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
226 lfi
= cfi
->lengthFileIdent
;
228 if (fibh
->sbh
== fibh
->ebh
) {
229 nameptr
= fi
->fileIdent
+ liu
;
231 int poffset
; /* Unpaded ending offset */
233 poffset
= fibh
->soffset
+ sizeof(struct fileIdentDesc
) +
237 nameptr
= (uint8_t *)(fibh
->ebh
->b_data
+
241 copy_name
= kmalloc(UDF_NAME_LEN
,
244 fi
= ERR_PTR(-ENOMEM
);
249 memcpy(nameptr
, fi
->fileIdent
+ liu
,
251 memcpy(nameptr
+ lfi
- poffset
,
252 fibh
->ebh
->b_data
, poffset
);
256 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_DELETED
) != 0) {
257 if (!UDF_QUERY_FLAG(sb
, UDF_FLAG_UNDELETE
))
261 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_HIDDEN
) != 0) {
262 if (!UDF_QUERY_FLAG(sb
, UDF_FLAG_UNHIDE
))
266 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_PARENT
) &&
273 flen
= udf_get_filename(sb
, nameptr
, lfi
, fname
, UDF_NAME_LEN
);
279 if (udf_match(flen
, fname
, child
->len
, child
->name
))
285 if (fibh
->sbh
!= fibh
->ebh
)
296 static struct dentry
*udf_lookup(struct inode
*dir
, struct dentry
*dentry
,
299 struct inode
*inode
= NULL
;
300 struct fileIdentDesc cfi
;
301 struct udf_fileident_bh fibh
;
302 struct fileIdentDesc
*fi
;
304 if (dentry
->d_name
.len
> UDF_NAME_LEN
)
305 return ERR_PTR(-ENAMETOOLONG
);
308 /* temporary shorthand for specifying files by inode number */
309 if (!strncmp(dentry
->d_name
.name
, ".B=", 3)) {
310 struct kernel_lb_addr lb
= {
311 .logicalBlockNum
= 0,
312 .partitionReferenceNum
=
313 simple_strtoul(dentry
->d_name
.name
+ 3,
316 inode
= udf_iget(dir
->i_sb
, lb
);
320 #endif /* UDF_RECOVERY */
322 fi
= udf_find_entry(dir
, &dentry
->d_name
, &fibh
, &cfi
);
327 struct kernel_lb_addr loc
;
329 if (fibh
.sbh
!= fibh
.ebh
)
333 loc
= lelb_to_cpu(cfi
.icb
.extLocation
);
334 inode
= udf_iget(dir
->i_sb
, &loc
);
336 return ERR_CAST(inode
);
339 return d_splice_alias(inode
, dentry
);
342 static struct fileIdentDesc
*udf_add_entry(struct inode
*dir
,
343 struct dentry
*dentry
,
344 struct udf_fileident_bh
*fibh
,
345 struct fileIdentDesc
*cfi
, int *err
)
347 struct super_block
*sb
= dir
->i_sb
;
348 struct fileIdentDesc
*fi
= NULL
;
349 unsigned char *name
= NULL
;
352 loff_t size
= udf_ext0_offset(dir
) + dir
->i_size
;
357 struct kernel_lb_addr eloc
;
360 struct extent_position epos
= {};
361 struct udf_inode_info
*dinfo
;
363 fibh
->sbh
= fibh
->ebh
= NULL
;
364 name
= kmalloc(UDF_NAME_LEN_CS0
, GFP_NOFS
);
371 if (!dentry
->d_name
.len
) {
375 namelen
= udf_put_filename(sb
, dentry
->d_name
.name
,
377 name
, UDF_NAME_LEN_CS0
);
379 *err
= -ENAMETOOLONG
;
386 nfidlen
= (sizeof(struct fileIdentDesc
) + namelen
+ 3) & ~3;
388 f_pos
= udf_ext0_offset(dir
);
390 fibh
->soffset
= fibh
->eoffset
= f_pos
& (dir
->i_sb
->s_blocksize
- 1);
392 if (dinfo
->i_alloc_type
!= ICBTAG_FLAG_AD_IN_ICB
) {
393 if (inode_bmap(dir
, f_pos
>> dir
->i_sb
->s_blocksize_bits
, &epos
,
394 &eloc
, &elen
, &offset
) != (EXT_RECORDED_ALLOCATED
>> 30)) {
395 block
= udf_get_lb_pblock(dir
->i_sb
,
396 &dinfo
->i_location
, 0);
397 fibh
->soffset
= fibh
->eoffset
= sb
->s_blocksize
;
400 block
= udf_get_lb_pblock(dir
->i_sb
, &eloc
, offset
);
401 if ((++offset
<< dir
->i_sb
->s_blocksize_bits
) < elen
) {
402 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
403 epos
.offset
-= sizeof(struct short_ad
);
404 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
405 epos
.offset
-= sizeof(struct long_ad
);
409 fibh
->sbh
= fibh
->ebh
= udf_tread(dir
->i_sb
, block
);
415 block
= dinfo
->i_location
.logicalBlockNum
;
418 while (f_pos
< size
) {
419 fi
= udf_fileident_read(dir
, &f_pos
, fibh
, cfi
, &epos
, &eloc
,
427 liu
= le16_to_cpu(cfi
->lengthOfImpUse
);
428 lfi
= cfi
->lengthFileIdent
;
430 if ((cfi
->fileCharacteristics
& FID_FILE_CHAR_DELETED
) != 0) {
431 if (((sizeof(struct fileIdentDesc
) +
432 liu
+ lfi
+ 3) & ~3) == nfidlen
) {
433 cfi
->descTag
.tagSerialNum
= cpu_to_le16(1);
434 cfi
->fileVersionNum
= cpu_to_le16(1);
435 cfi
->fileCharacteristics
= 0;
436 cfi
->lengthFileIdent
= namelen
;
437 cfi
->lengthOfImpUse
= cpu_to_le16(0);
438 if (!udf_write_fi(dir
, cfi
, fi
, fibh
, NULL
,
452 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
&&
453 sb
->s_blocksize
- fibh
->eoffset
< nfidlen
) {
456 fibh
->soffset
-= udf_ext0_offset(dir
);
457 fibh
->eoffset
-= udf_ext0_offset(dir
);
458 f_pos
-= udf_ext0_offset(dir
);
459 if (fibh
->sbh
!= fibh
->ebh
)
462 fibh
->sbh
= fibh
->ebh
=
463 udf_expand_dir_adinicb(dir
, &block
, err
);
466 epos
.block
= dinfo
->i_location
;
467 epos
.offset
= udf_file_entry_alloc_offset(dir
);
468 /* Load extent udf_expand_dir_adinicb() has created */
469 udf_current_aext(dir
, &epos
, &eloc
, &elen
, 1);
472 /* Entry fits into current block? */
473 if (sb
->s_blocksize
- fibh
->eoffset
>= nfidlen
) {
474 fibh
->soffset
= fibh
->eoffset
;
475 fibh
->eoffset
+= nfidlen
;
476 if (fibh
->sbh
!= fibh
->ebh
) {
478 fibh
->sbh
= fibh
->ebh
;
481 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
) {
482 block
= dinfo
->i_location
.logicalBlockNum
;
483 fi
= (struct fileIdentDesc
*)
484 (dinfo
->i_ext
.i_data
+
486 udf_ext0_offset(dir
) +
489 block
= eloc
.logicalBlockNum
+
491 dir
->i_sb
->s_blocksize_bits
);
492 fi
= (struct fileIdentDesc
*)
493 (fibh
->sbh
->b_data
+ fibh
->soffset
);
496 /* Round up last extent in the file */
497 elen
= (elen
+ sb
->s_blocksize
- 1) & ~(sb
->s_blocksize
- 1);
498 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
499 epos
.offset
-= sizeof(struct short_ad
);
500 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
501 epos
.offset
-= sizeof(struct long_ad
);
502 udf_write_aext(dir
, &epos
, &eloc
, elen
, 1);
503 dinfo
->i_lenExtents
= (dinfo
->i_lenExtents
+ sb
->s_blocksize
504 - 1) & ~(sb
->s_blocksize
- 1);
506 fibh
->soffset
= fibh
->eoffset
- sb
->s_blocksize
;
507 fibh
->eoffset
+= nfidlen
- sb
->s_blocksize
;
508 if (fibh
->sbh
!= fibh
->ebh
) {
510 fibh
->sbh
= fibh
->ebh
;
513 block
= eloc
.logicalBlockNum
+ ((elen
- 1) >>
514 dir
->i_sb
->s_blocksize_bits
);
515 fibh
->ebh
= udf_bread(dir
,
516 f_pos
>> dir
->i_sb
->s_blocksize_bits
, 1, err
);
519 /* Extents could have been merged, invalidate our position */
522 epos
.block
= dinfo
->i_location
;
523 epos
.offset
= udf_file_entry_alloc_offset(dir
);
525 if (!fibh
->soffset
) {
526 /* Find the freshly allocated block */
527 while (udf_next_aext(dir
, &epos
, &eloc
, &elen
, 1) ==
528 (EXT_RECORDED_ALLOCATED
>> 30))
530 block
= eloc
.logicalBlockNum
+ ((elen
- 1) >>
531 dir
->i_sb
->s_blocksize_bits
);
533 fibh
->sbh
= fibh
->ebh
;
534 fi
= (struct fileIdentDesc
*)(fibh
->sbh
->b_data
);
536 fi
= (struct fileIdentDesc
*)
537 (fibh
->sbh
->b_data
+ sb
->s_blocksize
+
542 memset(cfi
, 0, sizeof(struct fileIdentDesc
));
543 if (UDF_SB(sb
)->s_udfrev
>= 0x0200)
544 udf_new_tag((char *)cfi
, TAG_IDENT_FID
, 3, 1, block
,
547 udf_new_tag((char *)cfi
, TAG_IDENT_FID
, 2, 1, block
,
549 cfi
->fileVersionNum
= cpu_to_le16(1);
550 cfi
->lengthFileIdent
= namelen
;
551 cfi
->lengthOfImpUse
= cpu_to_le16(0);
552 if (!udf_write_fi(dir
, cfi
, fi
, fibh
, NULL
, name
)) {
553 dir
->i_size
+= nfidlen
;
554 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
555 dinfo
->i_lenAlloc
+= nfidlen
;
557 /* Find the last extent and truncate it to proper size */
558 while (udf_next_aext(dir
, &epos
, &eloc
, &elen
, 1) ==
559 (EXT_RECORDED_ALLOCATED
>> 30))
561 elen
-= dinfo
->i_lenExtents
- dir
->i_size
;
562 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
563 epos
.offset
-= sizeof(struct short_ad
);
564 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
565 epos
.offset
-= sizeof(struct long_ad
);
566 udf_write_aext(dir
, &epos
, &eloc
, elen
, 1);
567 dinfo
->i_lenExtents
= dir
->i_size
;
570 mark_inode_dirty(dir
);
579 if (fibh
->sbh
!= fibh
->ebh
)
588 static int udf_delete_entry(struct inode
*inode
, struct fileIdentDesc
*fi
,
589 struct udf_fileident_bh
*fibh
,
590 struct fileIdentDesc
*cfi
)
592 cfi
->fileCharacteristics
|= FID_FILE_CHAR_DELETED
;
594 if (UDF_QUERY_FLAG(inode
->i_sb
, UDF_FLAG_STRICT
))
595 memset(&(cfi
->icb
), 0x00, sizeof(struct long_ad
));
597 return udf_write_fi(inode
, cfi
, fi
, fibh
, NULL
, NULL
);
600 static int udf_add_nondir(struct dentry
*dentry
, struct inode
*inode
)
602 struct udf_inode_info
*iinfo
= UDF_I(inode
);
603 struct inode
*dir
= d_inode(dentry
->d_parent
);
604 struct udf_fileident_bh fibh
;
605 struct fileIdentDesc cfi
, *fi
;
608 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
610 inode_dec_link_count(inode
);
611 unlock_new_inode(inode
);
615 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
616 cfi
.icb
.extLocation
= cpu_to_lelb(iinfo
->i_location
);
617 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
618 cpu_to_le32(iinfo
->i_unique
& 0x00000000FFFFFFFFUL
);
619 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
620 dir
->i_ctime
= dir
->i_mtime
= current_time(dir
);
621 mark_inode_dirty(dir
);
622 if (fibh
.sbh
!= fibh
.ebh
)
625 unlock_new_inode(inode
);
626 d_instantiate(dentry
, inode
);
631 static int udf_create(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
,
634 struct inode
*inode
= udf_new_inode(dir
, mode
);
637 return PTR_ERR(inode
);
639 if (UDF_I(inode
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
640 inode
->i_data
.a_ops
= &udf_adinicb_aops
;
642 inode
->i_data
.a_ops
= &udf_aops
;
643 inode
->i_op
= &udf_file_inode_operations
;
644 inode
->i_fop
= &udf_file_operations
;
645 mark_inode_dirty(inode
);
647 return udf_add_nondir(dentry
, inode
);
650 static int udf_tmpfile(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
)
652 struct inode
*inode
= udf_new_inode(dir
, mode
);
655 return PTR_ERR(inode
);
657 if (UDF_I(inode
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
658 inode
->i_data
.a_ops
= &udf_adinicb_aops
;
660 inode
->i_data
.a_ops
= &udf_aops
;
661 inode
->i_op
= &udf_file_inode_operations
;
662 inode
->i_fop
= &udf_file_operations
;
663 mark_inode_dirty(inode
);
664 d_tmpfile(dentry
, inode
);
665 unlock_new_inode(inode
);
669 static int udf_mknod(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
,
674 if (!old_valid_dev(rdev
))
677 inode
= udf_new_inode(dir
, mode
);
679 return PTR_ERR(inode
);
681 init_special_inode(inode
, mode
, rdev
);
682 return udf_add_nondir(dentry
, inode
);
685 static int udf_mkdir(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
)
688 struct udf_fileident_bh fibh
;
689 struct fileIdentDesc cfi
, *fi
;
691 struct udf_inode_info
*dinfo
= UDF_I(dir
);
692 struct udf_inode_info
*iinfo
;
694 inode
= udf_new_inode(dir
, S_IFDIR
| mode
);
696 return PTR_ERR(inode
);
698 iinfo
= UDF_I(inode
);
699 inode
->i_op
= &udf_dir_inode_operations
;
700 inode
->i_fop
= &udf_dir_operations
;
701 fi
= udf_add_entry(inode
, NULL
, &fibh
, &cfi
, &err
);
703 inode_dec_link_count(inode
);
704 unlock_new_inode(inode
);
709 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
710 cfi
.icb
.extLocation
= cpu_to_lelb(dinfo
->i_location
);
711 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
712 cpu_to_le32(dinfo
->i_unique
& 0x00000000FFFFFFFFUL
);
713 cfi
.fileCharacteristics
=
714 FID_FILE_CHAR_DIRECTORY
| FID_FILE_CHAR_PARENT
;
715 udf_write_fi(inode
, &cfi
, fi
, &fibh
, NULL
, NULL
);
717 mark_inode_dirty(inode
);
719 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
722 mark_inode_dirty(inode
);
723 unlock_new_inode(inode
);
727 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
728 cfi
.icb
.extLocation
= cpu_to_lelb(iinfo
->i_location
);
729 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
730 cpu_to_le32(iinfo
->i_unique
& 0x00000000FFFFFFFFUL
);
731 cfi
.fileCharacteristics
|= FID_FILE_CHAR_DIRECTORY
;
732 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
734 dir
->i_ctime
= dir
->i_mtime
= current_time(dir
);
735 mark_inode_dirty(dir
);
736 unlock_new_inode(inode
);
737 d_instantiate(dentry
, inode
);
738 if (fibh
.sbh
!= fibh
.ebh
)
747 static int empty_dir(struct inode
*dir
)
749 struct fileIdentDesc
*fi
, cfi
;
750 struct udf_fileident_bh fibh
;
752 loff_t size
= udf_ext0_offset(dir
) + dir
->i_size
;
754 struct kernel_lb_addr eloc
;
757 struct extent_position epos
= {};
758 struct udf_inode_info
*dinfo
= UDF_I(dir
);
760 f_pos
= udf_ext0_offset(dir
);
761 fibh
.soffset
= fibh
.eoffset
= f_pos
& (dir
->i_sb
->s_blocksize
- 1);
763 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
764 fibh
.sbh
= fibh
.ebh
= NULL
;
765 else if (inode_bmap(dir
, f_pos
>> dir
->i_sb
->s_blocksize_bits
,
766 &epos
, &eloc
, &elen
, &offset
) ==
767 (EXT_RECORDED_ALLOCATED
>> 30)) {
768 block
= udf_get_lb_pblock(dir
->i_sb
, &eloc
, offset
);
769 if ((++offset
<< dir
->i_sb
->s_blocksize_bits
) < elen
) {
770 if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_SHORT
)
771 epos
.offset
-= sizeof(struct short_ad
);
772 else if (dinfo
->i_alloc_type
== ICBTAG_FLAG_AD_LONG
)
773 epos
.offset
-= sizeof(struct long_ad
);
777 fibh
.sbh
= fibh
.ebh
= udf_tread(dir
->i_sb
, block
);
787 while (f_pos
< size
) {
788 fi
= udf_fileident_read(dir
, &f_pos
, &fibh
, &cfi
, &epos
, &eloc
,
791 if (fibh
.sbh
!= fibh
.ebh
)
798 if (cfi
.lengthFileIdent
&&
799 (cfi
.fileCharacteristics
& FID_FILE_CHAR_DELETED
) == 0) {
800 if (fibh
.sbh
!= fibh
.ebh
)
808 if (fibh
.sbh
!= fibh
.ebh
)
816 static int udf_rmdir(struct inode
*dir
, struct dentry
*dentry
)
819 struct inode
*inode
= d_inode(dentry
);
820 struct udf_fileident_bh fibh
;
821 struct fileIdentDesc
*fi
, cfi
;
822 struct kernel_lb_addr tloc
;
825 fi
= udf_find_entry(dir
, &dentry
->d_name
, &fibh
, &cfi
);
826 if (IS_ERR_OR_NULL(fi
)) {
828 retval
= PTR_ERR(fi
);
833 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
834 if (udf_get_lb_pblock(dir
->i_sb
, &tloc
, 0) != inode
->i_ino
)
837 if (!empty_dir(inode
))
839 retval
= udf_delete_entry(dir
, fi
, &fibh
, &cfi
);
842 if (inode
->i_nlink
!= 2)
843 udf_warn(inode
->i_sb
, "empty directory has nlink != 2 (%u)\n",
847 inode_dec_link_count(dir
);
848 inode
->i_ctime
= dir
->i_ctime
= dir
->i_mtime
=
850 mark_inode_dirty(dir
);
853 if (fibh
.sbh
!= fibh
.ebh
)
861 static int udf_unlink(struct inode
*dir
, struct dentry
*dentry
)
864 struct inode
*inode
= d_inode(dentry
);
865 struct udf_fileident_bh fibh
;
866 struct fileIdentDesc
*fi
;
867 struct fileIdentDesc cfi
;
868 struct kernel_lb_addr tloc
;
871 fi
= udf_find_entry(dir
, &dentry
->d_name
, &fibh
, &cfi
);
873 if (IS_ERR_OR_NULL(fi
)) {
875 retval
= PTR_ERR(fi
);
880 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
881 if (udf_get_lb_pblock(dir
->i_sb
, &tloc
, 0) != inode
->i_ino
)
884 if (!inode
->i_nlink
) {
885 udf_debug("Deleting nonexistent file (%lu), %u\n",
886 inode
->i_ino
, inode
->i_nlink
);
889 retval
= udf_delete_entry(dir
, fi
, &fibh
, &cfi
);
892 dir
->i_ctime
= dir
->i_mtime
= current_time(dir
);
893 mark_inode_dirty(dir
);
894 inode_dec_link_count(inode
);
895 inode
->i_ctime
= dir
->i_ctime
;
899 if (fibh
.sbh
!= fibh
.ebh
)
907 static int udf_symlink(struct inode
*dir
, struct dentry
*dentry
,
910 struct inode
*inode
= udf_new_inode(dir
, S_IFLNK
| 0777);
911 struct pathComponent
*pc
;
912 const char *compstart
;
913 struct extent_position epos
= {};
914 int eoffset
, elen
= 0;
918 unsigned char *name
= NULL
;
920 struct udf_inode_info
*iinfo
;
921 struct super_block
*sb
= dir
->i_sb
;
924 return PTR_ERR(inode
);
926 iinfo
= UDF_I(inode
);
927 down_write(&iinfo
->i_data_sem
);
928 name
= kmalloc(UDF_NAME_LEN_CS0
, GFP_NOFS
);
934 inode
->i_data
.a_ops
= &udf_symlink_aops
;
935 inode
->i_op
= &udf_symlink_inode_operations
;
936 inode_nohighmem(inode
);
938 if (iinfo
->i_alloc_type
!= ICBTAG_FLAG_AD_IN_ICB
) {
939 struct kernel_lb_addr eloc
;
942 block
= udf_new_block(sb
, inode
,
943 iinfo
->i_location
.partitionReferenceNum
,
944 iinfo
->i_location
.logicalBlockNum
, &err
);
947 epos
.block
= iinfo
->i_location
;
948 epos
.offset
= udf_file_entry_alloc_offset(inode
);
950 eloc
.logicalBlockNum
= block
;
951 eloc
.partitionReferenceNum
=
952 iinfo
->i_location
.partitionReferenceNum
;
953 bsize
= sb
->s_blocksize
;
954 iinfo
->i_lenExtents
= bsize
;
955 udf_add_aext(inode
, &epos
, &eloc
, bsize
, 0);
958 block
= udf_get_pblock(sb
, block
,
959 iinfo
->i_location
.partitionReferenceNum
,
961 epos
.bh
= udf_tgetblk(sb
, block
);
962 lock_buffer(epos
.bh
);
963 memset(epos
.bh
->b_data
, 0x00, bsize
);
964 set_buffer_uptodate(epos
.bh
);
965 unlock_buffer(epos
.bh
);
966 mark_buffer_dirty_inode(epos
.bh
, inode
);
967 ea
= epos
.bh
->b_data
+ udf_ext0_offset(inode
);
969 ea
= iinfo
->i_ext
.i_data
+ iinfo
->i_lenEAttr
;
971 eoffset
= sb
->s_blocksize
- udf_ext0_offset(inode
);
972 pc
= (struct pathComponent
*)ea
;
974 if (*symname
== '/') {
977 } while (*symname
== '/');
979 pc
->componentType
= 1;
980 pc
->lengthComponentIdent
= 0;
981 pc
->componentFileVersionNum
= 0;
982 elen
+= sizeof(struct pathComponent
);
988 if (elen
+ sizeof(struct pathComponent
) > eoffset
)
991 pc
= (struct pathComponent
*)(ea
+ elen
);
997 } while (*symname
&& *symname
!= '/');
999 pc
->componentType
= 5;
1000 pc
->lengthComponentIdent
= 0;
1001 pc
->componentFileVersionNum
= 0;
1002 if (compstart
[0] == '.') {
1003 if ((symname
- compstart
) == 1)
1004 pc
->componentType
= 4;
1005 else if ((symname
- compstart
) == 2 &&
1006 compstart
[1] == '.')
1007 pc
->componentType
= 3;
1010 if (pc
->componentType
== 5) {
1011 namelen
= udf_put_filename(sb
, compstart
,
1012 symname
- compstart
,
1013 name
, UDF_NAME_LEN_CS0
);
1017 if (elen
+ sizeof(struct pathComponent
) + namelen
>
1021 pc
->lengthComponentIdent
= namelen
;
1023 memcpy(pc
->componentIdent
, name
, namelen
);
1026 elen
+= sizeof(struct pathComponent
) + pc
->lengthComponentIdent
;
1031 } while (*symname
== '/');
1036 inode
->i_size
= elen
;
1037 if (iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
1038 iinfo
->i_lenAlloc
= inode
->i_size
;
1040 udf_truncate_tail_extent(inode
);
1041 mark_inode_dirty(inode
);
1042 up_write(&iinfo
->i_data_sem
);
1044 err
= udf_add_nondir(dentry
, inode
);
1050 up_write(&iinfo
->i_data_sem
);
1051 inode_dec_link_count(inode
);
1052 unlock_new_inode(inode
);
1057 static int udf_link(struct dentry
*old_dentry
, struct inode
*dir
,
1058 struct dentry
*dentry
)
1060 struct inode
*inode
= d_inode(old_dentry
);
1061 struct udf_fileident_bh fibh
;
1062 struct fileIdentDesc cfi
, *fi
;
1065 fi
= udf_add_entry(dir
, dentry
, &fibh
, &cfi
, &err
);
1069 cfi
.icb
.extLength
= cpu_to_le32(inode
->i_sb
->s_blocksize
);
1070 cfi
.icb
.extLocation
= cpu_to_lelb(UDF_I(inode
)->i_location
);
1071 if (UDF_SB(inode
->i_sb
)->s_lvid_bh
) {
1072 *(__le32
*)((struct allocDescImpUse
*)cfi
.icb
.impUse
)->impUse
=
1073 cpu_to_le32(lvid_get_unique_id(inode
->i_sb
));
1075 udf_write_fi(dir
, &cfi
, fi
, &fibh
, NULL
, NULL
);
1076 if (UDF_I(dir
)->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
1077 mark_inode_dirty(dir
);
1079 if (fibh
.sbh
!= fibh
.ebh
)
1083 inode
->i_ctime
= current_time(inode
);
1084 mark_inode_dirty(inode
);
1085 dir
->i_ctime
= dir
->i_mtime
= current_time(dir
);
1086 mark_inode_dirty(dir
);
1088 d_instantiate(dentry
, inode
);
1093 /* Anybody can rename anything with this: the permission checks are left to the
1094 * higher-level routines.
1096 static int udf_rename(struct inode
*old_dir
, struct dentry
*old_dentry
,
1097 struct inode
*new_dir
, struct dentry
*new_dentry
,
1100 struct inode
*old_inode
= d_inode(old_dentry
);
1101 struct inode
*new_inode
= d_inode(new_dentry
);
1102 struct udf_fileident_bh ofibh
, nfibh
;
1103 struct fileIdentDesc
*ofi
= NULL
, *nfi
= NULL
, *dir_fi
= NULL
;
1104 struct fileIdentDesc ocfi
, ncfi
;
1105 struct buffer_head
*dir_bh
= NULL
;
1106 int retval
= -ENOENT
;
1107 struct kernel_lb_addr tloc
;
1108 struct udf_inode_info
*old_iinfo
= UDF_I(old_inode
);
1110 if (flags
& ~RENAME_NOREPLACE
)
1113 ofi
= udf_find_entry(old_dir
, &old_dentry
->d_name
, &ofibh
, &ocfi
);
1115 retval
= PTR_ERR(ofi
);
1119 if (ofibh
.sbh
!= ofibh
.ebh
)
1123 tloc
= lelb_to_cpu(ocfi
.icb
.extLocation
);
1124 if (!ofi
|| udf_get_lb_pblock(old_dir
->i_sb
, &tloc
, 0)
1125 != old_inode
->i_ino
)
1128 nfi
= udf_find_entry(new_dir
, &new_dentry
->d_name
, &nfibh
, &ncfi
);
1130 retval
= PTR_ERR(nfi
);
1133 if (nfi
&& !new_inode
) {
1134 if (nfibh
.sbh
!= nfibh
.ebh
)
1139 if (S_ISDIR(old_inode
->i_mode
)) {
1140 int offset
= udf_ext0_offset(old_inode
);
1143 retval
= -ENOTEMPTY
;
1144 if (!empty_dir(new_inode
))
1148 if (old_iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
) {
1149 dir_fi
= udf_get_fileident(
1150 old_iinfo
->i_ext
.i_data
-
1152 sizeof(struct extendedFileEntry
) :
1153 sizeof(struct fileEntry
)),
1154 old_inode
->i_sb
->s_blocksize
, &offset
);
1156 dir_bh
= udf_bread(old_inode
, 0, 0, &retval
);
1159 dir_fi
= udf_get_fileident(dir_bh
->b_data
,
1160 old_inode
->i_sb
->s_blocksize
, &offset
);
1164 tloc
= lelb_to_cpu(dir_fi
->icb
.extLocation
);
1165 if (udf_get_lb_pblock(old_inode
->i_sb
, &tloc
, 0) !=
1170 nfi
= udf_add_entry(new_dir
, new_dentry
, &nfibh
, &ncfi
,
1177 * Like most other Unix systems, set the ctime for inodes on a
1180 old_inode
->i_ctime
= current_time(old_inode
);
1181 mark_inode_dirty(old_inode
);
1186 ncfi
.fileVersionNum
= ocfi
.fileVersionNum
;
1187 ncfi
.fileCharacteristics
= ocfi
.fileCharacteristics
;
1188 memcpy(&(ncfi
.icb
), &(ocfi
.icb
), sizeof(ocfi
.icb
));
1189 udf_write_fi(new_dir
, &ncfi
, nfi
, &nfibh
, NULL
, NULL
);
1191 /* The old fid may have moved - find it again */
1192 ofi
= udf_find_entry(old_dir
, &old_dentry
->d_name
, &ofibh
, &ocfi
);
1193 udf_delete_entry(old_dir
, ofi
, &ofibh
, &ocfi
);
1196 new_inode
->i_ctime
= current_time(new_inode
);
1197 inode_dec_link_count(new_inode
);
1199 old_dir
->i_ctime
= old_dir
->i_mtime
= current_time(old_dir
);
1200 new_dir
->i_ctime
= new_dir
->i_mtime
= current_time(new_dir
);
1201 mark_inode_dirty(old_dir
);
1202 mark_inode_dirty(new_dir
);
1205 dir_fi
->icb
.extLocation
= cpu_to_lelb(UDF_I(new_dir
)->i_location
);
1206 udf_update_tag((char *)dir_fi
,
1207 (sizeof(struct fileIdentDesc
) +
1208 le16_to_cpu(dir_fi
->lengthOfImpUse
) + 3) & ~3);
1209 if (old_iinfo
->i_alloc_type
== ICBTAG_FLAG_AD_IN_ICB
)
1210 mark_inode_dirty(old_inode
);
1212 mark_buffer_dirty_inode(dir_bh
, old_inode
);
1214 inode_dec_link_count(old_dir
);
1216 inode_dec_link_count(new_inode
);
1219 mark_inode_dirty(new_dir
);
1224 if (ofibh
.sbh
!= ofibh
.ebh
)
1234 if (nfibh
.sbh
!= nfibh
.ebh
)
1242 static struct dentry
*udf_get_parent(struct dentry
*child
)
1244 struct kernel_lb_addr tloc
;
1245 struct inode
*inode
= NULL
;
1246 struct qstr dotdot
= QSTR_INIT("..", 2);
1247 struct fileIdentDesc cfi
;
1248 struct udf_fileident_bh fibh
;
1250 if (!udf_find_entry(d_inode(child
), &dotdot
, &fibh
, &cfi
))
1251 return ERR_PTR(-EACCES
);
1253 if (fibh
.sbh
!= fibh
.ebh
)
1257 tloc
= lelb_to_cpu(cfi
.icb
.extLocation
);
1258 inode
= udf_iget(child
->d_sb
, &tloc
);
1260 return ERR_CAST(inode
);
1262 return d_obtain_alias(inode
);
1266 static struct dentry
*udf_nfs_get_inode(struct super_block
*sb
, u32 block
,
1267 u16 partref
, __u32 generation
)
1269 struct inode
*inode
;
1270 struct kernel_lb_addr loc
;
1273 return ERR_PTR(-ESTALE
);
1275 loc
.logicalBlockNum
= block
;
1276 loc
.partitionReferenceNum
= partref
;
1277 inode
= udf_iget(sb
, &loc
);
1280 return ERR_CAST(inode
);
1282 if (generation
&& inode
->i_generation
!= generation
) {
1284 return ERR_PTR(-ESTALE
);
1286 return d_obtain_alias(inode
);
1289 static struct dentry
*udf_fh_to_dentry(struct super_block
*sb
,
1290 struct fid
*fid
, int fh_len
, int fh_type
)
1293 (fh_type
!= FILEID_UDF_WITH_PARENT
&&
1294 fh_type
!= FILEID_UDF_WITHOUT_PARENT
))
1297 return udf_nfs_get_inode(sb
, fid
->udf
.block
, fid
->udf
.partref
,
1298 fid
->udf
.generation
);
1301 static struct dentry
*udf_fh_to_parent(struct super_block
*sb
,
1302 struct fid
*fid
, int fh_len
, int fh_type
)
1304 if (fh_len
< 5 || fh_type
!= FILEID_UDF_WITH_PARENT
)
1307 return udf_nfs_get_inode(sb
, fid
->udf
.parent_block
,
1308 fid
->udf
.parent_partref
,
1309 fid
->udf
.parent_generation
);
1311 static int udf_encode_fh(struct inode
*inode
, __u32
*fh
, int *lenp
,
1312 struct inode
*parent
)
1315 struct kernel_lb_addr location
= UDF_I(inode
)->i_location
;
1316 struct fid
*fid
= (struct fid
*)fh
;
1317 int type
= FILEID_UDF_WITHOUT_PARENT
;
1319 if (parent
&& (len
< 5)) {
1321 return FILEID_INVALID
;
1322 } else if (len
< 3) {
1324 return FILEID_INVALID
;
1328 fid
->udf
.block
= location
.logicalBlockNum
;
1329 fid
->udf
.partref
= location
.partitionReferenceNum
;
1330 fid
->udf
.parent_partref
= 0;
1331 fid
->udf
.generation
= inode
->i_generation
;
1334 location
= UDF_I(parent
)->i_location
;
1335 fid
->udf
.parent_block
= location
.logicalBlockNum
;
1336 fid
->udf
.parent_partref
= location
.partitionReferenceNum
;
1337 fid
->udf
.parent_generation
= inode
->i_generation
;
1339 type
= FILEID_UDF_WITH_PARENT
;
1345 const struct export_operations udf_export_ops
= {
1346 .encode_fh
= udf_encode_fh
,
1347 .fh_to_dentry
= udf_fh_to_dentry
,
1348 .fh_to_parent
= udf_fh_to_parent
,
1349 .get_parent
= udf_get_parent
,
1352 const struct inode_operations udf_dir_inode_operations
= {
1353 .lookup
= udf_lookup
,
1354 .create
= udf_create
,
1356 .unlink
= udf_unlink
,
1357 .symlink
= udf_symlink
,
1361 .rename
= udf_rename
,
1362 .tmpfile
= udf_tmpfile
,