V4L/DVB (3545): Fixed no_overlay option and quirks on saa7134 driver
[linux-2.6/mini2440.git] / fs / udf / inode.c
blobd04cff2273b681a9944f3a319af83114340341cb
1 /*
2 * inode.c
4 * PURPOSE
5 * Inode handling routines for the OSTA-UDF(tm) filesystem.
7 * COPYRIGHT
8 * This file is distributed under the terms of the GNU General Public
9 * License (GPL). Copies of the GPL can be obtained from:
10 * ftp://prep.ai.mit.edu/pub/gnu/GPL
11 * Each contributing author retains all rights to their own work.
13 * (C) 1998 Dave Boynton
14 * (C) 1998-2004 Ben Fennema
15 * (C) 1999-2000 Stelias Computing Inc
17 * HISTORY
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 #
31 #include "udfdecl.h"
32 #include <linux/mm.h>
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>
40 #include "udf_i.h"
41 #include "udf_sb.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 *, long, int *,
53 long *, int *);
54 static int8_t udf_insert_aext(struct inode *, kernel_lb_addr, int,
55 kernel_lb_addr, uint32_t, struct buffer_head *);
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 kernel_lb_addr, uint32_t, struct buffer_head **);
65 static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int);
68 * udf_delete_inode
70 * PURPOSE
71 * Clean-up before the specified inode is destroyed.
73 * DESCRIPTION
74 * This routine is called when the kernel destroys an inode structure
75 * ie. when iput() finds i_count == 0.
77 * HISTORY
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))
88 goto no_delete;
90 inode->i_size = 0;
91 udf_truncate(inode);
92 lock_kernel();
94 udf_update_inode(inode, IS_SYNC(inode));
95 udf_free_inode(inode);
97 unlock_kernel();
98 return;
99 no_delete:
100 clear_inode(inode);
103 void udf_clear_inode(struct inode *inode)
105 if (!(inode->i_sb->s_flags & MS_RDONLY)) {
106 lock_kernel();
107 udf_discard_prealloc(inode);
108 unlock_kernel();
111 kfree(UDF_I_DATA(inode));
112 UDF_I_DATA(inode) = NULL;
115 static int udf_writepage(struct page *page, struct writeback_control *wbc)
117 return block_write_full_page(page, udf_get_block, wbc);
120 static int udf_readpage(struct file *file, struct page *page)
122 return block_read_full_page(page, udf_get_block);
125 static int udf_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
127 return block_prepare_write(page, from, to, udf_get_block);
130 static sector_t udf_bmap(struct address_space *mapping, sector_t block)
132 return generic_block_bmap(mapping,block,udf_get_block);
135 struct address_space_operations udf_aops = {
136 .readpage = udf_readpage,
137 .writepage = udf_writepage,
138 .sync_page = block_sync_page,
139 .prepare_write = udf_prepare_write,
140 .commit_write = generic_commit_write,
141 .bmap = udf_bmap,
144 void udf_expand_file_adinicb(struct inode * inode, int newsize, int * err)
146 struct page *page;
147 char *kaddr;
148 struct writeback_control udf_wbc = {
149 .sync_mode = WB_SYNC_NONE,
150 .nr_to_write = 1,
153 /* from now on we have normal address_space methods */
154 inode->i_data.a_ops = &udf_aops;
156 if (!UDF_I_LENALLOC(inode))
158 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
159 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
160 else
161 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
162 mark_inode_dirty(inode);
163 return;
166 page = grab_cache_page(inode->i_mapping, 0);
167 BUG_ON(!PageLocked(page));
169 if (!PageUptodate(page))
171 kaddr = kmap(page);
172 memset(kaddr + UDF_I_LENALLOC(inode), 0x00,
173 PAGE_CACHE_SIZE - UDF_I_LENALLOC(inode));
174 memcpy(kaddr, UDF_I_DATA(inode) + UDF_I_LENEATTR(inode),
175 UDF_I_LENALLOC(inode));
176 flush_dcache_page(page);
177 SetPageUptodate(page);
178 kunmap(page);
180 memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode), 0x00,
181 UDF_I_LENALLOC(inode));
182 UDF_I_LENALLOC(inode) = 0;
183 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
184 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_SHORT;
185 else
186 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_LONG;
188 inode->i_data.a_ops->writepage(page, &udf_wbc);
189 page_cache_release(page);
191 mark_inode_dirty(inode);
194 struct buffer_head * udf_expand_dir_adinicb(struct inode *inode, int *block, int *err)
196 int newblock;
197 struct buffer_head *sbh = NULL, *dbh = NULL;
198 kernel_lb_addr bloc, eloc;
199 uint32_t elen, extoffset;
200 uint8_t alloctype;
202 struct udf_fileident_bh sfibh, dfibh;
203 loff_t f_pos = udf_ext0_offset(inode) >> 2;
204 int size = (udf_ext0_offset(inode) + inode->i_size) >> 2;
205 struct fileIdentDesc cfi, *sfi, *dfi;
207 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_USE_SHORT_AD))
208 alloctype = ICBTAG_FLAG_AD_SHORT;
209 else
210 alloctype = ICBTAG_FLAG_AD_LONG;
212 if (!inode->i_size)
214 UDF_I_ALLOCTYPE(inode) = alloctype;
215 mark_inode_dirty(inode);
216 return NULL;
219 /* alloc block, and copy data to it */
220 *block = udf_new_block(inode->i_sb, inode,
221 UDF_I_LOCATION(inode).partitionReferenceNum,
222 UDF_I_LOCATION(inode).logicalBlockNum, err);
224 if (!(*block))
225 return NULL;
226 newblock = udf_get_pblock(inode->i_sb, *block,
227 UDF_I_LOCATION(inode).partitionReferenceNum, 0);
228 if (!newblock)
229 return NULL;
230 dbh = udf_tgetblk(inode->i_sb, newblock);
231 if (!dbh)
232 return NULL;
233 lock_buffer(dbh);
234 memset(dbh->b_data, 0x00, inode->i_sb->s_blocksize);
235 set_buffer_uptodate(dbh);
236 unlock_buffer(dbh);
237 mark_buffer_dirty_inode(dbh, inode);
239 sfibh.soffset = sfibh.eoffset = (f_pos & ((inode->i_sb->s_blocksize - 1) >> 2)) << 2;
240 sbh = sfibh.sbh = sfibh.ebh = NULL;
241 dfibh.soffset = dfibh.eoffset = 0;
242 dfibh.sbh = dfibh.ebh = dbh;
243 while ( (f_pos < size) )
245 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB;
246 sfi = udf_fileident_read(inode, &f_pos, &sfibh, &cfi, NULL, NULL, NULL, NULL, NULL, NULL);
247 if (!sfi)
249 udf_release_data(dbh);
250 return NULL;
252 UDF_I_ALLOCTYPE(inode) = alloctype;
253 sfi->descTag.tagLocation = cpu_to_le32(*block);
254 dfibh.soffset = dfibh.eoffset;
255 dfibh.eoffset += (sfibh.eoffset - sfibh.soffset);
256 dfi = (struct fileIdentDesc *)(dbh->b_data + dfibh.soffset);
257 if (udf_write_fi(inode, sfi, dfi, &dfibh, sfi->impUse,
258 sfi->fileIdent + le16_to_cpu(sfi->lengthOfImpUse)))
260 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB;
261 udf_release_data(dbh);
262 return NULL;
265 mark_buffer_dirty_inode(dbh, inode);
267 memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode), 0, UDF_I_LENALLOC(inode));
268 UDF_I_LENALLOC(inode) = 0;
269 bloc = UDF_I_LOCATION(inode);
270 eloc.logicalBlockNum = *block;
271 eloc.partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
272 elen = inode->i_size;
273 UDF_I_LENEXTENTS(inode) = elen;
274 extoffset = udf_file_entry_alloc_offset(inode);
275 udf_add_aext(inode, &bloc, &extoffset, eloc, elen, &sbh, 0);
276 /* UniqueID stuff */
278 udf_release_data(sbh);
279 mark_inode_dirty(inode);
280 return dbh;
283 static int udf_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create)
285 int err, new;
286 struct buffer_head *bh;
287 unsigned long phys;
289 if (!create)
291 phys = udf_block_map(inode, block);
292 if (phys)
293 map_bh(bh_result, inode->i_sb, phys);
294 return 0;
297 err = -EIO;
298 new = 0;
299 bh = NULL;
301 lock_kernel();
303 if (block < 0)
304 goto abort_negative;
306 if (block == UDF_I_NEXT_ALLOC_BLOCK(inode) + 1)
308 UDF_I_NEXT_ALLOC_BLOCK(inode) ++;
309 UDF_I_NEXT_ALLOC_GOAL(inode) ++;
312 err = 0;
314 bh = inode_getblk(inode, block, &err, &phys, &new);
315 if (bh)
316 BUG();
317 if (err)
318 goto abort;
319 if (!phys)
320 BUG();
322 if (new)
323 set_buffer_new(bh_result);
324 map_bh(bh_result, inode->i_sb, phys);
325 abort:
326 unlock_kernel();
327 return err;
329 abort_negative:
330 udf_warning(inode->i_sb, "udf_get_block", "block < 0");
331 goto abort;
334 static struct buffer_head *
335 udf_getblk(struct inode *inode, long block, int create, int *err)
337 struct buffer_head dummy;
339 dummy.b_state = 0;
340 dummy.b_blocknr = -1000;
341 *err = udf_get_block(inode, block, &dummy, create);
342 if (!*err && buffer_mapped(&dummy))
344 struct buffer_head *bh;
345 bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
346 if (buffer_new(&dummy))
348 lock_buffer(bh);
349 memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
350 set_buffer_uptodate(bh);
351 unlock_buffer(bh);
352 mark_buffer_dirty_inode(bh, inode);
354 return bh;
356 return NULL;
359 static struct buffer_head * inode_getblk(struct inode * inode, long block,
360 int *err, long *phys, int *new)
362 struct buffer_head *pbh = NULL, *cbh = NULL, *nbh = NULL, *result = NULL;
363 kernel_long_ad laarr[EXTENT_MERGE_SIZE];
364 uint32_t pextoffset = 0, cextoffset = 0, nextoffset = 0;
365 int count = 0, startnum = 0, endnum = 0;
366 uint32_t elen = 0;
367 kernel_lb_addr eloc, pbloc, cbloc, nbloc;
368 int c = 1;
369 uint64_t lbcount = 0, b_off = 0;
370 uint32_t newblocknum, newblock, offset = 0;
371 int8_t etype;
372 int goal = 0, pgoal = UDF_I_LOCATION(inode).logicalBlockNum;
373 char lastblock = 0;
375 pextoffset = cextoffset = nextoffset = udf_file_entry_alloc_offset(inode);
376 b_off = (uint64_t)block << inode->i_sb->s_blocksize_bits;
377 pbloc = cbloc = nbloc = UDF_I_LOCATION(inode);
379 /* find the extent which contains the block we are looking for.
380 alternate between laarr[0] and laarr[1] for locations of the
381 current extent, and the previous extent */
384 if (pbh != cbh)
386 udf_release_data(pbh);
387 atomic_inc(&cbh->b_count);
388 pbh = cbh;
390 if (cbh != nbh)
392 udf_release_data(cbh);
393 atomic_inc(&nbh->b_count);
394 cbh = nbh;
397 lbcount += elen;
399 pbloc = cbloc;
400 cbloc = nbloc;
402 pextoffset = cextoffset;
403 cextoffset = nextoffset;
405 if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) == -1)
406 break;
408 c = !c;
410 laarr[c].extLength = (etype << 30) | elen;
411 laarr[c].extLocation = eloc;
413 if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
414 pgoal = eloc.logicalBlockNum +
415 ((elen + inode->i_sb->s_blocksize - 1) >>
416 inode->i_sb->s_blocksize_bits);
418 count ++;
419 } while (lbcount + elen <= b_off);
421 b_off -= lbcount;
422 offset = b_off >> inode->i_sb->s_blocksize_bits;
424 /* if the extent is allocated and recorded, return the block
425 if the extent is not a multiple of the blocksize, round up */
427 if (etype == (EXT_RECORDED_ALLOCATED >> 30))
429 if (elen & (inode->i_sb->s_blocksize - 1))
431 elen = EXT_RECORDED_ALLOCATED |
432 ((elen + inode->i_sb->s_blocksize - 1) &
433 ~(inode->i_sb->s_blocksize - 1));
434 etype = udf_write_aext(inode, nbloc, &cextoffset, eloc, elen, nbh, 1);
436 udf_release_data(pbh);
437 udf_release_data(cbh);
438 udf_release_data(nbh);
439 newblock = udf_get_lb_pblock(inode->i_sb, eloc, offset);
440 *phys = newblock;
441 return NULL;
444 if (etype == -1)
446 endnum = startnum = ((count > 1) ? 1 : count);
447 if (laarr[c].extLength & (inode->i_sb->s_blocksize - 1))
449 laarr[c].extLength =
450 (laarr[c].extLength & UDF_EXTENT_FLAG_MASK) |
451 (((laarr[c].extLength & UDF_EXTENT_LENGTH_MASK) +
452 inode->i_sb->s_blocksize - 1) &
453 ~(inode->i_sb->s_blocksize - 1));
454 UDF_I_LENEXTENTS(inode) =
455 (UDF_I_LENEXTENTS(inode) + inode->i_sb->s_blocksize - 1) &
456 ~(inode->i_sb->s_blocksize - 1);
458 c = !c;
459 laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
460 ((offset + 1) << inode->i_sb->s_blocksize_bits);
461 memset(&laarr[c].extLocation, 0x00, sizeof(kernel_lb_addr));
462 count ++;
463 endnum ++;
464 lastblock = 1;
466 else
467 endnum = startnum = ((count > 2) ? 2 : count);
469 /* if the current extent is in position 0, swap it with the previous */
470 if (!c && count != 1)
472 laarr[2] = laarr[0];
473 laarr[0] = laarr[1];
474 laarr[1] = laarr[2];
475 c = 1;
478 /* if the current block is located in a extent, read the next extent */
479 if (etype != -1)
481 if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 0)) != -1)
483 laarr[c+1].extLength = (etype << 30) | elen;
484 laarr[c+1].extLocation = eloc;
485 count ++;
486 startnum ++;
487 endnum ++;
489 else
490 lastblock = 1;
492 udf_release_data(cbh);
493 udf_release_data(nbh);
495 /* if the current extent is not recorded but allocated, get the
496 block in the extent corresponding to the requested block */
497 if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
498 newblocknum = laarr[c].extLocation.logicalBlockNum + offset;
499 else /* otherwise, allocate a new block */
501 if (UDF_I_NEXT_ALLOC_BLOCK(inode) == block)
502 goal = UDF_I_NEXT_ALLOC_GOAL(inode);
504 if (!goal)
506 if (!(goal = pgoal))
507 goal = UDF_I_LOCATION(inode).logicalBlockNum + 1;
510 if (!(newblocknum = udf_new_block(inode->i_sb, inode,
511 UDF_I_LOCATION(inode).partitionReferenceNum, goal, err)))
513 udf_release_data(pbh);
514 *err = -ENOSPC;
515 return NULL;
517 UDF_I_LENEXTENTS(inode) += inode->i_sb->s_blocksize;
520 /* if the extent the requsted block is located in contains multiple blocks,
521 split the extent into at most three extents. blocks prior to requested
522 block, requested block, and blocks after requested block */
523 udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);
525 #ifdef UDF_PREALLOCATE
526 /* preallocate blocks */
527 udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
528 #endif
530 /* merge any continuous blocks in laarr */
531 udf_merge_extents(inode, laarr, &endnum);
533 /* write back the new extents, inserting new extents if the new number
534 of extents is greater than the old number, and deleting extents if
535 the new number of extents is less than the old number */
536 udf_update_extents(inode, laarr, startnum, endnum, pbloc, pextoffset, &pbh);
538 udf_release_data(pbh);
540 if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum,
541 UDF_I_LOCATION(inode).partitionReferenceNum, 0)))
543 return NULL;
545 *phys = newblock;
546 *err = 0;
547 *new = 1;
548 UDF_I_NEXT_ALLOC_BLOCK(inode) = block;
549 UDF_I_NEXT_ALLOC_GOAL(inode) = newblocknum;
550 inode->i_ctime = current_fs_time(inode->i_sb);
552 if (IS_SYNC(inode))
553 udf_sync_inode(inode);
554 else
555 mark_inode_dirty(inode);
556 return result;
559 static void udf_split_extents(struct inode *inode, int *c, int offset, int newblocknum,
560 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
562 if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) ||
563 (laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
565 int curr = *c;
566 int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) +
567 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
568 int8_t etype = (laarr[curr].extLength >> 30);
570 if (blen == 1)
572 else if (!offset || blen == offset + 1)
574 laarr[curr+2] = laarr[curr+1];
575 laarr[curr+1] = laarr[curr];
577 else
579 laarr[curr+3] = laarr[curr+1];
580 laarr[curr+2] = laarr[curr+1] = laarr[curr];
583 if (offset)
585 if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
587 udf_free_blocks(inode->i_sb, inode, laarr[curr].extLocation, 0, offset);
588 laarr[curr].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
589 (offset << inode->i_sb->s_blocksize_bits);
590 laarr[curr].extLocation.logicalBlockNum = 0;
591 laarr[curr].extLocation.partitionReferenceNum = 0;
593 else
594 laarr[curr].extLength = (etype << 30) |
595 (offset << inode->i_sb->s_blocksize_bits);
596 curr ++;
597 (*c) ++;
598 (*endnum) ++;
601 laarr[curr].extLocation.logicalBlockNum = newblocknum;
602 if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
603 laarr[curr].extLocation.partitionReferenceNum =
604 UDF_I_LOCATION(inode).partitionReferenceNum;
605 laarr[curr].extLength = EXT_RECORDED_ALLOCATED |
606 inode->i_sb->s_blocksize;
607 curr ++;
609 if (blen != offset + 1)
611 if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
612 laarr[curr].extLocation.logicalBlockNum += (offset + 1);
613 laarr[curr].extLength = (etype << 30) |
614 ((blen - (offset + 1)) << inode->i_sb->s_blocksize_bits);
615 curr ++;
616 (*endnum) ++;
621 static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
622 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
624 int start, length = 0, currlength = 0, i;
626 if (*endnum >= (c+1))
628 if (!lastblock)
629 return;
630 else
631 start = c;
633 else
635 if ((laarr[c+1].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
637 start = c+1;
638 length = currlength = (((laarr[c+1].extLength & UDF_EXTENT_LENGTH_MASK) +
639 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
641 else
642 start = c;
645 for (i=start+1; i<=*endnum; i++)
647 if (i == *endnum)
649 if (lastblock)
650 length += UDF_DEFAULT_PREALLOC_BLOCKS;
652 else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
653 length += (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
654 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
655 else
656 break;
659 if (length)
661 int next = laarr[start].extLocation.logicalBlockNum +
662 (((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) +
663 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
664 int numalloc = udf_prealloc_blocks(inode->i_sb, inode,
665 laarr[start].extLocation.partitionReferenceNum,
666 next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ? length :
667 UDF_DEFAULT_PREALLOC_BLOCKS) - currlength);
669 if (numalloc)
671 if (start == (c+1))
672 laarr[start].extLength +=
673 (numalloc << inode->i_sb->s_blocksize_bits);
674 else
676 memmove(&laarr[c+2], &laarr[c+1],
677 sizeof(long_ad) * (*endnum - (c+1)));
678 (*endnum) ++;
679 laarr[c+1].extLocation.logicalBlockNum = next;
680 laarr[c+1].extLocation.partitionReferenceNum =
681 laarr[c].extLocation.partitionReferenceNum;
682 laarr[c+1].extLength = EXT_NOT_RECORDED_ALLOCATED |
683 (numalloc << inode->i_sb->s_blocksize_bits);
684 start = c+1;
687 for (i=start+1; numalloc && i<*endnum; i++)
689 int elen = ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
690 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
692 if (elen > numalloc)
694 laarr[i].extLength -=
695 (numalloc << inode->i_sb->s_blocksize_bits);
696 numalloc = 0;
698 else
700 numalloc -= elen;
701 if (*endnum > (i+1))
702 memmove(&laarr[i], &laarr[i+1],
703 sizeof(long_ad) * (*endnum - (i+1)));
704 i --;
705 (*endnum) --;
708 UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
713 static void udf_merge_extents(struct inode *inode,
714 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
716 int i;
718 for (i=0; i<(*endnum-1); i++)
720 if ((laarr[i].extLength >> 30) == (laarr[i+1].extLength >> 30))
722 if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) ||
723 ((laarr[i+1].extLocation.logicalBlockNum - laarr[i].extLocation.logicalBlockNum) ==
724 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
725 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits)))
727 if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
728 (laarr[i+1].extLength & UDF_EXTENT_LENGTH_MASK) +
729 inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK)
731 laarr[i+1].extLength = (laarr[i+1].extLength -
732 (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
733 UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize-1);
734 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) +
735 (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize;
736 laarr[i+1].extLocation.logicalBlockNum =
737 laarr[i].extLocation.logicalBlockNum +
738 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) >>
739 inode->i_sb->s_blocksize_bits);
741 else
743 laarr[i].extLength = laarr[i+1].extLength +
744 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
745 inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize-1));
746 if (*endnum > (i+2))
747 memmove(&laarr[i+1], &laarr[i+2],
748 sizeof(long_ad) * (*endnum - (i+2)));
749 i --;
750 (*endnum) --;
754 else if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) &&
755 ((laarr[i+1].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)))
757 udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0,
758 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
759 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
760 laarr[i].extLocation.logicalBlockNum = 0;
761 laarr[i].extLocation.partitionReferenceNum = 0;
763 if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
764 (laarr[i+1].extLength & UDF_EXTENT_LENGTH_MASK) +
765 inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK)
767 laarr[i+1].extLength = (laarr[i+1].extLength -
768 (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
769 UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize-1);
770 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) +
771 (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize;
773 else
775 laarr[i].extLength = laarr[i+1].extLength +
776 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
777 inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize-1));
778 if (*endnum > (i+2))
779 memmove(&laarr[i+1], &laarr[i+2],
780 sizeof(long_ad) * (*endnum - (i+2)));
781 i --;
782 (*endnum) --;
785 else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
787 udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0,
788 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
789 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
790 laarr[i].extLocation.logicalBlockNum = 0;
791 laarr[i].extLocation.partitionReferenceNum = 0;
792 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) |
793 EXT_NOT_RECORDED_NOT_ALLOCATED;
798 static void udf_update_extents(struct inode *inode,
799 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int startnum, int endnum,
800 kernel_lb_addr pbloc, uint32_t pextoffset, struct buffer_head **pbh)
802 int start = 0, i;
803 kernel_lb_addr tmploc;
804 uint32_t tmplen;
806 if (startnum > endnum)
808 for (i=0; i<(startnum-endnum); i++)
810 udf_delete_aext(inode, pbloc, pextoffset, laarr[i].extLocation,
811 laarr[i].extLength, *pbh);
814 else if (startnum < endnum)
816 for (i=0; i<(endnum-startnum); i++)
818 udf_insert_aext(inode, pbloc, pextoffset, laarr[i].extLocation,
819 laarr[i].extLength, *pbh);
820 udf_next_aext(inode, &pbloc, &pextoffset, &laarr[i].extLocation,
821 &laarr[i].extLength, pbh, 1);
822 start ++;
826 for (i=start; i<endnum; i++)
828 udf_next_aext(inode, &pbloc, &pextoffset, &tmploc, &tmplen, pbh, 0);
829 udf_write_aext(inode, pbloc, &pextoffset, laarr[i].extLocation,
830 laarr[i].extLength, *pbh, 1);
834 struct buffer_head * udf_bread(struct inode * inode, int block,
835 int create, int * err)
837 struct buffer_head * bh = NULL;
839 bh = udf_getblk(inode, block, create, err);
840 if (!bh)
841 return NULL;
843 if (buffer_uptodate(bh))
844 return bh;
845 ll_rw_block(READ, 1, &bh);
846 wait_on_buffer(bh);
847 if (buffer_uptodate(bh))
848 return bh;
849 brelse(bh);
850 *err = -EIO;
851 return NULL;
854 void udf_truncate(struct inode * inode)
856 int offset;
857 int err;
859 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
860 S_ISLNK(inode->i_mode)))
861 return;
862 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
863 return;
865 lock_kernel();
866 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
868 if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +
869 inode->i_size))
871 udf_expand_file_adinicb(inode, inode->i_size, &err);
872 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
874 inode->i_size = UDF_I_LENALLOC(inode);
875 unlock_kernel();
876 return;
878 else
879 udf_truncate_extents(inode);
881 else
883 offset = inode->i_size & (inode->i_sb->s_blocksize - 1);
884 memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset, 0x00, inode->i_sb->s_blocksize - offset - udf_file_entry_alloc_offset(inode));
885 UDF_I_LENALLOC(inode) = inode->i_size;
888 else
890 block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block);
891 udf_truncate_extents(inode);
894 inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
895 if (IS_SYNC(inode))
896 udf_sync_inode (inode);
897 else
898 mark_inode_dirty(inode);
899 unlock_kernel();
902 static void
903 __udf_read_inode(struct inode *inode)
905 struct buffer_head *bh = NULL;
906 struct fileEntry *fe;
907 uint16_t ident;
910 * Set defaults, but the inode is still incomplete!
911 * Note: get_new_inode() sets the following on a new inode:
912 * i_sb = sb
913 * i_no = ino
914 * i_flags = sb->s_flags
915 * i_state = 0
916 * clean_inode(): zero fills and sets
917 * i_count = 1
918 * i_nlink = 1
919 * i_op = NULL;
921 inode->i_blksize = PAGE_SIZE;
923 bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident);
925 if (!bh)
927 printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n",
928 inode->i_ino);
929 make_bad_inode(inode);
930 return;
933 if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE &&
934 ident != TAG_IDENT_USE)
936 printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed ident=%d\n",
937 inode->i_ino, ident);
938 udf_release_data(bh);
939 make_bad_inode(inode);
940 return;
943 fe = (struct fileEntry *)bh->b_data;
945 if (le16_to_cpu(fe->icbTag.strategyType) == 4096)
947 struct buffer_head *ibh = NULL, *nbh = NULL;
948 struct indirectEntry *ie;
950 ibh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 1, &ident);
951 if (ident == TAG_IDENT_IE)
953 if (ibh)
955 kernel_lb_addr loc;
956 ie = (struct indirectEntry *)ibh->b_data;
958 loc = lelb_to_cpu(ie->indirectICB.extLocation);
960 if (ie->indirectICB.extLength &&
961 (nbh = udf_read_ptagged(inode->i_sb, loc, 0, &ident)))
963 if (ident == TAG_IDENT_FE ||
964 ident == TAG_IDENT_EFE)
966 memcpy(&UDF_I_LOCATION(inode), &loc, sizeof(kernel_lb_addr));
967 udf_release_data(bh);
968 udf_release_data(ibh);
969 udf_release_data(nbh);
970 __udf_read_inode(inode);
971 return;
973 else
975 udf_release_data(nbh);
976 udf_release_data(ibh);
979 else
980 udf_release_data(ibh);
983 else
984 udf_release_data(ibh);
986 else if (le16_to_cpu(fe->icbTag.strategyType) != 4)
988 printk(KERN_ERR "udf: unsupported strategy type: %d\n",
989 le16_to_cpu(fe->icbTag.strategyType));
990 udf_release_data(bh);
991 make_bad_inode(inode);
992 return;
994 udf_fill_inode(inode, bh);
995 udf_release_data(bh);
998 static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
1000 struct fileEntry *fe;
1001 struct extendedFileEntry *efe;
1002 time_t convtime;
1003 long convtime_usec;
1004 int offset;
1006 fe = (struct fileEntry *)bh->b_data;
1007 efe = (struct extendedFileEntry *)bh->b_data;
1009 if (le16_to_cpu(fe->icbTag.strategyType) == 4)
1010 UDF_I_STRAT4096(inode) = 0;
1011 else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */
1012 UDF_I_STRAT4096(inode) = 1;
1014 UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICBTAG_FLAG_AD_MASK;
1015 UDF_I_UNIQUE(inode) = 0;
1016 UDF_I_LENEATTR(inode) = 0;
1017 UDF_I_LENEXTENTS(inode) = 0;
1018 UDF_I_LENALLOC(inode) = 0;
1019 UDF_I_NEXT_ALLOC_BLOCK(inode) = 0;
1020 UDF_I_NEXT_ALLOC_GOAL(inode) = 0;
1021 if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_EFE)
1023 UDF_I_EFE(inode) = 1;
1024 UDF_I_USE(inode) = 0;
1025 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry), GFP_KERNEL);
1026 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct extendedFileEntry), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
1028 else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE)
1030 UDF_I_EFE(inode) = 0;
1031 UDF_I_USE(inode) = 0;
1032 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct fileEntry), GFP_KERNEL);
1033 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct fileEntry), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1035 else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1037 UDF_I_EFE(inode) = 0;
1038 UDF_I_USE(inode) = 1;
1039 UDF_I_LENALLOC(inode) =
1040 le32_to_cpu(
1041 ((struct unallocSpaceEntry *)bh->b_data)->lengthAllocDescs);
1042 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry), GFP_KERNEL);
1043 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct unallocSpaceEntry), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
1044 return;
1047 inode->i_uid = le32_to_cpu(fe->uid);
1048 if (inode->i_uid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1049 UDF_FLAG_UID_IGNORE))
1050 inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
1052 inode->i_gid = le32_to_cpu(fe->gid);
1053 if (inode->i_gid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1054 UDF_FLAG_GID_IGNORE))
1055 inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
1057 inode->i_nlink = le16_to_cpu(fe->fileLinkCount);
1058 if (!inode->i_nlink)
1059 inode->i_nlink = 1;
1061 inode->i_size = le64_to_cpu(fe->informationLength);
1062 UDF_I_LENEXTENTS(inode) = inode->i_size;
1064 inode->i_mode = udf_convert_permissions(fe);
1065 inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask;
1067 if (UDF_I_EFE(inode) == 0)
1069 inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
1070 (inode->i_sb->s_blocksize_bits - 9);
1072 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1073 lets_to_cpu(fe->accessTime)) )
1075 inode->i_atime.tv_sec = convtime;
1076 inode->i_atime.tv_nsec = convtime_usec * 1000;
1078 else
1080 inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1083 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1084 lets_to_cpu(fe->modificationTime)) )
1086 inode->i_mtime.tv_sec = convtime;
1087 inode->i_mtime.tv_nsec = convtime_usec * 1000;
1089 else
1091 inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1094 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1095 lets_to_cpu(fe->attrTime)) )
1097 inode->i_ctime.tv_sec = convtime;
1098 inode->i_ctime.tv_nsec = convtime_usec * 1000;
1100 else
1102 inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1105 UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID);
1106 UDF_I_LENEATTR(inode) = le32_to_cpu(fe->lengthExtendedAttr);
1107 UDF_I_LENALLOC(inode) = le32_to_cpu(fe->lengthAllocDescs);
1108 offset = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode);
1110 else
1112 inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
1113 (inode->i_sb->s_blocksize_bits - 9);
1115 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1116 lets_to_cpu(efe->accessTime)) )
1118 inode->i_atime.tv_sec = convtime;
1119 inode->i_atime.tv_nsec = convtime_usec * 1000;
1121 else
1123 inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1126 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1127 lets_to_cpu(efe->modificationTime)) )
1129 inode->i_mtime.tv_sec = convtime;
1130 inode->i_mtime.tv_nsec = convtime_usec * 1000;
1132 else
1134 inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1137 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1138 lets_to_cpu(efe->createTime)) )
1140 UDF_I_CRTIME(inode).tv_sec = convtime;
1141 UDF_I_CRTIME(inode).tv_nsec = convtime_usec * 1000;
1143 else
1145 UDF_I_CRTIME(inode) = UDF_SB_RECORDTIME(inode->i_sb);
1148 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1149 lets_to_cpu(efe->attrTime)) )
1151 inode->i_ctime.tv_sec = convtime;
1152 inode->i_ctime.tv_nsec = convtime_usec * 1000;
1154 else
1156 inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1159 UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID);
1160 UDF_I_LENEATTR(inode) = le32_to_cpu(efe->lengthExtendedAttr);
1161 UDF_I_LENALLOC(inode) = le32_to_cpu(efe->lengthAllocDescs);
1162 offset = sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode);
1165 switch (fe->icbTag.fileType)
1167 case ICBTAG_FILE_TYPE_DIRECTORY:
1169 inode->i_op = &udf_dir_inode_operations;
1170 inode->i_fop = &udf_dir_operations;
1171 inode->i_mode |= S_IFDIR;
1172 inode->i_nlink ++;
1173 break;
1175 case ICBTAG_FILE_TYPE_REALTIME:
1176 case ICBTAG_FILE_TYPE_REGULAR:
1177 case ICBTAG_FILE_TYPE_UNDEF:
1179 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
1180 inode->i_data.a_ops = &udf_adinicb_aops;
1181 else
1182 inode->i_data.a_ops = &udf_aops;
1183 inode->i_op = &udf_file_inode_operations;
1184 inode->i_fop = &udf_file_operations;
1185 inode->i_mode |= S_IFREG;
1186 break;
1188 case ICBTAG_FILE_TYPE_BLOCK:
1190 inode->i_mode |= S_IFBLK;
1191 break;
1193 case ICBTAG_FILE_TYPE_CHAR:
1195 inode->i_mode |= S_IFCHR;
1196 break;
1198 case ICBTAG_FILE_TYPE_FIFO:
1200 init_special_inode(inode, inode->i_mode | S_IFIFO, 0);
1201 break;
1203 case ICBTAG_FILE_TYPE_SOCKET:
1205 init_special_inode(inode, inode->i_mode | S_IFSOCK, 0);
1206 break;
1208 case ICBTAG_FILE_TYPE_SYMLINK:
1210 inode->i_data.a_ops = &udf_symlink_aops;
1211 inode->i_op = &page_symlink_inode_operations;
1212 inode->i_mode = S_IFLNK|S_IRWXUGO;
1213 break;
1215 default:
1217 printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown file type=%d\n",
1218 inode->i_ino, fe->icbTag.fileType);
1219 make_bad_inode(inode);
1220 return;
1223 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1225 struct deviceSpec *dsea =
1226 (struct deviceSpec *)
1227 udf_get_extendedattr(inode, 12, 1);
1229 if (dsea)
1231 init_special_inode(inode, inode->i_mode, MKDEV(
1232 le32_to_cpu(dsea->majorDeviceIdent),
1233 le32_to_cpu(dsea->minorDeviceIdent)));
1234 /* Developer ID ??? */
1236 else
1238 make_bad_inode(inode);
1243 static mode_t
1244 udf_convert_permissions(struct fileEntry *fe)
1246 mode_t mode;
1247 uint32_t permissions;
1248 uint32_t flags;
1250 permissions = le32_to_cpu(fe->permissions);
1251 flags = le16_to_cpu(fe->icbTag.flags);
1253 mode = (( permissions ) & S_IRWXO) |
1254 (( permissions >> 2 ) & S_IRWXG) |
1255 (( permissions >> 4 ) & S_IRWXU) |
1256 (( flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) |
1257 (( flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) |
1258 (( flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0);
1260 return mode;
1264 * udf_write_inode
1266 * PURPOSE
1267 * Write out the specified inode.
1269 * DESCRIPTION
1270 * This routine is called whenever an inode is synced.
1271 * Currently this routine is just a placeholder.
1273 * HISTORY
1274 * July 1, 1997 - Andrew E. Mileski
1275 * Written, tested, and released.
1278 int udf_write_inode(struct inode * inode, int sync)
1280 int ret;
1281 lock_kernel();
1282 ret = udf_update_inode(inode, sync);
1283 unlock_kernel();
1284 return ret;
1287 int udf_sync_inode(struct inode * inode)
1289 return udf_update_inode(inode, 1);
1292 static int
1293 udf_update_inode(struct inode *inode, int do_sync)
1295 struct buffer_head *bh = NULL;
1296 struct fileEntry *fe;
1297 struct extendedFileEntry *efe;
1298 uint32_t udfperms;
1299 uint16_t icbflags;
1300 uint16_t crclen;
1301 int i;
1302 kernel_timestamp cpu_time;
1303 int err = 0;
1305 bh = udf_tread(inode->i_sb,
1306 udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0));
1308 if (!bh)
1310 udf_debug("bread failure\n");
1311 return -EIO;
1314 memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
1316 fe = (struct fileEntry *)bh->b_data;
1317 efe = (struct extendedFileEntry *)bh->b_data;
1319 if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1321 struct unallocSpaceEntry *use =
1322 (struct unallocSpaceEntry *)bh->b_data;
1324 use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1325 memcpy(bh->b_data + sizeof(struct unallocSpaceEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
1326 crclen = sizeof(struct unallocSpaceEntry) + UDF_I_LENALLOC(inode) -
1327 sizeof(tag);
1328 use->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1329 use->descTag.descCRCLength = cpu_to_le16(crclen);
1330 use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0));
1332 use->descTag.tagChecksum = 0;
1333 for (i=0; i<16; i++)
1334 if (i != 4)
1335 use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i];
1337 mark_buffer_dirty(bh);
1338 udf_release_data(bh);
1339 return err;
1342 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET))
1343 fe->uid = cpu_to_le32(-1);
1344 else if (inode->i_uid != UDF_SB(inode->i_sb)->s_uid)
1345 fe->uid = cpu_to_le32(inode->i_uid);
1347 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET))
1348 fe->gid = cpu_to_le32(-1);
1349 else if (inode->i_gid != UDF_SB(inode->i_sb)->s_gid)
1350 fe->gid = cpu_to_le32(inode->i_gid);
1352 udfperms = ((inode->i_mode & S_IRWXO) ) |
1353 ((inode->i_mode & S_IRWXG) << 2) |
1354 ((inode->i_mode & S_IRWXU) << 4);
1356 udfperms |= (le32_to_cpu(fe->permissions) &
1357 (FE_PERM_O_DELETE | FE_PERM_O_CHATTR |
1358 FE_PERM_G_DELETE | FE_PERM_G_CHATTR |
1359 FE_PERM_U_DELETE | FE_PERM_U_CHATTR));
1360 fe->permissions = cpu_to_le32(udfperms);
1362 if (S_ISDIR(inode->i_mode))
1363 fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1);
1364 else
1365 fe->fileLinkCount = cpu_to_le16(inode->i_nlink);
1367 fe->informationLength = cpu_to_le64(inode->i_size);
1369 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1371 regid *eid;
1372 struct deviceSpec *dsea =
1373 (struct deviceSpec *)
1374 udf_get_extendedattr(inode, 12, 1);
1376 if (!dsea)
1378 dsea = (struct deviceSpec *)
1379 udf_add_extendedattr(inode,
1380 sizeof(struct deviceSpec) +
1381 sizeof(regid), 12, 0x3);
1382 dsea->attrType = cpu_to_le32(12);
1383 dsea->attrSubtype = 1;
1384 dsea->attrLength = cpu_to_le32(sizeof(struct deviceSpec) +
1385 sizeof(regid));
1386 dsea->impUseLength = cpu_to_le32(sizeof(regid));
1388 eid = (regid *)dsea->impUse;
1389 memset(eid, 0, sizeof(regid));
1390 strcpy(eid->ident, UDF_ID_DEVELOPER);
1391 eid->identSuffix[0] = UDF_OS_CLASS_UNIX;
1392 eid->identSuffix[1] = UDF_OS_ID_LINUX;
1393 dsea->majorDeviceIdent = cpu_to_le32(imajor(inode));
1394 dsea->minorDeviceIdent = cpu_to_le32(iminor(inode));
1397 if (UDF_I_EFE(inode) == 0)
1399 memcpy(bh->b_data + sizeof(struct fileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1400 fe->logicalBlocksRecorded = cpu_to_le64(
1401 (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1402 (inode->i_sb->s_blocksize_bits - 9));
1404 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1405 fe->accessTime = cpu_to_lets(cpu_time);
1406 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1407 fe->modificationTime = cpu_to_lets(cpu_time);
1408 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1409 fe->attrTime = cpu_to_lets(cpu_time);
1410 memset(&(fe->impIdent), 0, sizeof(regid));
1411 strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
1412 fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1413 fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1414 fe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1415 fe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1416 fe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1417 fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE);
1418 crclen = sizeof(struct fileEntry);
1420 else
1422 memcpy(bh->b_data + sizeof(struct extendedFileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
1423 efe->objectSize = cpu_to_le64(inode->i_size);
1424 efe->logicalBlocksRecorded = cpu_to_le64(
1425 (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1426 (inode->i_sb->s_blocksize_bits - 9));
1428 if (UDF_I_CRTIME(inode).tv_sec > inode->i_atime.tv_sec ||
1429 (UDF_I_CRTIME(inode).tv_sec == inode->i_atime.tv_sec &&
1430 UDF_I_CRTIME(inode).tv_nsec > inode->i_atime.tv_nsec))
1432 UDF_I_CRTIME(inode) = inode->i_atime;
1434 if (UDF_I_CRTIME(inode).tv_sec > inode->i_mtime.tv_sec ||
1435 (UDF_I_CRTIME(inode).tv_sec == inode->i_mtime.tv_sec &&
1436 UDF_I_CRTIME(inode).tv_nsec > inode->i_mtime.tv_nsec))
1438 UDF_I_CRTIME(inode) = inode->i_mtime;
1440 if (UDF_I_CRTIME(inode).tv_sec > inode->i_ctime.tv_sec ||
1441 (UDF_I_CRTIME(inode).tv_sec == inode->i_ctime.tv_sec &&
1442 UDF_I_CRTIME(inode).tv_nsec > inode->i_ctime.tv_nsec))
1444 UDF_I_CRTIME(inode) = inode->i_ctime;
1447 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1448 efe->accessTime = cpu_to_lets(cpu_time);
1449 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1450 efe->modificationTime = cpu_to_lets(cpu_time);
1451 if (udf_time_to_stamp(&cpu_time, UDF_I_CRTIME(inode)))
1452 efe->createTime = cpu_to_lets(cpu_time);
1453 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1454 efe->attrTime = cpu_to_lets(cpu_time);
1456 memset(&(efe->impIdent), 0, sizeof(regid));
1457 strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
1458 efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1459 efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1460 efe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1461 efe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1462 efe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1463 efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE);
1464 crclen = sizeof(struct extendedFileEntry);
1466 if (UDF_I_STRAT4096(inode))
1468 fe->icbTag.strategyType = cpu_to_le16(4096);
1469 fe->icbTag.strategyParameter = cpu_to_le16(1);
1470 fe->icbTag.numEntries = cpu_to_le16(2);
1472 else
1474 fe->icbTag.strategyType = cpu_to_le16(4);
1475 fe->icbTag.numEntries = cpu_to_le16(1);
1478 if (S_ISDIR(inode->i_mode))
1479 fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY;
1480 else if (S_ISREG(inode->i_mode))
1481 fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR;
1482 else if (S_ISLNK(inode->i_mode))
1483 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SYMLINK;
1484 else if (S_ISBLK(inode->i_mode))
1485 fe->icbTag.fileType = ICBTAG_FILE_TYPE_BLOCK;
1486 else if (S_ISCHR(inode->i_mode))
1487 fe->icbTag.fileType = ICBTAG_FILE_TYPE_CHAR;
1488 else if (S_ISFIFO(inode->i_mode))
1489 fe->icbTag.fileType = ICBTAG_FILE_TYPE_FIFO;
1490 else if (S_ISSOCK(inode->i_mode))
1491 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET;
1493 icbflags = UDF_I_ALLOCTYPE(inode) |
1494 ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) |
1495 ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) |
1496 ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) |
1497 (le16_to_cpu(fe->icbTag.flags) &
1498 ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID |
1499 ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY));
1501 fe->icbTag.flags = cpu_to_le16(icbflags);
1502 if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1503 fe->descTag.descVersion = cpu_to_le16(3);
1504 else
1505 fe->descTag.descVersion = cpu_to_le16(2);
1506 fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb));
1507 fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1508 crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag);
1509 fe->descTag.descCRCLength = cpu_to_le16(crclen);
1510 fe->descTag.descCRC = cpu_to_le16(udf_crc((char *)fe + sizeof(tag), crclen, 0));
1512 fe->descTag.tagChecksum = 0;
1513 for (i=0; i<16; i++)
1514 if (i != 4)
1515 fe->descTag.tagChecksum += ((uint8_t *)&(fe->descTag))[i];
1517 /* write the data blocks */
1518 mark_buffer_dirty(bh);
1519 if (do_sync)
1521 sync_dirty_buffer(bh);
1522 if (buffer_req(bh) && !buffer_uptodate(bh))
1524 printk("IO error syncing udf inode [%s:%08lx]\n",
1525 inode->i_sb->s_id, inode->i_ino);
1526 err = -EIO;
1529 udf_release_data(bh);
1530 return err;
1533 struct inode *
1534 udf_iget(struct super_block *sb, kernel_lb_addr ino)
1536 unsigned long block = udf_get_lb_pblock(sb, ino, 0);
1537 struct inode *inode = iget_locked(sb, block);
1539 if (!inode)
1540 return NULL;
1542 if (inode->i_state & I_NEW) {
1543 memcpy(&UDF_I_LOCATION(inode), &ino, sizeof(kernel_lb_addr));
1544 __udf_read_inode(inode);
1545 unlock_new_inode(inode);
1548 if (is_bad_inode(inode))
1549 goto out_iput;
1551 if (ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) {
1552 udf_debug("block=%d, partition=%d out of range\n",
1553 ino.logicalBlockNum, ino.partitionReferenceNum);
1554 make_bad_inode(inode);
1555 goto out_iput;
1558 return inode;
1560 out_iput:
1561 iput(inode);
1562 return NULL;
1565 int8_t udf_add_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1566 kernel_lb_addr eloc, uint32_t elen, struct buffer_head **bh, int inc)
1568 int adsize;
1569 short_ad *sad = NULL;
1570 long_ad *lad = NULL;
1571 struct allocExtDesc *aed;
1572 int8_t etype;
1573 uint8_t *ptr;
1575 if (!*bh)
1576 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1577 else
1578 ptr = (*bh)->b_data + *extoffset;
1580 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
1581 adsize = sizeof(short_ad);
1582 else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
1583 adsize = sizeof(long_ad);
1584 else
1585 return -1;
1587 if (*extoffset + (2 * adsize) > inode->i_sb->s_blocksize)
1589 char *sptr, *dptr;
1590 struct buffer_head *nbh;
1591 int err, loffset;
1592 kernel_lb_addr obloc = *bloc;
1594 if (!(bloc->logicalBlockNum = udf_new_block(inode->i_sb, NULL,
1595 obloc.partitionReferenceNum, obloc.logicalBlockNum, &err)))
1597 return -1;
1599 if (!(nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb,
1600 *bloc, 0))))
1602 return -1;
1604 lock_buffer(nbh);
1605 memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize);
1606 set_buffer_uptodate(nbh);
1607 unlock_buffer(nbh);
1608 mark_buffer_dirty_inode(nbh, inode);
1610 aed = (struct allocExtDesc *)(nbh->b_data);
1611 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
1612 aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum);
1613 if (*extoffset + adsize > inode->i_sb->s_blocksize)
1615 loffset = *extoffset;
1616 aed->lengthAllocDescs = cpu_to_le32(adsize);
1617 sptr = ptr - adsize;
1618 dptr = nbh->b_data + sizeof(struct allocExtDesc);
1619 memcpy(dptr, sptr, adsize);
1620 *extoffset = sizeof(struct allocExtDesc) + adsize;
1622 else
1624 loffset = *extoffset + adsize;
1625 aed->lengthAllocDescs = cpu_to_le32(0);
1626 sptr = ptr;
1627 *extoffset = sizeof(struct allocExtDesc);
1629 if (*bh)
1631 aed = (struct allocExtDesc *)(*bh)->b_data;
1632 aed->lengthAllocDescs =
1633 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1635 else
1637 UDF_I_LENALLOC(inode) += adsize;
1638 mark_inode_dirty(inode);
1641 if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1642 udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1,
1643 bloc->logicalBlockNum, sizeof(tag));
1644 else
1645 udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1,
1646 bloc->logicalBlockNum, sizeof(tag));
1647 switch (UDF_I_ALLOCTYPE(inode))
1649 case ICBTAG_FLAG_AD_SHORT:
1651 sad = (short_ad *)sptr;
1652 sad->extLength = cpu_to_le32(
1653 EXT_NEXT_EXTENT_ALLOCDECS |
1654 inode->i_sb->s_blocksize);
1655 sad->extPosition = cpu_to_le32(bloc->logicalBlockNum);
1656 break;
1658 case ICBTAG_FLAG_AD_LONG:
1660 lad = (long_ad *)sptr;
1661 lad->extLength = cpu_to_le32(
1662 EXT_NEXT_EXTENT_ALLOCDECS |
1663 inode->i_sb->s_blocksize);
1664 lad->extLocation = cpu_to_lelb(*bloc);
1665 memset(lad->impUse, 0x00, sizeof(lad->impUse));
1666 break;
1669 if (*bh)
1671 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1672 udf_update_tag((*bh)->b_data, loffset);
1673 else
1674 udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
1675 mark_buffer_dirty_inode(*bh, inode);
1676 udf_release_data(*bh);
1678 else
1679 mark_inode_dirty(inode);
1680 *bh = nbh;
1683 etype = udf_write_aext(inode, *bloc, extoffset, eloc, elen, *bh, inc);
1685 if (!*bh)
1687 UDF_I_LENALLOC(inode) += adsize;
1688 mark_inode_dirty(inode);
1690 else
1692 aed = (struct allocExtDesc *)(*bh)->b_data;
1693 aed->lengthAllocDescs =
1694 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1695 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1696 udf_update_tag((*bh)->b_data, *extoffset + (inc ? 0 : adsize));
1697 else
1698 udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
1699 mark_buffer_dirty_inode(*bh, inode);
1702 return etype;
1705 int8_t udf_write_aext(struct inode *inode, kernel_lb_addr bloc, int *extoffset,
1706 kernel_lb_addr eloc, uint32_t elen, struct buffer_head *bh, int inc)
1708 int adsize;
1709 uint8_t *ptr;
1711 if (!bh)
1712 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1713 else
1715 ptr = bh->b_data + *extoffset;
1716 atomic_inc(&bh->b_count);
1719 switch (UDF_I_ALLOCTYPE(inode))
1721 case ICBTAG_FLAG_AD_SHORT:
1723 short_ad *sad = (short_ad *)ptr;
1724 sad->extLength = cpu_to_le32(elen);
1725 sad->extPosition = cpu_to_le32(eloc.logicalBlockNum);
1726 adsize = sizeof(short_ad);
1727 break;
1729 case ICBTAG_FLAG_AD_LONG:
1731 long_ad *lad = (long_ad *)ptr;
1732 lad->extLength = cpu_to_le32(elen);
1733 lad->extLocation = cpu_to_lelb(eloc);
1734 memset(lad->impUse, 0x00, sizeof(lad->impUse));
1735 adsize = sizeof(long_ad);
1736 break;
1738 default:
1739 return -1;
1742 if (bh)
1744 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1746 struct allocExtDesc *aed = (struct allocExtDesc *)(bh)->b_data;
1747 udf_update_tag((bh)->b_data,
1748 le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc));
1750 mark_buffer_dirty_inode(bh, inode);
1751 udf_release_data(bh);
1753 else
1754 mark_inode_dirty(inode);
1756 if (inc)
1757 *extoffset += adsize;
1758 return (elen >> 30);
1761 int8_t udf_next_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1762 kernel_lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
1764 int8_t etype;
1766 while ((etype = udf_current_aext(inode, bloc, extoffset, eloc, elen, bh, inc)) ==
1767 (EXT_NEXT_EXTENT_ALLOCDECS >> 30))
1769 *bloc = *eloc;
1770 *extoffset = sizeof(struct allocExtDesc);
1771 udf_release_data(*bh);
1772 if (!(*bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, *bloc, 0))))
1774 udf_debug("reading block %d failed!\n",
1775 udf_get_lb_pblock(inode->i_sb, *bloc, 0));
1776 return -1;
1780 return etype;
1783 int8_t udf_current_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1784 kernel_lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
1786 int alen;
1787 int8_t etype;
1788 uint8_t *ptr;
1790 if (!*bh)
1792 if (!(*extoffset))
1793 *extoffset = udf_file_entry_alloc_offset(inode);
1794 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1795 alen = udf_file_entry_alloc_offset(inode) + UDF_I_LENALLOC(inode);
1797 else
1799 if (!(*extoffset))
1800 *extoffset = sizeof(struct allocExtDesc);
1801 ptr = (*bh)->b_data + *extoffset;
1802 alen = sizeof(struct allocExtDesc) + le32_to_cpu(((struct allocExtDesc *)(*bh)->b_data)->lengthAllocDescs);
1805 switch (UDF_I_ALLOCTYPE(inode))
1807 case ICBTAG_FLAG_AD_SHORT:
1809 short_ad *sad;
1811 if (!(sad = udf_get_fileshortad(ptr, alen, extoffset, inc)))
1812 return -1;
1814 etype = le32_to_cpu(sad->extLength) >> 30;
1815 eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
1816 eloc->partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
1817 *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
1818 break;
1820 case ICBTAG_FLAG_AD_LONG:
1822 long_ad *lad;
1824 if (!(lad = udf_get_filelongad(ptr, alen, extoffset, inc)))
1825 return -1;
1827 etype = le32_to_cpu(lad->extLength) >> 30;
1828 *eloc = lelb_to_cpu(lad->extLocation);
1829 *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK;
1830 break;
1832 default:
1834 udf_debug("alloc_type = %d unsupported\n", UDF_I_ALLOCTYPE(inode));
1835 return -1;
1839 return etype;
1842 static int8_t
1843 udf_insert_aext(struct inode *inode, kernel_lb_addr bloc, int extoffset,
1844 kernel_lb_addr neloc, uint32_t nelen, struct buffer_head *bh)
1846 kernel_lb_addr oeloc;
1847 uint32_t oelen;
1848 int8_t etype;
1850 if (bh)
1851 atomic_inc(&bh->b_count);
1853 while ((etype = udf_next_aext(inode, &bloc, &extoffset, &oeloc, &oelen, &bh, 0)) != -1)
1855 udf_write_aext(inode, bloc, &extoffset, neloc, nelen, bh, 1);
1857 neloc = oeloc;
1858 nelen = (etype << 30) | oelen;
1860 udf_add_aext(inode, &bloc, &extoffset, neloc, nelen, &bh, 1);
1861 udf_release_data(bh);
1862 return (nelen >> 30);
1865 int8_t udf_delete_aext(struct inode *inode, kernel_lb_addr nbloc, int nextoffset,
1866 kernel_lb_addr eloc, uint32_t elen, struct buffer_head *nbh)
1868 struct buffer_head *obh;
1869 kernel_lb_addr obloc;
1870 int oextoffset, adsize;
1871 int8_t etype;
1872 struct allocExtDesc *aed;
1874 if (nbh)
1876 atomic_inc(&nbh->b_count);
1877 atomic_inc(&nbh->b_count);
1880 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
1881 adsize = sizeof(short_ad);
1882 else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
1883 adsize = sizeof(long_ad);
1884 else
1885 adsize = 0;
1887 obh = nbh;
1888 obloc = nbloc;
1889 oextoffset = nextoffset;
1891 if (udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1) == -1)
1892 return -1;
1894 while ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) != -1)
1896 udf_write_aext(inode, obloc, &oextoffset, eloc, (etype << 30) | elen, obh, 1);
1897 if (obh != nbh)
1899 obloc = nbloc;
1900 udf_release_data(obh);
1901 atomic_inc(&nbh->b_count);
1902 obh = nbh;
1903 oextoffset = nextoffset - adsize;
1906 memset(&eloc, 0x00, sizeof(kernel_lb_addr));
1907 elen = 0;
1909 if (nbh != obh)
1911 udf_free_blocks(inode->i_sb, inode, nbloc, 0, 1);
1912 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1913 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1914 if (!obh)
1916 UDF_I_LENALLOC(inode) -= (adsize * 2);
1917 mark_inode_dirty(inode);
1919 else
1921 aed = (struct allocExtDesc *)(obh)->b_data;
1922 aed->lengthAllocDescs =
1923 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2*adsize));
1924 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1925 udf_update_tag((obh)->b_data, oextoffset - (2*adsize));
1926 else
1927 udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
1928 mark_buffer_dirty_inode(obh, inode);
1931 else
1933 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1934 if (!obh)
1936 UDF_I_LENALLOC(inode) -= adsize;
1937 mark_inode_dirty(inode);
1939 else
1941 aed = (struct allocExtDesc *)(obh)->b_data;
1942 aed->lengthAllocDescs =
1943 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize);
1944 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1945 udf_update_tag((obh)->b_data, oextoffset - adsize);
1946 else
1947 udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
1948 mark_buffer_dirty_inode(obh, inode);
1952 udf_release_data(nbh);
1953 udf_release_data(obh);
1954 return (elen >> 30);
1957 int8_t inode_bmap(struct inode *inode, int block, kernel_lb_addr *bloc, uint32_t *extoffset,
1958 kernel_lb_addr *eloc, uint32_t *elen, uint32_t *offset, struct buffer_head **bh)
1960 uint64_t lbcount = 0, bcount = (uint64_t)block << inode->i_sb->s_blocksize_bits;
1961 int8_t etype;
1963 if (block < 0)
1965 printk(KERN_ERR "udf: inode_bmap: block < 0\n");
1966 return -1;
1969 *extoffset = 0;
1970 *elen = 0;
1971 *bloc = UDF_I_LOCATION(inode);
1975 if ((etype = udf_next_aext(inode, bloc, extoffset, eloc, elen, bh, 1)) == -1)
1977 *offset = bcount - lbcount;
1978 UDF_I_LENEXTENTS(inode) = lbcount;
1979 return -1;
1981 lbcount += *elen;
1982 } while (lbcount <= bcount);
1984 *offset = bcount + *elen - lbcount;
1986 return etype;
1989 long udf_block_map(struct inode *inode, long block)
1991 kernel_lb_addr eloc, bloc;
1992 uint32_t offset, extoffset, elen;
1993 struct buffer_head *bh = NULL;
1994 int ret;
1996 lock_kernel();
1998 if (inode_bmap(inode, block, &bloc, &extoffset, &eloc, &elen, &offset, &bh) == (EXT_RECORDED_ALLOCATED >> 30))
1999 ret = udf_get_lb_pblock(inode->i_sb, eloc, offset >> inode->i_sb->s_blocksize_bits);
2000 else
2001 ret = 0;
2003 unlock_kernel();
2004 udf_release_data(bh);
2006 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
2007 return udf_fixed_to_variable(ret);
2008 else
2009 return ret;