5 * Inode 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 Dave Boynton
14 * (C) 1998-2004 Ben Fennema
15 * (C) 1999-2000 Stelias Computing Inc
19 * 10/04/98 dgb Added rudimentary directory functions
20 * 10/07/98 Fully working udf_block_map! It works!
21 * 11/25/98 bmap altered to better support extents
22 * 12/06/98 blf partition support in udf_iget, udf_block_map and udf_read_inode
23 * 12/12/98 rewrote udf_block_map to handle next extents and descs across
24 * block boundaries (which is not actually allowed)
25 * 12/20/98 added support for strategy 4096
26 * 03/07/99 rewrote udf_block_map (again)
27 * New funcs, inode_bmap, udf_next_aext
28 * 04/19/99 Support for writing device EA's for major/minor #
33 #include <linux/smp_lock.h>
34 #include <linux/module.h>
35 #include <linux/pagemap.h>
36 #include <linux/buffer_head.h>
37 #include <linux/writeback.h>
38 #include <linux/slab.h>
43 MODULE_AUTHOR("Ben Fennema");
44 MODULE_DESCRIPTION("Universal Disk Format Filesystem");
45 MODULE_LICENSE("GPL");
47 #define EXTENT_MERGE_SIZE 5
49 static mode_t udf_convert_permissions(struct fileEntry *);
50 static int udf_update_inode(struct inode *, int);
51 static void udf_fill_inode(struct inode *, struct buffer_head *);
52 static struct buffer_head *inode_getblk(struct inode *, sector_t, int *,
54 static int8_t udf_insert_aext(struct inode *, struct extent_position,
55 kernel_lb_addr, uint32_t);
56 static void udf_split_extents(struct inode *, int *, int, int,
57 kernel_long_ad [EXTENT_MERGE_SIZE], int *);
58 static void udf_prealloc_extents(struct inode *, int, int,
59 kernel_long_ad [EXTENT_MERGE_SIZE], int *);
60 static void udf_merge_extents(struct inode *,
61 kernel_long_ad [EXTENT_MERGE_SIZE], int *);
62 static void udf_update_extents(struct inode *,
63 kernel_long_ad [EXTENT_MERGE_SIZE], int, int,
64 struct extent_position *);
65 static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int);
71 * Clean-up before the specified inode is destroyed.
74 * This routine is called when the kernel destroys an inode structure
75 * ie. when iput() finds i_count == 0.
78 * July 1, 1997 - Andrew E. Mileski
79 * Written, tested, and released.
81 * Called at the last iput() if i_nlink is zero.
83 void udf_delete_inode(struct inode * inode)
85 truncate_inode_pages(&inode->i_data, 0);
87 if (is_bad_inode(inode))
94 udf_update_inode(inode, IS_SYNC(inode));
95 udf_free_inode(inode);
104 * If we are going to release inode from memory, we discard preallocation and
105 * truncate last inode extent to proper length. We could use drop_inode() but
106 * it's called under inode_lock and thus we cannot mark inode dirty there. We
107 * use clear_inode() but we have to make sure to write inode as it's not written
110 void udf_clear_inode(struct inode *inode)
112 if (!(inode->i_sb->s_flags & MS_RDONLY)) {
114 /* Discard preallocation for directories, symlinks, etc. */
115 udf_discard_prealloc(inode);
116 udf_truncate_tail_extent(inode);
118 write_inode_now(inode, 1);
120 kfree(UDF_I_DATA(inode));
121 UDF_I_DATA(inode) = NULL;
124 static int udf_writepage(struct page *page, struct writeback_control *wbc)
126 return block_write_full_page(page, udf_get_block, wbc);
129 static int udf_readpage(struct file *file, struct page *page)
131 return block_read_full_page(page, udf_get_block);
134 static int udf_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
136 return block_prepare_write(page, from, to, udf_get_block);
139 static sector_t udf_bmap(struct address_space *mapping, sector_t block)
141 return generic_block_bmap(mapping,block,udf_get_block);
144 const struct address_space_operations udf_aops = {
145 .readpage = udf_readpage,
146 .writepage = udf_writepage,
147 .sync_page = block_sync_page,
148 .prepare_write = udf_prepare_write,
149 .commit_write = generic_commit_write,
153 void udf_expand_file_adinicb(struct inode * inode, int newsize, int * err)
157 struct writeback_control udf_wbc = {
158 .sync_mode = WB_SYNC_NONE,
162 /* from now on we have normal address_space methods */
163 inode->i_data.a_ops = &udf_aops;
165 if (!UDF_I_LENALLOC(inode))
167 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
168 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
170 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
171 mark_inode_dirty(inode);
175 page = grab_cache_page(inode->i_mapping, 0);
176 BUG_ON(!PageLocked(page));
178 if (!PageUptodate(page))
181 memset(kaddr + UDF_I_LENALLOC(inode), 0x00,
182 PAGE_CACHE_SIZE - UDF_I_LENALLOC(inode));
183 memcpy(kaddr, UDF_I_DATA(inode) + UDF_I_LENEATTR(inode),
184 UDF_I_LENALLOC(inode));
185 flush_dcache_page(page);
186 SetPageUptodate(page);
189 memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode), 0x00,
190 UDF_I_LENALLOC(inode));
191 UDF_I_LENALLOC(inode) = 0;
192 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
193 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
195 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
197 inode->i_data.a_ops->writepage(page, &udf_wbc);
198 page_cache_release(page);
200 mark_inode_dirty(inode);
203 struct buffer_head * udf_expand_dir_adinicb(struct inode *inode, int *block, int *err)
206 struct buffer_head *dbh = NULL;
210 struct extent_position epos;
212 struct udf_fileident_bh sfibh, dfibh;
213 loff_t f_pos = udf_ext0_offset(inode) >> 2;
214 int size = (udf_ext0_offset(inode) + inode->i_size) >> 2;
215 struct fileIdentDesc cfi, *sfi, *dfi;
217 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
218 alloctype = ICBTAG_FLAG_AD_SHORT;
220 alloctype = ICBTAG_FLAG_AD_LONG;
224 UDF_I_ALLOCTYPE(inode) = alloctype;
225 mark_inode_dirty(inode);
229 /* alloc block, and copy data to it */
230 *block = udf_new_block(inode->i_sb, inode,
231 UDF_I_LOCATION(inode).partitionReferenceNum,
232 UDF_I_LOCATION(inode).logicalBlockNum, err);
236 newblock = udf_get_pblock(inode->i_sb, *block,
237 UDF_I_LOCATION(inode).partitionReferenceNum, 0);
240 dbh = udf_tgetblk(inode->i_sb, newblock);
244 memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize);
245 set_buffer_uptodate(dbh);
247 mark_buffer_dirty_inode(dbh, inode);
249 sfibh.soffset = sfibh.eoffset = (f_pos & ((inode->i_sb->s_blocksize - 1) >> 2)) << 2;
250 sfibh.sbh = sfibh.ebh = NULL;
251 dfibh.soffset = dfibh.eoffset = 0;
252 dfibh.sbh = dfibh.ebh = dbh;
253 while ( (f_pos < size) )
255 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB;
256 sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, NULL, NULL, NULL);
262 UDF_I_ALLOCTYPE(inode) = alloctype;
263 sfi->descTag.tagLocation = cpu_to_le32(*block);
264 dfibh.soffset = dfibh.eoffset;
265 dfibh.eoffset += (sfibh.eoffset - sfibh.soffset);
266 dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset);
267 if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse,
268 sfi->fileIdent + le16_to_cpu(sfi->lengthOfImpUse)))
270 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB;
275 mark_buffer_dirty_inode(dbh, inode);
277 memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode), 0, UDF_I_LENALLOC(inode));
278 UDF_I_LENALLOC(inode) = 0;
279 eloc.logicalBlockNum = *block;
280 eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
281 elen = inode->i_size;
282 UDF_I_LENEXTENTS(inode) = elen;
284 epos.block = UDF_I_LOCATION(inode);
285 epos.offset = udf_file_entry_alloc_offset(inode);
286 udf_add_aext(inode, &epos, eloc, elen, 0);
290 mark_inode_dirty(inode);
294 static int udf_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create)
297 struct buffer_head *bh;
302 phys = udf_block_map(inode, block);
304 map_bh(bh_result, inode->i_sb, phys);
317 if (block == UDF_I_NEXT_ALLOC_BLOCK(inode) + 1)
319 UDF_I_NEXT_ALLOC_BLOCK(inode) ++;
320 UDF_I_NEXT_ALLOC_GOAL(inode) ++;
325 bh = inode_getblk(inode, block, &err, &phys, &new);
332 set_buffer_new(bh_result);
333 map_bh(bh_result, inode->i_sb, phys);
339 udf_warning(inode->i_sb, "udf_get_block", "block < 0");
343 static struct buffer_head *
344 udf_getblk(struct inode *inode, long block, int create, int *err)
346 struct buffer_head dummy;
349 dummy.b_blocknr = -1000;
350 *err = udf_get_block(inode, block, &dummy, create);
351 if (!*err && buffer_mapped(&dummy))
353 struct buffer_head *bh;
354 bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
355 if (buffer_new(&dummy))
358 memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
359 set_buffer_uptodate(bh);
361 mark_buffer_dirty_inode(bh, inode);
368 /* Extend the file by 'blocks' blocks, return the number of extents added */
369 int udf_extend_file(struct inode *inode, struct extent_position *last_pos,
370 kernel_long_ad *last_ext, sector_t blocks)
373 int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
374 struct super_block *sb = inode->i_sb;
375 kernel_lb_addr prealloc_loc = {0, 0};
376 int prealloc_len = 0;
378 /* The previous extent is fake and we should not extend by anything
379 * - there's nothing to do... */
382 /* Round the last extent up to a multiple of block size */
383 if (last_ext->extLength & (sb->s_blocksize - 1)) {
384 last_ext->extLength =
385 (last_ext->extLength & UDF_EXTENT_FLAG_MASK) |
386 (((last_ext->extLength & UDF_EXTENT_LENGTH_MASK) +
387 sb->s_blocksize - 1) & ~(sb->s_blocksize - 1));
388 UDF_I_LENEXTENTS(inode) =
389 (UDF_I_LENEXTENTS(inode) + sb->s_blocksize - 1) &
390 ~(sb->s_blocksize - 1);
392 /* Last extent are just preallocated blocks? */
393 if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == EXT_NOT_RECORDED_ALLOCATED) {
394 /* Save the extent so that we can reattach it to the end */
395 prealloc_loc = last_ext->extLocation;
396 prealloc_len = last_ext->extLength;
397 /* Mark the extent as a hole */
398 last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
399 (last_ext->extLength & UDF_EXTENT_LENGTH_MASK);
400 last_ext->extLocation.logicalBlockNum = 0;
401 last_ext->extLocation.partitionReferenceNum = 0;
403 /* Can we merge with the previous extent? */
404 if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == EXT_NOT_RECORDED_NOT_ALLOCATED) {
405 add = ((1<<30) - sb->s_blocksize - (last_ext->extLength &
406 UDF_EXTENT_LENGTH_MASK)) >> sb->s_blocksize_bits;
410 last_ext->extLength += add << sb->s_blocksize_bits;
414 udf_add_aext(inode, last_pos, last_ext->extLocation,
415 last_ext->extLength, 1);
419 udf_write_aext(inode, last_pos, last_ext->extLocation, last_ext->extLength, 1);
420 /* Managed to do everything necessary? */
424 /* All further extents will be NOT_RECORDED_NOT_ALLOCATED */
425 last_ext->extLocation.logicalBlockNum = 0;
426 last_ext->extLocation.partitionReferenceNum = 0;
427 add = (1 << (30-sb->s_blocksize_bits)) - 1;
428 last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | (add << sb->s_blocksize_bits);
429 /* Create enough extents to cover the whole hole */
430 while (blocks > add) {
432 if (udf_add_aext(inode, last_pos, last_ext->extLocation,
433 last_ext->extLength, 1) == -1)
438 last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
439 (blocks << sb->s_blocksize_bits);
440 if (udf_add_aext(inode, last_pos, last_ext->extLocation,
441 last_ext->extLength, 1) == -1)
446 /* Do we have some preallocated blocks saved? */
448 if (udf_add_aext(inode, last_pos, prealloc_loc, prealloc_len, 1) == -1)
450 last_ext->extLocation = prealloc_loc;
451 last_ext->extLength = prealloc_len;
454 /* last_pos should point to the last written extent... */
455 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
456 last_pos->offset -= sizeof(short_ad);
457 else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
458 last_pos->offset -= sizeof(long_ad);
464 static struct buffer_head * inode_getblk(struct inode * inode, sector_t block,
465 int *err, long *phys, int *new)
467 static sector_t last_block;
468 struct buffer_head *result = NULL;
469 kernel_long_ad laarr[EXTENT_MERGE_SIZE];
470 struct extent_position prev_epos, cur_epos, next_epos;
471 int count = 0, startnum = 0, endnum = 0;
472 uint32_t elen = 0, tmpelen;
473 kernel_lb_addr eloc, tmpeloc;
475 loff_t lbcount = 0, b_off = 0;
476 uint32_t newblocknum, newblock;
479 int goal = 0, pgoal = UDF_I_LOCATION(inode).logicalBlockNum;
482 prev_epos.offset = udf_file_entry_alloc_offset(inode);
483 prev_epos.block = UDF_I_LOCATION(inode);
485 cur_epos = next_epos = prev_epos;
486 b_off = (loff_t)block << inode->i_sb->s_blocksize_bits;
488 /* find the extent which contains the block we are looking for.
489 alternate between laarr[0] and laarr[1] for locations of the
490 current extent, and the previous extent */
493 if (prev_epos.bh != cur_epos.bh)
495 brelse(prev_epos.bh);
497 prev_epos.bh = cur_epos.bh;
499 if (cur_epos.bh != next_epos.bh)
502 get_bh(next_epos.bh);
503 cur_epos.bh = next_epos.bh;
508 prev_epos.block = cur_epos.block;
509 cur_epos.block = next_epos.block;
511 prev_epos.offset = cur_epos.offset;
512 cur_epos.offset = next_epos.offset;
514 if ((etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 1)) == -1)
519 laarr[c].extLength = (etype << 30) | elen;
520 laarr[c].extLocation = eloc;
522 if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
523 pgoal = eloc.logicalBlockNum +
524 ((elen + inode->i_sb->s_blocksize - 1) >>
525 inode->i_sb->s_blocksize_bits);
528 } while (lbcount + elen <= b_off);
531 offset = b_off >> inode->i_sb->s_blocksize_bits;
533 * Move prev_epos and cur_epos into indirect extent if we are at
536 udf_next_aext(inode, &prev_epos, &tmpeloc, &tmpelen, 0);
537 udf_next_aext(inode, &cur_epos, &tmpeloc, &tmpelen, 0);
539 /* if the extent is allocated and recorded, return the block
540 if the extent is not a multiple of the blocksize, round up */
542 if (etype == (EXT_RECORDED_ALLOCATED >> 30))
544 if (elen & (inode->i_sb->s_blocksize - 1))
546 elen = EXT_RECORDED_ALLOCATED |
547 ((elen + inode->i_sb->s_blocksize - 1) &
548 ~(inode->i_sb->s_blocksize - 1));
549 etype = udf_write_aext(inode, &cur_epos, eloc, elen, 1);
551 brelse(prev_epos.bh);
553 brelse(next_epos.bh);
554 newblock = udf_get_lb_pblock(inode->i_sb, eloc, offset);
560 /* Are we beyond EOF? */
571 /* Create a fake extent when there's not one */
572 memset(&laarr[0].extLocation, 0x00, sizeof(kernel_lb_addr));
573 laarr[0].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED;
574 /* Will udf_extend_file() create real extent from a fake one? */
575 startnum = (offset > 0);
577 /* Create extents for the hole between EOF and offset */
578 ret = udf_extend_file(inode, &prev_epos, laarr, offset);
580 brelse(prev_epos.bh);
582 brelse(next_epos.bh);
583 /* We don't really know the error here so we just make
591 /* We are not covered by a preallocated extent? */
592 if ((laarr[0].extLength & UDF_EXTENT_FLAG_MASK) != EXT_NOT_RECORDED_ALLOCATED) {
593 /* Is there any real extent? - otherwise we overwrite
597 laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
598 inode->i_sb->s_blocksize;
599 memset(&laarr[c].extLocation, 0x00, sizeof(kernel_lb_addr));
607 endnum = startnum = ((count > 2) ? 2 : count);
609 /* if the current extent is in position 0, swap it with the previous */
610 if (!c && count != 1)
618 /* if the current block is located in an extent, read the next extent */
619 if ((etype = udf_next_aext(inode, &next_epos, &eloc, &elen, 0)) != -1)
621 laarr[c+1].extLength = (etype << 30) | elen;
622 laarr[c+1].extLocation = eloc;
632 /* if the current extent is not recorded but allocated, get the
633 block in the extent corresponding to the requested block */
634 if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
635 newblocknum = laarr[c].extLocation.logicalBlockNum + offset;
636 else /* otherwise, allocate a new block */
638 if (UDF_I_NEXT_ALLOC_BLOCK(inode) == block)
639 goal = UDF_I_NEXT_ALLOC_GOAL(inode);
644 goal = UDF_I_LOCATION(inode).logicalBlockNum + 1;
647 if (!(newblocknum = udf_new_block(inode->i_sb, inode,
648 UDF_I_LOCATION(inode).partitionReferenceNum, goal, err)))
650 brelse(prev_epos.bh);
654 UDF_I_LENEXTENTS(inode) += inode->i_sb->s_blocksize;
657 /* if the extent the requsted block is located in contains multiple blocks,
658 split the extent into at most three extents. blocks prior to requested
659 block, requested block, and blocks after requested block */
660 udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);
662 #ifdef UDF_PREALLOCATE
663 /* preallocate blocks */
664 udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
667 /* merge any continuous blocks in laarr */
668 udf_merge_extents(inode, laarr, &endnum);
670 /* write back the new extents, inserting new extents if the new number
671 of extents is greater than the old number, and deleting extents if
672 the new number of extents is less than the old number */
673 udf_update_extents(inode, laarr, startnum, endnum, &prev_epos);
675 brelse(prev_epos.bh);
677 if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum,
678 UDF_I_LOCATION(inode).partitionReferenceNum, 0)))
685 UDF_I_NEXT_ALLOC_BLOCK(inode) = block;
686 UDF_I_NEXT_ALLOC_GOAL(inode) = newblocknum;
687 inode->i_ctime = current_fs_time(inode->i_sb);
690 udf_sync_inode(inode);
692 mark_inode_dirty(inode);
696 static void udf_split_extents(struct inode *inode, int *c, int offset, int newblocknum,
697 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
699 if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) ||
700 (laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
703 int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) +
704 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
705 int8_t etype = (laarr[curr].extLength >> 30);
709 else if (!offset || blen == offset + 1)
711 laarr[curr+2] = laarr[curr+1];
712 laarr[curr+1] = laarr[curr];
716 laarr[curr+3] = laarr[curr+1];
717 laarr[curr+2] = laarr[curr+1] = laarr[curr];
722 if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
724 udf_free_blocks(inode->i_sb, inode, laarr[curr].extLocation, 0, offset);
725 laarr[curr].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
726 (offset << inode->i_sb->s_blocksize_bits);
727 laarr[curr].extLocation.logicalBlockNum = 0;
728 laarr[curr].extLocation.partitionReferenceNum = 0;
731 laarr[curr].extLength = (etype << 30) |
732 (offset << inode->i_sb->s_blocksize_bits);
738 laarr[curr].extLocation.logicalBlockNum = newblocknum;
739 if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
740 laarr[curr].extLocation.partitionReferenceNum =
741 UDF_I_LOCATION(inode).partitionReferenceNum;
742 laarr[curr].extLength = EXT_RECORDED_ALLOCATED |
743 inode->i_sb->s_blocksize;
746 if (blen != offset + 1)
748 if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
749 laarr[curr].extLocation.logicalBlockNum += (offset + 1);
750 laarr[curr].extLength = (etype << 30) |
751 ((blen - (offset + 1)) << inode->i_sb->s_blocksize_bits);
758 static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
759 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
761 int start, length = 0, currlength = 0, i;
763 if (*endnum >= (c+1))
772 if ((laarr[c+1].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
775 length = currlength = (((laarr[c+1].extLength & UDF_EXTENT_LENGTH_MASK) +
776 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
782 for (i=start+1; i<=*endnum; i++)
787 length += UDF_DEFAULT_PREALLOC_BLOCKS;
789 else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
790 length += (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
791 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
798 int next = laarr[start].extLocation.logicalBlockNum +
799 (((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) +
800 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
801 int numalloc = udf_prealloc_blocks(inode->i_sb, inode,
802 laarr[start].extLocation.partitionReferenceNum,
803 next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ? length :
804 UDF_DEFAULT_PREALLOC_BLOCKS) - currlength);
809 laarr[start].extLength +=
810 (numalloc << inode->i_sb->s_blocksize_bits);
813 memmove(&laarr[c+2], &laarr[c+1],
814 sizeof(long_ad) * (*endnum - (c+1)));
816 laarr[c+1].extLocation.logicalBlockNum = next;
817 laarr[c+1].extLocation.partitionReferenceNum =
818 laarr[c].extLocation.partitionReferenceNum;
819 laarr[c+1].extLength = EXT_NOT_RECORDED_ALLOCATED |
820 (numalloc << inode->i_sb->s_blocksize_bits);
824 for (i=start+1; numalloc && i<*endnum; i++)
826 int elen = ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
827 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
831 laarr[i].extLength -=
832 (numalloc << inode->i_sb->s_blocksize_bits);
839 memmove(&laarr[i], &laarr[i+1],
840 sizeof(long_ad) * (*endnum - (i+1)));
845 UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
850 static void udf_merge_extents(struct inode *inode,
851 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
855 for (i=0; i<(*endnum-1); i++)
857 if ((laarr[i].extLength >> 30) == (laarr[i+1].extLength >> 30))
859 if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) ||
860 ((laarr[i+1].extLocation.logicalBlockNum - laarr[i].extLocation.logicalBlockNum) ==
861 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
862 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits)))
864 if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
865 (laarr[i+1].extLength & UDF_EXTENT_LENGTH_MASK) +
866 inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK)
868 laarr[i+1].extLength = (laarr[i+1].extLength -
869 (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
870 UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize-1);
871 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) +
872 (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize;
873 laarr[i+1].extLocation.logicalBlockNum =
874 laarr[i].extLocation.logicalBlockNum +
875 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) >>
876 inode->i_sb->s_blocksize_bits);
880 laarr[i].extLength = laarr[i+1].extLength +
881 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
882 inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize-1));
884 memmove(&laarr[i+1], &laarr[i+2],
885 sizeof(long_ad) * (*endnum - (i+2)));
891 else if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) &&
892 ((laarr[i+1].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)))
894 udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0,
895 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
896 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
897 laarr[i].extLocation.logicalBlockNum = 0;
898 laarr[i].extLocation.partitionReferenceNum = 0;
900 if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
901 (laarr[i+1].extLength & UDF_EXTENT_LENGTH_MASK) +
902 inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK)
904 laarr[i+1].extLength = (laarr[i+1].extLength -
905 (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
906 UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize-1);
907 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) +
908 (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize;
912 laarr[i].extLength = laarr[i+1].extLength +
913 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
914 inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize-1));
916 memmove(&laarr[i+1], &laarr[i+2],
917 sizeof(long_ad) * (*endnum - (i+2)));
922 else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
924 udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0,
925 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
926 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
927 laarr[i].extLocation.logicalBlockNum = 0;
928 laarr[i].extLocation.partitionReferenceNum = 0;
929 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) |
930 EXT_NOT_RECORDED_NOT_ALLOCATED;
935 static void udf_update_extents(struct inode *inode,
936 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int startnum, int endnum,
937 struct extent_position *epos)
940 kernel_lb_addr tmploc;
943 if (startnum > endnum)
945 for (i=0; i<(startnum-endnum); i++)
946 udf_delete_aext(inode, *epos, laarr[i].extLocation,
949 else if (startnum < endnum)
951 for (i=0; i<(endnum-startnum); i++)
953 udf_insert_aext(inode, *epos, laarr[i].extLocation,
955 udf_next_aext(inode, epos, &laarr[i].extLocation,
956 &laarr[i].extLength, 1);
961 for (i=start; i<endnum; i++)
963 udf_next_aext(inode, epos, &tmploc, &tmplen, 0);
964 udf_write_aext(inode, epos, laarr[i].extLocation,
965 laarr[i].extLength, 1);
969 struct buffer_head * udf_bread(struct inode * inode, int block,
970 int create, int * err)
972 struct buffer_head * bh = NULL;
974 bh = udf_getblk(inode, block, create, err);
978 if (buffer_uptodate(bh))
980 ll_rw_block(READ, 1, &bh);
982 if (buffer_uptodate(bh))
989 void udf_truncate(struct inode * inode)
994 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
995 S_ISLNK(inode->i_mode)))
997 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
1001 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
1003 if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +
1006 udf_expand_file_adinicb(inode, inode->i_size, &err);
1007 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
1009 inode->i_size = UDF_I_LENALLOC(inode);
1014 udf_truncate_extents(inode);
1018 offset = inode->i_size & (inode->i_sb->s_blocksize - 1);
1019 memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset, 0x00, inode->i_sb->s_blocksize - offset - udf_file_entry_alloc_offset(inode));
1020 UDF_I_LENALLOC(inode) = inode->i_size;
1025 block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block);
1026 udf_truncate_extents(inode);
1029 inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
1031 udf_sync_inode (inode);
1033 mark_inode_dirty(inode);
1038 __udf_read_inode(struct inode *inode)
1040 struct buffer_head *bh = NULL;
1041 struct fileEntry *fe;
1045 * Set defaults, but the inode is still incomplete!
1046 * Note: get_new_inode() sets the following on a new inode:
1049 * i_flags = sb->s_flags
1051 * clean_inode(): zero fills and sets
1056 bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident);
1060 printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n",
1062 make_bad_inode(inode);
1066 if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE &&
1067 ident != TAG_IDENT_USE)
1069 printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed ident=%d\n",
1070 inode->i_ino, ident);
1072 make_bad_inode(inode);
1076 fe = (struct fileEntry *)bh->b_data;
1078 if (le16_to_cpu(fe->icbTag.strategyType) == 4096)
1080 struct buffer_head *ibh = NULL, *nbh = NULL;
1081 struct indirectEntry *ie;
1083 ibh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 1, &ident);
1084 if (ident == TAG_IDENT_IE)
1089 ie = (struct indirectEntry *)ibh->b_data;
1091 loc = lelb_to_cpu(ie->indirectICB.extLocation);
1093 if (ie->indirectICB.extLength &&
1094 (nbh = udf_read_ptagged(inode->i_sb, loc, 0, &ident)))
1096 if (ident == TAG_IDENT_FE ||
1097 ident == TAG_IDENT_EFE)
1099 memcpy(&UDF_I_LOCATION(inode), &loc, sizeof(kernel_lb_addr));
1103 __udf_read_inode(inode);
1119 else if (le16_to_cpu(fe->icbTag.strategyType) != 4)
1121 printk(KERN_ERR "udf: unsupported strategy type: %d\n",
1122 le16_to_cpu(fe->icbTag.strategyType));
1124 make_bad_inode(inode);
1127 udf_fill_inode(inode, bh);
1132 static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
1134 struct fileEntry *fe;
1135 struct extendedFileEntry *efe;
1140 fe = (struct fileEntry *)bh->b_data;
1141 efe = (struct extendedFileEntry *)bh->b_data;
1143 if (le16_to_cpu(fe->icbTag.strategyType) == 4)
1144 UDF_I_STRAT4096(inode) = 0;
1145 else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */
1146 UDF_I_STRAT4096(inode) = 1;
1148 UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICBTAG_FLAG_AD_MASK;
1149 UDF_I_UNIQUE(inode) = 0;
1150 UDF_I_LENEATTR(inode) = 0;
1151 UDF_I_LENEXTENTS(inode) = 0;
1152 UDF_I_LENALLOC(inode) = 0;
1153 UDF_I_NEXT_ALLOC_BLOCK(inode) = 0;
1154 UDF_I_NEXT_ALLOC_GOAL(inode) = 0;
1155 if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_EFE)
1157 UDF_I_EFE(inode) = 1;
1158 UDF_I_USE(inode) = 0;
1159 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry), GFP_KERNEL);
1160 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct extendedFileEntry), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
1162 else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE)
1164 UDF_I_EFE(inode) = 0;
1165 UDF_I_USE(inode) = 0;
1166 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct fileEntry), GFP_KERNEL);
1167 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct fileEntry), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1169 else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1171 UDF_I_EFE(inode) = 0;
1172 UDF_I_USE(inode) = 1;
1173 UDF_I_LENALLOC(inode) =
1175 ((struct unallocSpaceEntry *)bh->b_data)->lengthAllocDescs);
1176 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry), GFP_KERNEL);
1177 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct unallocSpaceEntry), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
1181 inode->i_uid = le32_to_cpu(fe->uid);
1182 if (inode->i_uid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1183 UDF_FLAG_UID_IGNORE))
1184 inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
1186 inode->i_gid = le32_to_cpu(fe->gid);
1187 if (inode->i_gid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1188 UDF_FLAG_GID_IGNORE))
1189 inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
1191 inode->i_nlink = le16_to_cpu(fe->fileLinkCount);
1192 if (!inode->i_nlink)
1195 inode->i_size = le64_to_cpu(fe->informationLength);
1196 UDF_I_LENEXTENTS(inode) = inode->i_size;
1198 inode->i_mode = udf_convert_permissions(fe);
1199 inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask;
1201 if (UDF_I_EFE(inode) == 0)
1203 inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
1204 (inode->i_sb->s_blocksize_bits - 9);
1206 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1207 lets_to_cpu(fe->accessTime)) )
1209 inode->i_atime.tv_sec = convtime;
1210 inode->i_atime.tv_nsec = convtime_usec * 1000;
1214 inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1217 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1218 lets_to_cpu(fe->modificationTime)) )
1220 inode->i_mtime.tv_sec = convtime;
1221 inode->i_mtime.tv_nsec = convtime_usec * 1000;
1225 inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1228 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1229 lets_to_cpu(fe->attrTime)) )
1231 inode->i_ctime.tv_sec = convtime;
1232 inode->i_ctime.tv_nsec = convtime_usec * 1000;
1236 inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1239 UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID);
1240 UDF_I_LENEATTR(inode) = le32_to_cpu(fe->lengthExtendedAttr);
1241 UDF_I_LENALLOC(inode) = le32_to_cpu(fe->lengthAllocDescs);
1242 offset = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode);
1246 inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
1247 (inode->i_sb->s_blocksize_bits - 9);
1249 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1250 lets_to_cpu(efe->accessTime)) )
1252 inode->i_atime.tv_sec = convtime;
1253 inode->i_atime.tv_nsec = convtime_usec * 1000;
1257 inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1260 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1261 lets_to_cpu(efe->modificationTime)) )
1263 inode->i_mtime.tv_sec = convtime;
1264 inode->i_mtime.tv_nsec = convtime_usec * 1000;
1268 inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1271 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1272 lets_to_cpu(efe->createTime)) )
1274 UDF_I_CRTIME(inode).tv_sec = convtime;
1275 UDF_I_CRTIME(inode).tv_nsec = convtime_usec * 1000;
1279 UDF_I_CRTIME(inode) = UDF_SB_RECORDTIME(inode->i_sb);
1282 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1283 lets_to_cpu(efe->attrTime)) )
1285 inode->i_ctime.tv_sec = convtime;
1286 inode->i_ctime.tv_nsec = convtime_usec * 1000;
1290 inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1293 UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID);
1294 UDF_I_LENEATTR(inode) = le32_to_cpu(efe->lengthExtendedAttr);
1295 UDF_I_LENALLOC(inode) = le32_to_cpu(efe->lengthAllocDescs);
1296 offset = sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode);
1299 switch (fe->icbTag.fileType)
1301 case ICBTAG_FILE_TYPE_DIRECTORY:
1303 inode->i_op = &udf_dir_inode_operations;
1304 inode->i_fop = &udf_dir_operations;
1305 inode->i_mode |= S_IFDIR;
1309 case ICBTAG_FILE_TYPE_REALTIME:
1310 case ICBTAG_FILE_TYPE_REGULAR:
1311 case ICBTAG_FILE_TYPE_UNDEF:
1313 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
1314 inode->i_data.a_ops = &udf_adinicb_aops;
1316 inode->i_data.a_ops = &udf_aops;
1317 inode->i_op = &udf_file_inode_operations;
1318 inode->i_fop = &udf_file_operations;
1319 inode->i_mode |= S_IFREG;
1322 case ICBTAG_FILE_TYPE_BLOCK:
1324 inode->i_mode |= S_IFBLK;
1327 case ICBTAG_FILE_TYPE_CHAR:
1329 inode->i_mode |= S_IFCHR;
1332 case ICBTAG_FILE_TYPE_FIFO:
1334 init_special_inode(inode, inode->i_mode | S_IFIFO, 0);
1337 case ICBTAG_FILE_TYPE_SOCKET:
1339 init_special_inode(inode, inode->i_mode | S_IFSOCK, 0);
1342 case ICBTAG_FILE_TYPE_SYMLINK:
1344 inode->i_data.a_ops = &udf_symlink_aops;
1345 inode->i_op = &page_symlink_inode_operations;
1346 inode->i_mode = S_IFLNK|S_IRWXUGO;
1351 printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown file type=%d\n",
1352 inode->i_ino, fe->icbTag.fileType);
1353 make_bad_inode(inode);
1357 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1359 struct deviceSpec *dsea =
1360 (struct deviceSpec *)
1361 udf_get_extendedattr(inode, 12, 1);
1365 init_special_inode(inode, inode->i_mode, MKDEV(
1366 le32_to_cpu(dsea->majorDeviceIdent),
1367 le32_to_cpu(dsea->minorDeviceIdent)));
1368 /* Developer ID ??? */
1372 make_bad_inode(inode);
1378 udf_convert_permissions(struct fileEntry *fe)
1381 uint32_t permissions;
1384 permissions = le32_to_cpu(fe->permissions);
1385 flags = le16_to_cpu(fe->icbTag.flags);
1387 mode = (( permissions ) & S_IRWXO) |
1388 (( permissions >> 2 ) & S_IRWXG) |
1389 (( permissions >> 4 ) & S_IRWXU) |
1390 (( flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) |
1391 (( flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) |
1392 (( flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0);
1401 * Write out the specified inode.
1404 * This routine is called whenever an inode is synced.
1405 * Currently this routine is just a placeholder.
1408 * July 1, 1997 - Andrew E. Mileski
1409 * Written, tested, and released.
1412 int udf_write_inode(struct inode * inode, int sync)
1416 ret = udf_update_inode(inode, sync);
1421 int udf_sync_inode(struct inode * inode)
1423 return udf_update_inode(inode, 1);
1427 udf_update_inode(struct inode *inode, int do_sync)
1429 struct buffer_head *bh = NULL;
1430 struct fileEntry *fe;
1431 struct extendedFileEntry *efe;
1436 kernel_timestamp cpu_time;
1439 bh = udf_tread(inode->i_sb,
1440 udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0));
1444 udf_debug("bread failure\n");
1448 memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
1450 fe = (struct fileEntry *)bh->b_data;
1451 efe = (struct extendedFileEntry *)bh->b_data;
1453 if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1455 struct unallocSpaceEntry *use =
1456 (struct unallocSpaceEntry *)bh->b_data;
1458 use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1459 memcpy(bh->b_data + sizeof(struct unallocSpaceEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
1460 crclen = sizeof(struct unallocSpaceEntry) + UDF_I_LENALLOC(inode) -
1462 use->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1463 use->descTag.descCRCLength = cpu_to_le16(crclen);
1464 use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0));
1466 use->descTag.tagChecksum = 0;
1467 for (i=0; i<16; i++)
1469 use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i];
1471 mark_buffer_dirty(bh);
1476 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET))
1477 fe->uid = cpu_to_le32(-1);
1478 else fe->uid = cpu_to_le32(inode->i_uid);
1480 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET))
1481 fe->gid = cpu_to_le32(-1);
1482 else fe->gid = cpu_to_le32(inode->i_gid);
1484 udfperms = ((inode->i_mode & S_IRWXO) ) |
1485 ((inode->i_mode & S_IRWXG) << 2) |
1486 ((inode->i_mode & S_IRWXU) << 4);
1488 udfperms |= (le32_to_cpu(fe->permissions) &
1489 (FE_PERM_O_DELETE | FE_PERM_O_CHATTR |
1490 FE_PERM_G_DELETE | FE_PERM_G_CHATTR |
1491 FE_PERM_U_DELETE | FE_PERM_U_CHATTR));
1492 fe->permissions = cpu_to_le32(udfperms);
1494 if (S_ISDIR(inode->i_mode))
1495 fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1);
1497 fe->fileLinkCount = cpu_to_le16(inode->i_nlink);
1499 fe->informationLength = cpu_to_le64(inode->i_size);
1501 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1504 struct deviceSpec *dsea =
1505 (struct deviceSpec *)
1506 udf_get_extendedattr(inode, 12, 1);
1510 dsea = (struct deviceSpec *)
1511 udf_add_extendedattr(inode,
1512 sizeof(struct deviceSpec) +
1513 sizeof(regid), 12, 0x3);
1514 dsea->attrType = cpu_to_le32(12);
1515 dsea->attrSubtype = 1;
1516 dsea->attrLength = cpu_to_le32(sizeof(struct deviceSpec) +
1518 dsea->impUseLength = cpu_to_le32(sizeof(regid));
1520 eid = (regid *)dsea->impUse;
1521 memset(eid, 0, sizeof(regid));
1522 strcpy(eid->ident, UDF_ID_DEVELOPER);
1523 eid->identSuffix[0] = UDF_OS_CLASS_UNIX;
1524 eid->identSuffix[1] = UDF_OS_ID_LINUX;
1525 dsea->majorDeviceIdent = cpu_to_le32(imajor(inode));
1526 dsea->minorDeviceIdent = cpu_to_le32(iminor(inode));
1529 if (UDF_I_EFE(inode) == 0)
1531 memcpy(bh->b_data + sizeof(struct fileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1532 fe->logicalBlocksRecorded = cpu_to_le64(
1533 (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1534 (inode->i_sb->s_blocksize_bits - 9));
1536 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1537 fe->accessTime = cpu_to_lets(cpu_time);
1538 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1539 fe->modificationTime = cpu_to_lets(cpu_time);
1540 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1541 fe->attrTime = cpu_to_lets(cpu_time);
1542 memset(&(fe->impIdent), 0, sizeof(regid));
1543 strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
1544 fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1545 fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1546 fe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1547 fe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1548 fe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1549 fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE);
1550 crclen = sizeof(struct fileEntry);
1554 memcpy(bh->b_data + sizeof(struct extendedFileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
1555 efe->objectSize = cpu_to_le64(inode->i_size);
1556 efe->logicalBlocksRecorded = cpu_to_le64(
1557 (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1558 (inode->i_sb->s_blocksize_bits - 9));
1560 if (UDF_I_CRTIME(inode).tv_sec > inode->i_atime.tv_sec ||
1561 (UDF_I_CRTIME(inode).tv_sec == inode->i_atime.tv_sec &&
1562 UDF_I_CRTIME(inode).tv_nsec > inode->i_atime.tv_nsec))
1564 UDF_I_CRTIME(inode) = inode->i_atime;
1566 if (UDF_I_CRTIME(inode).tv_sec > inode->i_mtime.tv_sec ||
1567 (UDF_I_CRTIME(inode).tv_sec == inode->i_mtime.tv_sec &&
1568 UDF_I_CRTIME(inode).tv_nsec > inode->i_mtime.tv_nsec))
1570 UDF_I_CRTIME(inode) = inode->i_mtime;
1572 if (UDF_I_CRTIME(inode).tv_sec > inode->i_ctime.tv_sec ||
1573 (UDF_I_CRTIME(inode).tv_sec == inode->i_ctime.tv_sec &&
1574 UDF_I_CRTIME(inode).tv_nsec > inode->i_ctime.tv_nsec))
1576 UDF_I_CRTIME(inode) = inode->i_ctime;
1579 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1580 efe->accessTime = cpu_to_lets(cpu_time);
1581 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1582 efe->modificationTime = cpu_to_lets(cpu_time);
1583 if (udf_time_to_stamp(&cpu_time, UDF_I_CRTIME(inode)))
1584 efe->createTime = cpu_to_lets(cpu_time);
1585 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1586 efe->attrTime = cpu_to_lets(cpu_time);
1588 memset(&(efe->impIdent), 0, sizeof(regid));
1589 strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
1590 efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1591 efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1592 efe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1593 efe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1594 efe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1595 efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE);
1596 crclen = sizeof(struct extendedFileEntry);
1598 if (UDF_I_STRAT4096(inode))
1600 fe->icbTag.strategyType = cpu_to_le16(4096);
1601 fe->icbTag.strategyParameter = cpu_to_le16(1);
1602 fe->icbTag.numEntries = cpu_to_le16(2);
1606 fe->icbTag.strategyType = cpu_to_le16(4);
1607 fe->icbTag.numEntries = cpu_to_le16(1);
1610 if (S_ISDIR(inode->i_mode))
1611 fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY;
1612 else if (S_ISREG(inode->i_mode))
1613 fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR;
1614 else if (S_ISLNK(inode->i_mode))
1615 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SYMLINK;
1616 else if (S_ISBLK(inode->i_mode))
1617 fe->icbTag.fileType = ICBTAG_FILE_TYPE_BLOCK;
1618 else if (S_ISCHR(inode->i_mode))
1619 fe->icbTag.fileType = ICBTAG_FILE_TYPE_CHAR;
1620 else if (S_ISFIFO(inode->i_mode))
1621 fe->icbTag.fileType = ICBTAG_FILE_TYPE_FIFO;
1622 else if (S_ISSOCK(inode->i_mode))
1623 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET;
1625 icbflags = UDF_I_ALLOCTYPE(inode) |
1626 ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) |
1627 ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) |
1628 ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) |
1629 (le16_to_cpu(fe->icbTag.flags) &
1630 ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID |
1631 ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY));
1633 fe->icbTag.flags = cpu_to_le16(icbflags);
1634 if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1635 fe->descTag.descVersion = cpu_to_le16(3);
1637 fe->descTag.descVersion = cpu_to_le16(2);
1638 fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb));
1639 fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1640 crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag);
1641 fe->descTag.descCRCLength = cpu_to_le16(crclen);
1642 fe->descTag.descCRC = cpu_to_le16(udf_crc((char *)fe + sizeof(tag), crclen, 0));
1644 fe->descTag.tagChecksum = 0;
1645 for (i=0; i<16; i++)
1647 fe->descTag.tagChecksum += ((uint8_t *)&(fe->descTag))[i];
1649 /* write the data blocks */
1650 mark_buffer_dirty(bh);
1653 sync_dirty_buffer(bh);
1654 if (buffer_req(bh) && !buffer_uptodate(bh))
1656 printk("IO error syncing udf inode [%s:%08lx]\n",
1657 inode->i_sb->s_id, inode->i_ino);
1666 udf_iget(struct super_block *sb, kernel_lb_addr ino)
1668 unsigned long block = udf_get_lb_pblock(sb, ino, 0);
1669 struct inode *inode = iget_locked(sb, block);
1674 if (inode->i_state & I_NEW) {
1675 memcpy(&UDF_I_LOCATION(inode), &ino, sizeof(kernel_lb_addr));
1676 __udf_read_inode(inode);
1677 unlock_new_inode(inode);
1680 if (is_bad_inode(inode))
1683 if (ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) {
1684 udf_debug("block=%d, partition=%d out of range\n",
1685 ino.logicalBlockNum, ino.partitionReferenceNum);
1686 make_bad_inode(inode);
1697 int8_t udf_add_aext(struct inode *inode, struct extent_position *epos,
1698 kernel_lb_addr eloc, uint32_t elen, int inc)
1701 short_ad *sad = NULL;
1702 long_ad *lad = NULL;
1703 struct allocExtDesc *aed;
1708 ptr = UDF_I_DATA(inode) + epos->offset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1710 ptr = epos->bh->b_data + epos->offset;
1712 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
1713 adsize = sizeof(short_ad);
1714 else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
1715 adsize = sizeof(long_ad);
1719 if (epos->offset + (2 * adsize) > inode->i_sb->s_blocksize)
1722 struct buffer_head *nbh;
1724 kernel_lb_addr obloc = epos->block;
1726 if (!(epos->block.logicalBlockNum = udf_new_block(inode->i_sb, NULL,
1727 obloc.partitionReferenceNum, obloc.logicalBlockNum, &err)))
1731 if (!(nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb,
1737 memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize);
1738 set_buffer_uptodate(nbh);
1740 mark_buffer_dirty_inode(nbh, inode);
1742 aed = (struct allocExtDesc *)(nbh->b_data);
1743 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
1744 aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum);
1745 if (epos->offset + adsize > inode->i_sb->s_blocksize)
1747 loffset = epos->offset;
1748 aed->lengthAllocDescs = cpu_to_le32(adsize);
1749 sptr = ptr - adsize;
1750 dptr = nbh->b_data + sizeof(struct allocExtDesc);
1751 memcpy(dptr, sptr, adsize);
1752 epos->offset = sizeof(struct allocExtDesc) + adsize;
1756 loffset = epos->offset + adsize;
1757 aed->lengthAllocDescs = cpu_to_le32(0);
1759 epos->offset = sizeof(struct allocExtDesc);
1763 aed = (struct allocExtDesc *)epos->bh->b_data;
1764 aed->lengthAllocDescs =
1765 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1769 UDF_I_LENALLOC(inode) += adsize;
1770 mark_inode_dirty(inode);
1773 if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1774 udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1,
1775 epos->block.logicalBlockNum, sizeof(tag));
1777 udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1,
1778 epos->block.logicalBlockNum, sizeof(tag));
1779 switch (UDF_I_ALLOCTYPE(inode))
1781 case ICBTAG_FLAG_AD_SHORT:
1783 sad = (short_ad *)sptr;
1784 sad->extLength = cpu_to_le32(
1785 EXT_NEXT_EXTENT_ALLOCDECS |
1786 inode->i_sb->s_blocksize);
1787 sad->extPosition = cpu_to_le32(epos->block.logicalBlockNum);
1790 case ICBTAG_FLAG_AD_LONG:
1792 lad = (long_ad *)sptr;
1793 lad->extLength = cpu_to_le32(
1794 EXT_NEXT_EXTENT_ALLOCDECS |
1795 inode->i_sb->s_blocksize);
1796 lad->extLocation = cpu_to_lelb(epos->block);
1797 memset(lad->impUse, 0x00, sizeof(lad->impUse));
1803 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1804 udf_update_tag(epos->bh->b_data, loffset);
1806 udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc));
1807 mark_buffer_dirty_inode(epos->bh, inode);
1811 mark_inode_dirty(inode);
1815 etype = udf_write_aext(inode, epos, eloc, elen, inc);
1819 UDF_I_LENALLOC(inode) += adsize;
1820 mark_inode_dirty(inode);
1824 aed = (struct allocExtDesc *)epos->bh->b_data;
1825 aed->lengthAllocDescs =
1826 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1827 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1828 udf_update_tag(epos->bh->b_data, epos->offset + (inc ? 0 : adsize));
1830 udf_update_tag(epos->bh->b_data, sizeof(struct allocExtDesc));
1831 mark_buffer_dirty_inode(epos->bh, inode);
1837 int8_t udf_write_aext(struct inode *inode, struct extent_position *epos,
1838 kernel_lb_addr eloc, uint32_t elen, int inc)
1844 ptr = UDF_I_DATA(inode) + epos->offset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1846 ptr = epos->bh->b_data + epos->offset;
1848 switch (UDF_I_ALLOCTYPE(inode))
1850 case ICBTAG_FLAG_AD_SHORT:
1852 short_ad *sad = (short_ad *)ptr;
1853 sad->extLength = cpu_to_le32(elen);
1854 sad->extPosition = cpu_to_le32(eloc.logicalBlockNum);
1855 adsize = sizeof(short_ad);
1858 case ICBTAG_FLAG_AD_LONG:
1860 long_ad *lad = (long_ad *)ptr;
1861 lad->extLength = cpu_to_le32(elen);
1862 lad->extLocation = cpu_to_lelb(eloc);
1863 memset(lad->impUse, 0x00, sizeof(lad->impUse));
1864 adsize = sizeof(long_ad);
1873 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1875 struct allocExtDesc *aed = (struct allocExtDesc *)epos->bh->b_data;
1876 udf_update_tag(epos->bh->b_data,
1877 le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc));
1879 mark_buffer_dirty_inode(epos->bh, inode);
1882 mark_inode_dirty(inode);
1885 epos->offset += adsize;
1886 return (elen >> 30);
1889 int8_t udf_next_aext(struct inode *inode, struct extent_position *epos,
1890 kernel_lb_addr *eloc, uint32_t *elen, int inc)
1894 while ((etype = udf_current_aext(inode, epos, eloc, elen, inc)) ==
1895 (EXT_NEXT_EXTENT_ALLOCDECS >> 30))
1897 epos->block = *eloc;
1898 epos->offset = sizeof(struct allocExtDesc);
1900 if (!(epos->bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, epos->block, 0))))
1902 udf_debug("reading block %d failed!\n",
1903 udf_get_lb_pblock(inode->i_sb, epos->block, 0));
1911 int8_t udf_current_aext(struct inode *inode, struct extent_position *epos,
1912 kernel_lb_addr *eloc, uint32_t *elen, int inc)
1921 epos->offset = udf_file_entry_alloc_offset(inode);
1922 ptr = UDF_I_DATA(inode) + epos->offset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1923 alen = udf_file_entry_alloc_offset(inode) + UDF_I_LENALLOC(inode);
1928 epos->offset = sizeof(struct allocExtDesc);
1929 ptr = epos->bh->b_data + epos->offset;
1930 alen = sizeof(struct allocExtDesc) + le32_to_cpu(((struct allocExtDesc *)epos->bh->b_data)->lengthAllocDescs);
1933 switch (UDF_I_ALLOCTYPE(inode))
1935 case ICBTAG_FLAG_AD_SHORT:
1939 if (!(sad = udf_get_fileshortad(ptr, alen, &epos->offset, inc)))
1942 etype = le32_to_cpu(sad->extLength) >> 30;
1943 eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
1944 eloc->partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
1945 *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
1948 case ICBTAG_FLAG_AD_LONG:
1952 if (!(lad = udf_get_filelongad(ptr, alen, &epos->offset, inc)))
1955 etype = le32_to_cpu(lad->extLength) >> 30;
1956 *eloc = lelb_to_cpu(lad->extLocation);
1957 *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK;
1962 udf_debug("alloc_type = %d unsupported\n", UDF_I_ALLOCTYPE(inode));
1971 udf_insert_aext(struct inode *inode, struct extent_position epos,
1972 kernel_lb_addr neloc, uint32_t nelen)
1974 kernel_lb_addr oeloc;
1981 while ((etype = udf_next_aext(inode, &epos, &oeloc, &oelen, 0)) != -1)
1983 udf_write_aext(inode, &epos, neloc, nelen, 1);
1986 nelen = (etype << 30) | oelen;
1988 udf_add_aext(inode, &epos, neloc, nelen, 1);
1990 return (nelen >> 30);
1993 int8_t udf_delete_aext(struct inode *inode, struct extent_position epos,
1994 kernel_lb_addr eloc, uint32_t elen)
1996 struct extent_position oepos;
1999 struct allocExtDesc *aed;
2007 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
2008 adsize = sizeof(short_ad);
2009 else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
2010 adsize = sizeof(long_ad);
2015 if (udf_next_aext(inode, &epos, &eloc, &elen, 1) == -1)
2018 while ((etype = udf_next_aext(inode, &epos, &eloc, &elen, 1)) != -1)
2020 udf_write_aext(inode, &oepos, eloc, (etype << 30) | elen, 1);
2021 if (oepos.bh != epos.bh)
2023 oepos.block = epos.block;
2027 oepos.offset = epos.offset - adsize;
2030 memset(&eloc, 0x00, sizeof(kernel_lb_addr));
2033 if (epos.bh != oepos.bh)
2035 udf_free_blocks(inode->i_sb, inode, epos.block, 0, 1);
2036 udf_write_aext(inode, &oepos, eloc, elen, 1);
2037 udf_write_aext(inode, &oepos, eloc, elen, 1);
2040 UDF_I_LENALLOC(inode) -= (adsize * 2);
2041 mark_inode_dirty(inode);
2045 aed = (struct allocExtDesc *)oepos.bh->b_data;
2046 aed->lengthAllocDescs =
2047 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2*adsize));
2048 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
2049 udf_update_tag(oepos.bh->b_data, oepos.offset - (2*adsize));
2051 udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc));
2052 mark_buffer_dirty_inode(oepos.bh, inode);
2057 udf_write_aext(inode, &oepos, eloc, elen, 1);
2060 UDF_I_LENALLOC(inode) -= adsize;
2061 mark_inode_dirty(inode);
2065 aed = (struct allocExtDesc *)oepos.bh->b_data;
2066 aed->lengthAllocDescs =
2067 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize);
2068 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
2069 udf_update_tag(oepos.bh->b_data, epos.offset - adsize);
2071 udf_update_tag(oepos.bh->b_data, sizeof(struct allocExtDesc));
2072 mark_buffer_dirty_inode(oepos.bh, inode);
2078 return (elen >> 30);
2081 int8_t inode_bmap(struct inode *inode, sector_t block, struct extent_position *pos,
2082 kernel_lb_addr *eloc, uint32_t *elen, sector_t *offset)
2084 loff_t lbcount = 0, bcount = (loff_t)block << inode->i_sb->s_blocksize_bits;
2089 printk(KERN_ERR "udf: inode_bmap: block < 0\n");
2094 pos->block = UDF_I_LOCATION(inode);
2100 if ((etype = udf_next_aext(inode, pos, eloc, elen, 1)) == -1)
2102 *offset = (bcount - lbcount) >> inode->i_sb->s_blocksize_bits;
2103 UDF_I_LENEXTENTS(inode) = lbcount;
2107 } while (lbcount <= bcount);
2109 *offset = (bcount + *elen - lbcount) >> inode->i_sb->s_blocksize_bits;
2114 long udf_block_map(struct inode *inode, sector_t block)
2116 kernel_lb_addr eloc;
2119 struct extent_position epos = { NULL, 0, { 0, 0}};
2124 if (inode_bmap(inode, block, &epos, &eloc, &elen, &offset) == (EXT_RECORDED_ALLOCATED >> 30))
2125 ret = udf_get_lb_pblock(inode->i_sb, eloc, offset);
2132 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
2133 return udf_fixed_to_variable(ret);