blob: 2983afd5e7fd4932ca77cd24e95041f94b719062 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * inode.c
3 *
4 * PURPOSE
5 * Inode handling routines for the OSTA-UDF(tm) filesystem.
6 *
Linus Torvalds1da177e2005-04-16 15:20:36 -07007 * 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.
12 *
13 * (C) 1998 Dave Boynton
14 * (C) 1998-2004 Ben Fennema
15 * (C) 1999-2000 Stelias Computing Inc
16 *
17 * HISTORY
18 *
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 #
29 */
30
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>
39
40#include "udf_i.h"
41#include "udf_sb.h"
42
43MODULE_AUTHOR("Ben Fennema");
44MODULE_DESCRIPTION("Universal Disk Format Filesystem");
45MODULE_LICENSE("GPL");
46
47#define EXTENT_MERGE_SIZE 5
48
49static mode_t udf_convert_permissions(struct fileEntry *);
50static int udf_update_inode(struct inode *, int);
51static void udf_fill_inode(struct inode *, struct buffer_head *);
52static struct buffer_head *inode_getblk(struct inode *, long, int *,
53 long *, int *);
54static int8_t udf_insert_aext(struct inode *, kernel_lb_addr, int,
55 kernel_lb_addr, uint32_t, struct buffer_head *);
56static void udf_split_extents(struct inode *, int *, int, int,
57 kernel_long_ad [EXTENT_MERGE_SIZE], int *);
58static void udf_prealloc_extents(struct inode *, int, int,
59 kernel_long_ad [EXTENT_MERGE_SIZE], int *);
60static void udf_merge_extents(struct inode *,
61 kernel_long_ad [EXTENT_MERGE_SIZE], int *);
62static void udf_update_extents(struct inode *,
63 kernel_long_ad [EXTENT_MERGE_SIZE], int, int,
64 kernel_lb_addr, uint32_t, struct buffer_head **);
65static int udf_get_block(struct inode *, sector_t, struct buffer_head *, int);
66
67/*
68 * udf_delete_inode
69 *
70 * PURPOSE
71 * Clean-up before the specified inode is destroyed.
72 *
73 * DESCRIPTION
74 * This routine is called when the kernel destroys an inode structure
75 * ie. when iput() finds i_count == 0.
76 *
77 * HISTORY
78 * July 1, 1997 - Andrew E. Mileski
79 * Written, tested, and released.
80 *
81 * Called at the last iput() if i_nlink is zero.
82 */
83void udf_delete_inode(struct inode * inode)
84{
Mark Fashehfef26652005-09-09 13:01:31 -070085 truncate_inode_pages(&inode->i_data, 0);
86
Linus Torvalds1da177e2005-04-16 15:20:36 -070087 if (is_bad_inode(inode))
88 goto no_delete;
89
90 inode->i_size = 0;
91 udf_truncate(inode);
92 lock_kernel();
93
94 udf_update_inode(inode, IS_SYNC(inode));
95 udf_free_inode(inode);
96
97 unlock_kernel();
98 return;
99no_delete:
100 clear_inode(inode);
101}
102
103void udf_clear_inode(struct inode *inode)
104{
105 if (!(inode->i_sb->s_flags & MS_RDONLY)) {
106 lock_kernel();
107 udf_discard_prealloc(inode);
108 unlock_kernel();
109 }
110
111 kfree(UDF_I_DATA(inode));
112 UDF_I_DATA(inode) = NULL;
113}
114
115static int udf_writepage(struct page *page, struct writeback_control *wbc)
116{
117 return block_write_full_page(page, udf_get_block, wbc);
118}
119
120static int udf_readpage(struct file *file, struct page *page)
121{
122 return block_read_full_page(page, udf_get_block);
123}
124
125static int udf_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
126{
127 return block_prepare_write(page, from, to, udf_get_block);
128}
129
130static sector_t udf_bmap(struct address_space *mapping, sector_t block)
131{
132 return generic_block_bmap(mapping,block,udf_get_block);
133}
134
135struct 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,
142};
143
144void udf_expand_file_adinicb(struct inode * inode, int newsize, int * err)
145{
146 struct page *page;
147 char *kaddr;
148 struct writeback_control udf_wbc = {
149 .sync_mode = WB_SYNC_NONE,
150 .nr_to_write = 1,
151 };
152
153 /* from now on we have normal address_space methods */
154 inode->i_data.a_ops = &udf_aops;
155
156 if (!UDF_I_LENALLOC(inode))
157 {
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;
164 }
165
166 page = grab_cache_page(inode->i_mapping, 0);
Matt Mackallcd7619d2005-05-01 08:59:01 -0700167 BUG_ON(!PageLocked(page));
168
Linus Torvalds1da177e2005-04-16 15:20:36 -0700169 if (!PageUptodate(page))
170 {
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);
179 }
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;
187
188 inode->i_data.a_ops->writepage(page, &udf_wbc);
189 page_cache_release(page);
190
191 mark_inode_dirty(inode);
192}
193
194struct buffer_head * udf_expand_dir_adinicb(struct inode *inode, int *block, int *err)
195{
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;
201
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;
206
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;
211
212 if (!inode->i_size)
213 {
214 UDF_I_ALLOCTYPE(inode) = alloctype;
215 mark_inode_dirty(inode);
216 return NULL;
217 }
218
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);
223
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);
238
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) )
244 {
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)
248 {
249 udf_release_data(dbh);
250 return NULL;
251 }
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)))
259 {
260 UDF_I_ALLOCTYPE(inode) = ICBTAG_FLAG_AD_IN_ICB;
261 udf_release_data(dbh);
262 return NULL;
263 }
264 }
265 mark_buffer_dirty_inode(dbh, inode);
266
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 */
277
278 udf_release_data(sbh);
279 mark_inode_dirty(inode);
280 return dbh;
281}
282
283static int udf_get_block(struct inode *inode, sector_t block, struct buffer_head *bh_result, int create)
284{
285 int err, new;
286 struct buffer_head *bh;
287 unsigned long phys;
288
289 if (!create)
290 {
291 phys = udf_block_map(inode, block);
292 if (phys)
293 map_bh(bh_result, inode->i_sb, phys);
294 return 0;
295 }
296
297 err = -EIO;
298 new = 0;
299 bh = NULL;
300
301 lock_kernel();
302
303 if (block < 0)
304 goto abort_negative;
305
306 if (block == UDF_I_NEXT_ALLOC_BLOCK(inode) + 1)
307 {
308 UDF_I_NEXT_ALLOC_BLOCK(inode) ++;
309 UDF_I_NEXT_ALLOC_GOAL(inode) ++;
310 }
311
312 err = 0;
313
314 bh = inode_getblk(inode, block, &err, &phys, &new);
Eric Sesterhenn2c2111c2006-04-02 13:40:13 +0200315 BUG_ON(bh);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700316 if (err)
317 goto abort;
Eric Sesterhenn2c2111c2006-04-02 13:40:13 +0200318 BUG_ON(!phys);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700319
320 if (new)
321 set_buffer_new(bh_result);
322 map_bh(bh_result, inode->i_sb, phys);
323abort:
324 unlock_kernel();
325 return err;
326
327abort_negative:
328 udf_warning(inode->i_sb, "udf_get_block", "block < 0");
329 goto abort;
330}
331
332static struct buffer_head *
333udf_getblk(struct inode *inode, long block, int create, int *err)
334{
335 struct buffer_head dummy;
336
337 dummy.b_state = 0;
338 dummy.b_blocknr = -1000;
339 *err = udf_get_block(inode, block, &dummy, create);
340 if (!*err && buffer_mapped(&dummy))
341 {
342 struct buffer_head *bh;
343 bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
344 if (buffer_new(&dummy))
345 {
346 lock_buffer(bh);
347 memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
348 set_buffer_uptodate(bh);
349 unlock_buffer(bh);
350 mark_buffer_dirty_inode(bh, inode);
351 }
352 return bh;
353 }
354 return NULL;
355}
356
357static struct buffer_head * inode_getblk(struct inode * inode, long block,
358 int *err, long *phys, int *new)
359{
360 struct buffer_head *pbh = NULL, *cbh = NULL, *nbh = NULL, *result = NULL;
361 kernel_long_ad laarr[EXTENT_MERGE_SIZE];
362 uint32_t pextoffset = 0, cextoffset = 0, nextoffset = 0;
363 int count = 0, startnum = 0, endnum = 0;
364 uint32_t elen = 0;
365 kernel_lb_addr eloc, pbloc, cbloc, nbloc;
366 int c = 1;
367 uint64_t lbcount = 0, b_off = 0;
368 uint32_t newblocknum, newblock, offset = 0;
369 int8_t etype;
370 int goal = 0, pgoal = UDF_I_LOCATION(inode).logicalBlockNum;
371 char lastblock = 0;
372
373 pextoffset = cextoffset = nextoffset = udf_file_entry_alloc_offset(inode);
374 b_off = (uint64_t)block << inode->i_sb->s_blocksize_bits;
375 pbloc = cbloc = nbloc = UDF_I_LOCATION(inode);
376
377 /* find the extent which contains the block we are looking for.
378 alternate between laarr[0] and laarr[1] for locations of the
379 current extent, and the previous extent */
380 do
381 {
382 if (pbh != cbh)
383 {
384 udf_release_data(pbh);
385 atomic_inc(&cbh->b_count);
386 pbh = cbh;
387 }
388 if (cbh != nbh)
389 {
390 udf_release_data(cbh);
391 atomic_inc(&nbh->b_count);
392 cbh = nbh;
393 }
394
395 lbcount += elen;
396
397 pbloc = cbloc;
398 cbloc = nbloc;
399
400 pextoffset = cextoffset;
401 cextoffset = nextoffset;
402
403 if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) == -1)
404 break;
405
406 c = !c;
407
408 laarr[c].extLength = (etype << 30) | elen;
409 laarr[c].extLocation = eloc;
410
411 if (etype != (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
412 pgoal = eloc.logicalBlockNum +
413 ((elen + inode->i_sb->s_blocksize - 1) >>
414 inode->i_sb->s_blocksize_bits);
415
416 count ++;
417 } while (lbcount + elen <= b_off);
418
419 b_off -= lbcount;
420 offset = b_off >> inode->i_sb->s_blocksize_bits;
421
422 /* if the extent is allocated and recorded, return the block
423 if the extent is not a multiple of the blocksize, round up */
424
425 if (etype == (EXT_RECORDED_ALLOCATED >> 30))
426 {
427 if (elen & (inode->i_sb->s_blocksize - 1))
428 {
429 elen = EXT_RECORDED_ALLOCATED |
430 ((elen + inode->i_sb->s_blocksize - 1) &
431 ~(inode->i_sb->s_blocksize - 1));
432 etype = udf_write_aext(inode, nbloc, &cextoffset, eloc, elen, nbh, 1);
433 }
434 udf_release_data(pbh);
435 udf_release_data(cbh);
436 udf_release_data(nbh);
437 newblock = udf_get_lb_pblock(inode->i_sb, eloc, offset);
438 *phys = newblock;
439 return NULL;
440 }
441
442 if (etype == -1)
443 {
444 endnum = startnum = ((count > 1) ? 1 : count);
445 if (laarr[c].extLength & (inode->i_sb->s_blocksize - 1))
446 {
447 laarr[c].extLength =
448 (laarr[c].extLength & UDF_EXTENT_FLAG_MASK) |
449 (((laarr[c].extLength & UDF_EXTENT_LENGTH_MASK) +
450 inode->i_sb->s_blocksize - 1) &
451 ~(inode->i_sb->s_blocksize - 1));
452 UDF_I_LENEXTENTS(inode) =
453 (UDF_I_LENEXTENTS(inode) + inode->i_sb->s_blocksize - 1) &
454 ~(inode->i_sb->s_blocksize - 1);
455 }
456 c = !c;
457 laarr[c].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
458 ((offset + 1) << inode->i_sb->s_blocksize_bits);
459 memset(&laarr[c].extLocation, 0x00, sizeof(kernel_lb_addr));
460 count ++;
461 endnum ++;
462 lastblock = 1;
463 }
464 else
465 endnum = startnum = ((count > 2) ? 2 : count);
466
467 /* if the current extent is in position 0, swap it with the previous */
468 if (!c && count != 1)
469 {
470 laarr[2] = laarr[0];
471 laarr[0] = laarr[1];
472 laarr[1] = laarr[2];
473 c = 1;
474 }
475
476 /* if the current block is located in a extent, read the next extent */
477 if (etype != -1)
478 {
479 if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 0)) != -1)
480 {
481 laarr[c+1].extLength = (etype << 30) | elen;
482 laarr[c+1].extLocation = eloc;
483 count ++;
484 startnum ++;
485 endnum ++;
486 }
487 else
488 lastblock = 1;
489 }
490 udf_release_data(cbh);
491 udf_release_data(nbh);
492
493 /* if the current extent is not recorded but allocated, get the
494 block in the extent corresponding to the requested block */
495 if ((laarr[c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
496 newblocknum = laarr[c].extLocation.logicalBlockNum + offset;
497 else /* otherwise, allocate a new block */
498 {
499 if (UDF_I_NEXT_ALLOC_BLOCK(inode) == block)
500 goal = UDF_I_NEXT_ALLOC_GOAL(inode);
501
502 if (!goal)
503 {
504 if (!(goal = pgoal))
505 goal = UDF_I_LOCATION(inode).logicalBlockNum + 1;
506 }
507
508 if (!(newblocknum = udf_new_block(inode->i_sb, inode,
509 UDF_I_LOCATION(inode).partitionReferenceNum, goal, err)))
510 {
511 udf_release_data(pbh);
512 *err = -ENOSPC;
513 return NULL;
514 }
515 UDF_I_LENEXTENTS(inode) += inode->i_sb->s_blocksize;
516 }
517
518 /* if the extent the requsted block is located in contains multiple blocks,
519 split the extent into at most three extents. blocks prior to requested
520 block, requested block, and blocks after requested block */
521 udf_split_extents(inode, &c, offset, newblocknum, laarr, &endnum);
522
523#ifdef UDF_PREALLOCATE
524 /* preallocate blocks */
525 udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
526#endif
527
528 /* merge any continuous blocks in laarr */
529 udf_merge_extents(inode, laarr, &endnum);
530
531 /* write back the new extents, inserting new extents if the new number
532 of extents is greater than the old number, and deleting extents if
533 the new number of extents is less than the old number */
534 udf_update_extents(inode, laarr, startnum, endnum, pbloc, pextoffset, &pbh);
535
536 udf_release_data(pbh);
537
538 if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum,
539 UDF_I_LOCATION(inode).partitionReferenceNum, 0)))
540 {
541 return NULL;
542 }
543 *phys = newblock;
544 *err = 0;
545 *new = 1;
546 UDF_I_NEXT_ALLOC_BLOCK(inode) = block;
547 UDF_I_NEXT_ALLOC_GOAL(inode) = newblocknum;
548 inode->i_ctime = current_fs_time(inode->i_sb);
549
550 if (IS_SYNC(inode))
551 udf_sync_inode(inode);
552 else
553 mark_inode_dirty(inode);
554 return result;
555}
556
557static void udf_split_extents(struct inode *inode, int *c, int offset, int newblocknum,
558 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
559{
560 if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) ||
561 (laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
562 {
563 int curr = *c;
564 int blen = ((laarr[curr].extLength & UDF_EXTENT_LENGTH_MASK) +
565 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
566 int8_t etype = (laarr[curr].extLength >> 30);
567
568 if (blen == 1)
569 ;
570 else if (!offset || blen == offset + 1)
571 {
572 laarr[curr+2] = laarr[curr+1];
573 laarr[curr+1] = laarr[curr];
574 }
575 else
576 {
577 laarr[curr+3] = laarr[curr+1];
578 laarr[curr+2] = laarr[curr+1] = laarr[curr];
579 }
580
581 if (offset)
582 {
583 if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
584 {
585 udf_free_blocks(inode->i_sb, inode, laarr[curr].extLocation, 0, offset);
586 laarr[curr].extLength = EXT_NOT_RECORDED_NOT_ALLOCATED |
587 (offset << inode->i_sb->s_blocksize_bits);
588 laarr[curr].extLocation.logicalBlockNum = 0;
589 laarr[curr].extLocation.partitionReferenceNum = 0;
590 }
591 else
592 laarr[curr].extLength = (etype << 30) |
593 (offset << inode->i_sb->s_blocksize_bits);
594 curr ++;
595 (*c) ++;
596 (*endnum) ++;
597 }
598
599 laarr[curr].extLocation.logicalBlockNum = newblocknum;
600 if (etype == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
601 laarr[curr].extLocation.partitionReferenceNum =
602 UDF_I_LOCATION(inode).partitionReferenceNum;
603 laarr[curr].extLength = EXT_RECORDED_ALLOCATED |
604 inode->i_sb->s_blocksize;
605 curr ++;
606
607 if (blen != offset + 1)
608 {
609 if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
610 laarr[curr].extLocation.logicalBlockNum += (offset + 1);
611 laarr[curr].extLength = (etype << 30) |
612 ((blen - (offset + 1)) << inode->i_sb->s_blocksize_bits);
613 curr ++;
614 (*endnum) ++;
615 }
616 }
617}
618
619static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
620 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
621{
622 int start, length = 0, currlength = 0, i;
623
624 if (*endnum >= (c+1))
625 {
626 if (!lastblock)
627 return;
628 else
629 start = c;
630 }
631 else
632 {
633 if ((laarr[c+1].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
634 {
635 start = c+1;
636 length = currlength = (((laarr[c+1].extLength & UDF_EXTENT_LENGTH_MASK) +
637 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
638 }
639 else
640 start = c;
641 }
642
643 for (i=start+1; i<=*endnum; i++)
644 {
645 if (i == *endnum)
646 {
647 if (lastblock)
648 length += UDF_DEFAULT_PREALLOC_BLOCKS;
649 }
650 else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
651 length += (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
652 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
653 else
654 break;
655 }
656
657 if (length)
658 {
659 int next = laarr[start].extLocation.logicalBlockNum +
660 (((laarr[start].extLength & UDF_EXTENT_LENGTH_MASK) +
661 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
662 int numalloc = udf_prealloc_blocks(inode->i_sb, inode,
663 laarr[start].extLocation.partitionReferenceNum,
664 next, (UDF_DEFAULT_PREALLOC_BLOCKS > length ? length :
665 UDF_DEFAULT_PREALLOC_BLOCKS) - currlength);
666
667 if (numalloc)
668 {
669 if (start == (c+1))
670 laarr[start].extLength +=
671 (numalloc << inode->i_sb->s_blocksize_bits);
672 else
673 {
674 memmove(&laarr[c+2], &laarr[c+1],
675 sizeof(long_ad) * (*endnum - (c+1)));
676 (*endnum) ++;
677 laarr[c+1].extLocation.logicalBlockNum = next;
678 laarr[c+1].extLocation.partitionReferenceNum =
679 laarr[c].extLocation.partitionReferenceNum;
680 laarr[c+1].extLength = EXT_NOT_RECORDED_ALLOCATED |
681 (numalloc << inode->i_sb->s_blocksize_bits);
682 start = c+1;
683 }
684
685 for (i=start+1; numalloc && i<*endnum; i++)
686 {
687 int elen = ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
688 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
689
690 if (elen > numalloc)
691 {
692 laarr[i].extLength -=
693 (numalloc << inode->i_sb->s_blocksize_bits);
694 numalloc = 0;
695 }
696 else
697 {
698 numalloc -= elen;
699 if (*endnum > (i+1))
700 memmove(&laarr[i], &laarr[i+1],
701 sizeof(long_ad) * (*endnum - (i+1)));
702 i --;
703 (*endnum) --;
704 }
705 }
706 UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
707 }
708 }
709}
710
711static void udf_merge_extents(struct inode *inode,
712 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
713{
714 int i;
715
716 for (i=0; i<(*endnum-1); i++)
717 {
718 if ((laarr[i].extLength >> 30) == (laarr[i+1].extLength >> 30))
719 {
720 if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)) ||
721 ((laarr[i+1].extLocation.logicalBlockNum - laarr[i].extLocation.logicalBlockNum) ==
722 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
723 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits)))
724 {
725 if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
726 (laarr[i+1].extLength & UDF_EXTENT_LENGTH_MASK) +
727 inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK)
728 {
729 laarr[i+1].extLength = (laarr[i+1].extLength -
730 (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
731 UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize-1);
732 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) +
733 (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize;
734 laarr[i+1].extLocation.logicalBlockNum =
735 laarr[i].extLocation.logicalBlockNum +
736 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) >>
737 inode->i_sb->s_blocksize_bits);
738 }
739 else
740 {
741 laarr[i].extLength = laarr[i+1].extLength +
742 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
743 inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize-1));
744 if (*endnum > (i+2))
745 memmove(&laarr[i+1], &laarr[i+2],
746 sizeof(long_ad) * (*endnum - (i+2)));
747 i --;
748 (*endnum) --;
749 }
750 }
751 }
752 else if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) &&
753 ((laarr[i+1].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)))
754 {
755 udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0,
756 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
757 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
758 laarr[i].extLocation.logicalBlockNum = 0;
759 laarr[i].extLocation.partitionReferenceNum = 0;
760
761 if (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
762 (laarr[i+1].extLength & UDF_EXTENT_LENGTH_MASK) +
763 inode->i_sb->s_blocksize - 1) & ~UDF_EXTENT_LENGTH_MASK)
764 {
765 laarr[i+1].extLength = (laarr[i+1].extLength -
766 (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
767 UDF_EXTENT_LENGTH_MASK) & ~(inode->i_sb->s_blocksize-1);
768 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_FLAG_MASK) +
769 (UDF_EXTENT_LENGTH_MASK + 1) - inode->i_sb->s_blocksize;
770 }
771 else
772 {
773 laarr[i].extLength = laarr[i+1].extLength +
774 (((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
775 inode->i_sb->s_blocksize - 1) & ~(inode->i_sb->s_blocksize-1));
776 if (*endnum > (i+2))
777 memmove(&laarr[i+1], &laarr[i+2],
778 sizeof(long_ad) * (*endnum - (i+2)));
779 i --;
780 (*endnum) --;
781 }
782 }
783 else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
784 {
785 udf_free_blocks(inode->i_sb, inode, laarr[i].extLocation, 0,
786 ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
787 inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits);
788 laarr[i].extLocation.logicalBlockNum = 0;
789 laarr[i].extLocation.partitionReferenceNum = 0;
790 laarr[i].extLength = (laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) |
791 EXT_NOT_RECORDED_NOT_ALLOCATED;
792 }
793 }
794}
795
796static void udf_update_extents(struct inode *inode,
797 kernel_long_ad laarr[EXTENT_MERGE_SIZE], int startnum, int endnum,
798 kernel_lb_addr pbloc, uint32_t pextoffset, struct buffer_head **pbh)
799{
800 int start = 0, i;
801 kernel_lb_addr tmploc;
802 uint32_t tmplen;
803
804 if (startnum > endnum)
805 {
806 for (i=0; i<(startnum-endnum); i++)
807 {
808 udf_delete_aext(inode, pbloc, pextoffset, laarr[i].extLocation,
809 laarr[i].extLength, *pbh);
810 }
811 }
812 else if (startnum < endnum)
813 {
814 for (i=0; i<(endnum-startnum); i++)
815 {
816 udf_insert_aext(inode, pbloc, pextoffset, laarr[i].extLocation,
817 laarr[i].extLength, *pbh);
818 udf_next_aext(inode, &pbloc, &pextoffset, &laarr[i].extLocation,
819 &laarr[i].extLength, pbh, 1);
820 start ++;
821 }
822 }
823
824 for (i=start; i<endnum; i++)
825 {
826 udf_next_aext(inode, &pbloc, &pextoffset, &tmploc, &tmplen, pbh, 0);
827 udf_write_aext(inode, pbloc, &pextoffset, laarr[i].extLocation,
828 laarr[i].extLength, *pbh, 1);
829 }
830}
831
832struct buffer_head * udf_bread(struct inode * inode, int block,
833 int create, int * err)
834{
835 struct buffer_head * bh = NULL;
836
837 bh = udf_getblk(inode, block, create, err);
838 if (!bh)
839 return NULL;
840
841 if (buffer_uptodate(bh))
842 return bh;
843 ll_rw_block(READ, 1, &bh);
844 wait_on_buffer(bh);
845 if (buffer_uptodate(bh))
846 return bh;
847 brelse(bh);
848 *err = -EIO;
849 return NULL;
850}
851
852void udf_truncate(struct inode * inode)
853{
854 int offset;
855 int err;
856
857 if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
858 S_ISLNK(inode->i_mode)))
859 return;
860 if (IS_APPEND(inode) || IS_IMMUTABLE(inode))
861 return;
862
863 lock_kernel();
864 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
865 {
866 if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +
867 inode->i_size))
868 {
869 udf_expand_file_adinicb(inode, inode->i_size, &err);
870 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
871 {
872 inode->i_size = UDF_I_LENALLOC(inode);
873 unlock_kernel();
874 return;
875 }
876 else
877 udf_truncate_extents(inode);
878 }
879 else
880 {
881 offset = inode->i_size & (inode->i_sb->s_blocksize - 1);
882 memset(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset, 0x00, inode->i_sb->s_blocksize - offset - udf_file_entry_alloc_offset(inode));
883 UDF_I_LENALLOC(inode) = inode->i_size;
884 }
885 }
886 else
887 {
888 block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block);
889 udf_truncate_extents(inode);
890 }
891
892 inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
893 if (IS_SYNC(inode))
894 udf_sync_inode (inode);
895 else
896 mark_inode_dirty(inode);
897 unlock_kernel();
898}
899
900static void
901__udf_read_inode(struct inode *inode)
902{
903 struct buffer_head *bh = NULL;
904 struct fileEntry *fe;
905 uint16_t ident;
906
907 /*
908 * Set defaults, but the inode is still incomplete!
909 * Note: get_new_inode() sets the following on a new inode:
910 * i_sb = sb
911 * i_no = ino
912 * i_flags = sb->s_flags
913 * i_state = 0
914 * clean_inode(): zero fills and sets
915 * i_count = 1
916 * i_nlink = 1
917 * i_op = NULL;
918 */
919 inode->i_blksize = PAGE_SIZE;
920
921 bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident);
922
923 if (!bh)
924 {
925 printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n",
926 inode->i_ino);
927 make_bad_inode(inode);
928 return;
929 }
930
931 if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE &&
932 ident != TAG_IDENT_USE)
933 {
934 printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed ident=%d\n",
935 inode->i_ino, ident);
936 udf_release_data(bh);
937 make_bad_inode(inode);
938 return;
939 }
940
941 fe = (struct fileEntry *)bh->b_data;
942
943 if (le16_to_cpu(fe->icbTag.strategyType) == 4096)
944 {
945 struct buffer_head *ibh = NULL, *nbh = NULL;
946 struct indirectEntry *ie;
947
948 ibh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 1, &ident);
949 if (ident == TAG_IDENT_IE)
950 {
951 if (ibh)
952 {
953 kernel_lb_addr loc;
954 ie = (struct indirectEntry *)ibh->b_data;
955
956 loc = lelb_to_cpu(ie->indirectICB.extLocation);
957
958 if (ie->indirectICB.extLength &&
959 (nbh = udf_read_ptagged(inode->i_sb, loc, 0, &ident)))
960 {
961 if (ident == TAG_IDENT_FE ||
962 ident == TAG_IDENT_EFE)
963 {
964 memcpy(&UDF_I_LOCATION(inode), &loc, sizeof(kernel_lb_addr));
965 udf_release_data(bh);
966 udf_release_data(ibh);
967 udf_release_data(nbh);
968 __udf_read_inode(inode);
969 return;
970 }
971 else
972 {
973 udf_release_data(nbh);
974 udf_release_data(ibh);
975 }
976 }
977 else
978 udf_release_data(ibh);
979 }
980 }
981 else
982 udf_release_data(ibh);
983 }
984 else if (le16_to_cpu(fe->icbTag.strategyType) != 4)
985 {
986 printk(KERN_ERR "udf: unsupported strategy type: %d\n",
987 le16_to_cpu(fe->icbTag.strategyType));
988 udf_release_data(bh);
989 make_bad_inode(inode);
990 return;
991 }
992 udf_fill_inode(inode, bh);
993 udf_release_data(bh);
994}
995
996static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
997{
998 struct fileEntry *fe;
999 struct extendedFileEntry *efe;
1000 time_t convtime;
1001 long convtime_usec;
1002 int offset;
1003
1004 fe = (struct fileEntry *)bh->b_data;
1005 efe = (struct extendedFileEntry *)bh->b_data;
1006
1007 if (le16_to_cpu(fe->icbTag.strategyType) == 4)
1008 UDF_I_STRAT4096(inode) = 0;
1009 else /* if (le16_to_cpu(fe->icbTag.strategyType) == 4096) */
1010 UDF_I_STRAT4096(inode) = 1;
1011
1012 UDF_I_ALLOCTYPE(inode) = le16_to_cpu(fe->icbTag.flags) & ICBTAG_FLAG_AD_MASK;
1013 UDF_I_UNIQUE(inode) = 0;
1014 UDF_I_LENEATTR(inode) = 0;
1015 UDF_I_LENEXTENTS(inode) = 0;
1016 UDF_I_LENALLOC(inode) = 0;
1017 UDF_I_NEXT_ALLOC_BLOCK(inode) = 0;
1018 UDF_I_NEXT_ALLOC_GOAL(inode) = 0;
1019 if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_EFE)
1020 {
1021 UDF_I_EFE(inode) = 1;
1022 UDF_I_USE(inode) = 0;
1023 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry), GFP_KERNEL);
1024 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct extendedFileEntry), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
1025 }
1026 else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE)
1027 {
1028 UDF_I_EFE(inode) = 0;
1029 UDF_I_USE(inode) = 0;
1030 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct fileEntry), GFP_KERNEL);
1031 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct fileEntry), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1032 }
1033 else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1034 {
1035 UDF_I_EFE(inode) = 0;
1036 UDF_I_USE(inode) = 1;
1037 UDF_I_LENALLOC(inode) =
1038 le32_to_cpu(
1039 ((struct unallocSpaceEntry *)bh->b_data)->lengthAllocDescs);
1040 UDF_I_DATA(inode) = kmalloc(inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry), GFP_KERNEL);
1041 memcpy(UDF_I_DATA(inode), bh->b_data + sizeof(struct unallocSpaceEntry), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
1042 return;
1043 }
1044
1045 inode->i_uid = le32_to_cpu(fe->uid);
Phillip Susi4d6660e2006-03-07 21:55:24 -08001046 if (inode->i_uid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1047 UDF_FLAG_UID_IGNORE))
1048 inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001049
1050 inode->i_gid = le32_to_cpu(fe->gid);
Phillip Susi4d6660e2006-03-07 21:55:24 -08001051 if (inode->i_gid == -1 || UDF_QUERY_FLAG(inode->i_sb,
1052 UDF_FLAG_GID_IGNORE))
1053 inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
Linus Torvalds1da177e2005-04-16 15:20:36 -07001054
1055 inode->i_nlink = le16_to_cpu(fe->fileLinkCount);
1056 if (!inode->i_nlink)
1057 inode->i_nlink = 1;
1058
1059 inode->i_size = le64_to_cpu(fe->informationLength);
1060 UDF_I_LENEXTENTS(inode) = inode->i_size;
1061
1062 inode->i_mode = udf_convert_permissions(fe);
1063 inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask;
1064
1065 if (UDF_I_EFE(inode) == 0)
1066 {
1067 inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
1068 (inode->i_sb->s_blocksize_bits - 9);
1069
1070 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1071 lets_to_cpu(fe->accessTime)) )
1072 {
1073 inode->i_atime.tv_sec = convtime;
1074 inode->i_atime.tv_nsec = convtime_usec * 1000;
1075 }
1076 else
1077 {
1078 inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1079 }
1080
1081 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1082 lets_to_cpu(fe->modificationTime)) )
1083 {
1084 inode->i_mtime.tv_sec = convtime;
1085 inode->i_mtime.tv_nsec = convtime_usec * 1000;
1086 }
1087 else
1088 {
1089 inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1090 }
1091
1092 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1093 lets_to_cpu(fe->attrTime)) )
1094 {
1095 inode->i_ctime.tv_sec = convtime;
1096 inode->i_ctime.tv_nsec = convtime_usec * 1000;
1097 }
1098 else
1099 {
1100 inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1101 }
1102
1103 UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID);
1104 UDF_I_LENEATTR(inode) = le32_to_cpu(fe->lengthExtendedAttr);
1105 UDF_I_LENALLOC(inode) = le32_to_cpu(fe->lengthAllocDescs);
1106 offset = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode);
1107 }
1108 else
1109 {
1110 inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) <<
1111 (inode->i_sb->s_blocksize_bits - 9);
1112
1113 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1114 lets_to_cpu(efe->accessTime)) )
1115 {
1116 inode->i_atime.tv_sec = convtime;
1117 inode->i_atime.tv_nsec = convtime_usec * 1000;
1118 }
1119 else
1120 {
1121 inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1122 }
1123
1124 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1125 lets_to_cpu(efe->modificationTime)) )
1126 {
1127 inode->i_mtime.tv_sec = convtime;
1128 inode->i_mtime.tv_nsec = convtime_usec * 1000;
1129 }
1130 else
1131 {
1132 inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1133 }
1134
1135 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1136 lets_to_cpu(efe->createTime)) )
1137 {
1138 UDF_I_CRTIME(inode).tv_sec = convtime;
1139 UDF_I_CRTIME(inode).tv_nsec = convtime_usec * 1000;
1140 }
1141 else
1142 {
1143 UDF_I_CRTIME(inode) = UDF_SB_RECORDTIME(inode->i_sb);
1144 }
1145
1146 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1147 lets_to_cpu(efe->attrTime)) )
1148 {
1149 inode->i_ctime.tv_sec = convtime;
1150 inode->i_ctime.tv_nsec = convtime_usec * 1000;
1151 }
1152 else
1153 {
1154 inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1155 }
1156
1157 UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID);
1158 UDF_I_LENEATTR(inode) = le32_to_cpu(efe->lengthExtendedAttr);
1159 UDF_I_LENALLOC(inode) = le32_to_cpu(efe->lengthAllocDescs);
1160 offset = sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode);
1161 }
1162
1163 switch (fe->icbTag.fileType)
1164 {
1165 case ICBTAG_FILE_TYPE_DIRECTORY:
1166 {
1167 inode->i_op = &udf_dir_inode_operations;
1168 inode->i_fop = &udf_dir_operations;
1169 inode->i_mode |= S_IFDIR;
1170 inode->i_nlink ++;
1171 break;
1172 }
1173 case ICBTAG_FILE_TYPE_REALTIME:
1174 case ICBTAG_FILE_TYPE_REGULAR:
1175 case ICBTAG_FILE_TYPE_UNDEF:
1176 {
1177 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
1178 inode->i_data.a_ops = &udf_adinicb_aops;
1179 else
1180 inode->i_data.a_ops = &udf_aops;
1181 inode->i_op = &udf_file_inode_operations;
1182 inode->i_fop = &udf_file_operations;
1183 inode->i_mode |= S_IFREG;
1184 break;
1185 }
1186 case ICBTAG_FILE_TYPE_BLOCK:
1187 {
1188 inode->i_mode |= S_IFBLK;
1189 break;
1190 }
1191 case ICBTAG_FILE_TYPE_CHAR:
1192 {
1193 inode->i_mode |= S_IFCHR;
1194 break;
1195 }
1196 case ICBTAG_FILE_TYPE_FIFO:
1197 {
1198 init_special_inode(inode, inode->i_mode | S_IFIFO, 0);
1199 break;
1200 }
1201 case ICBTAG_FILE_TYPE_SOCKET:
1202 {
1203 init_special_inode(inode, inode->i_mode | S_IFSOCK, 0);
1204 break;
1205 }
1206 case ICBTAG_FILE_TYPE_SYMLINK:
1207 {
1208 inode->i_data.a_ops = &udf_symlink_aops;
1209 inode->i_op = &page_symlink_inode_operations;
1210 inode->i_mode = S_IFLNK|S_IRWXUGO;
1211 break;
1212 }
1213 default:
1214 {
1215 printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown file type=%d\n",
1216 inode->i_ino, fe->icbTag.fileType);
1217 make_bad_inode(inode);
1218 return;
1219 }
1220 }
1221 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1222 {
1223 struct deviceSpec *dsea =
1224 (struct deviceSpec *)
1225 udf_get_extendedattr(inode, 12, 1);
1226
1227 if (dsea)
1228 {
1229 init_special_inode(inode, inode->i_mode, MKDEV(
1230 le32_to_cpu(dsea->majorDeviceIdent),
1231 le32_to_cpu(dsea->minorDeviceIdent)));
1232 /* Developer ID ??? */
1233 }
1234 else
1235 {
1236 make_bad_inode(inode);
1237 }
1238 }
1239}
1240
1241static mode_t
1242udf_convert_permissions(struct fileEntry *fe)
1243{
1244 mode_t mode;
1245 uint32_t permissions;
1246 uint32_t flags;
1247
1248 permissions = le32_to_cpu(fe->permissions);
1249 flags = le16_to_cpu(fe->icbTag.flags);
1250
1251 mode = (( permissions ) & S_IRWXO) |
1252 (( permissions >> 2 ) & S_IRWXG) |
1253 (( permissions >> 4 ) & S_IRWXU) |
1254 (( flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) |
1255 (( flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) |
1256 (( flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0);
1257
1258 return mode;
1259}
1260
1261/*
1262 * udf_write_inode
1263 *
1264 * PURPOSE
1265 * Write out the specified inode.
1266 *
1267 * DESCRIPTION
1268 * This routine is called whenever an inode is synced.
1269 * Currently this routine is just a placeholder.
1270 *
1271 * HISTORY
1272 * July 1, 1997 - Andrew E. Mileski
1273 * Written, tested, and released.
1274 */
1275
1276int udf_write_inode(struct inode * inode, int sync)
1277{
1278 int ret;
1279 lock_kernel();
1280 ret = udf_update_inode(inode, sync);
1281 unlock_kernel();
1282 return ret;
1283}
1284
1285int udf_sync_inode(struct inode * inode)
1286{
1287 return udf_update_inode(inode, 1);
1288}
1289
1290static int
1291udf_update_inode(struct inode *inode, int do_sync)
1292{
1293 struct buffer_head *bh = NULL;
1294 struct fileEntry *fe;
1295 struct extendedFileEntry *efe;
1296 uint32_t udfperms;
1297 uint16_t icbflags;
1298 uint16_t crclen;
1299 int i;
1300 kernel_timestamp cpu_time;
1301 int err = 0;
1302
1303 bh = udf_tread(inode->i_sb,
1304 udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0));
1305
1306 if (!bh)
1307 {
1308 udf_debug("bread failure\n");
1309 return -EIO;
1310 }
1311
1312 memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
1313
1314 fe = (struct fileEntry *)bh->b_data;
1315 efe = (struct extendedFileEntry *)bh->b_data;
1316
1317 if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1318 {
1319 struct unallocSpaceEntry *use =
1320 (struct unallocSpaceEntry *)bh->b_data;
1321
1322 use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1323 memcpy(bh->b_data + sizeof(struct unallocSpaceEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
1324 crclen = sizeof(struct unallocSpaceEntry) + UDF_I_LENALLOC(inode) -
1325 sizeof(tag);
1326 use->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1327 use->descTag.descCRCLength = cpu_to_le16(crclen);
1328 use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0));
1329
1330 use->descTag.tagChecksum = 0;
1331 for (i=0; i<16; i++)
1332 if (i != 4)
1333 use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i];
1334
1335 mark_buffer_dirty(bh);
1336 udf_release_data(bh);
1337 return err;
1338 }
1339
Phillip Susi4d6660e2006-03-07 21:55:24 -08001340 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET))
1341 fe->uid = cpu_to_le32(-1);
Phillip Susi0e6b3e52006-03-25 03:08:14 -08001342 else fe->uid = cpu_to_le32(inode->i_uid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001343
Phillip Susi4d6660e2006-03-07 21:55:24 -08001344 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET))
1345 fe->gid = cpu_to_le32(-1);
Phillip Susi0e6b3e52006-03-25 03:08:14 -08001346 else fe->gid = cpu_to_le32(inode->i_gid);
Linus Torvalds1da177e2005-04-16 15:20:36 -07001347
1348 udfperms = ((inode->i_mode & S_IRWXO) ) |
1349 ((inode->i_mode & S_IRWXG) << 2) |
1350 ((inode->i_mode & S_IRWXU) << 4);
1351
1352 udfperms |= (le32_to_cpu(fe->permissions) &
1353 (FE_PERM_O_DELETE | FE_PERM_O_CHATTR |
1354 FE_PERM_G_DELETE | FE_PERM_G_CHATTR |
1355 FE_PERM_U_DELETE | FE_PERM_U_CHATTR));
1356 fe->permissions = cpu_to_le32(udfperms);
1357
1358 if (S_ISDIR(inode->i_mode))
1359 fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1);
1360 else
1361 fe->fileLinkCount = cpu_to_le16(inode->i_nlink);
1362
1363 fe->informationLength = cpu_to_le64(inode->i_size);
1364
1365 if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1366 {
1367 regid *eid;
1368 struct deviceSpec *dsea =
1369 (struct deviceSpec *)
1370 udf_get_extendedattr(inode, 12, 1);
1371
1372 if (!dsea)
1373 {
1374 dsea = (struct deviceSpec *)
1375 udf_add_extendedattr(inode,
1376 sizeof(struct deviceSpec) +
1377 sizeof(regid), 12, 0x3);
1378 dsea->attrType = cpu_to_le32(12);
1379 dsea->attrSubtype = 1;
1380 dsea->attrLength = cpu_to_le32(sizeof(struct deviceSpec) +
1381 sizeof(regid));
1382 dsea->impUseLength = cpu_to_le32(sizeof(regid));
1383 }
1384 eid = (regid *)dsea->impUse;
1385 memset(eid, 0, sizeof(regid));
1386 strcpy(eid->ident, UDF_ID_DEVELOPER);
1387 eid->identSuffix[0] = UDF_OS_CLASS_UNIX;
1388 eid->identSuffix[1] = UDF_OS_ID_LINUX;
1389 dsea->majorDeviceIdent = cpu_to_le32(imajor(inode));
1390 dsea->minorDeviceIdent = cpu_to_le32(iminor(inode));
1391 }
1392
1393 if (UDF_I_EFE(inode) == 0)
1394 {
1395 memcpy(bh->b_data + sizeof(struct fileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1396 fe->logicalBlocksRecorded = cpu_to_le64(
1397 (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1398 (inode->i_sb->s_blocksize_bits - 9));
1399
1400 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1401 fe->accessTime = cpu_to_lets(cpu_time);
1402 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1403 fe->modificationTime = cpu_to_lets(cpu_time);
1404 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1405 fe->attrTime = cpu_to_lets(cpu_time);
1406 memset(&(fe->impIdent), 0, sizeof(regid));
1407 strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
1408 fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1409 fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1410 fe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1411 fe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1412 fe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1413 fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE);
1414 crclen = sizeof(struct fileEntry);
1415 }
1416 else
1417 {
1418 memcpy(bh->b_data + sizeof(struct extendedFileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
1419 efe->objectSize = cpu_to_le64(inode->i_size);
1420 efe->logicalBlocksRecorded = cpu_to_le64(
1421 (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1422 (inode->i_sb->s_blocksize_bits - 9));
1423
1424 if (UDF_I_CRTIME(inode).tv_sec > inode->i_atime.tv_sec ||
1425 (UDF_I_CRTIME(inode).tv_sec == inode->i_atime.tv_sec &&
1426 UDF_I_CRTIME(inode).tv_nsec > inode->i_atime.tv_nsec))
1427 {
1428 UDF_I_CRTIME(inode) = inode->i_atime;
1429 }
1430 if (UDF_I_CRTIME(inode).tv_sec > inode->i_mtime.tv_sec ||
1431 (UDF_I_CRTIME(inode).tv_sec == inode->i_mtime.tv_sec &&
1432 UDF_I_CRTIME(inode).tv_nsec > inode->i_mtime.tv_nsec))
1433 {
1434 UDF_I_CRTIME(inode) = inode->i_mtime;
1435 }
1436 if (UDF_I_CRTIME(inode).tv_sec > inode->i_ctime.tv_sec ||
1437 (UDF_I_CRTIME(inode).tv_sec == inode->i_ctime.tv_sec &&
1438 UDF_I_CRTIME(inode).tv_nsec > inode->i_ctime.tv_nsec))
1439 {
1440 UDF_I_CRTIME(inode) = inode->i_ctime;
1441 }
1442
1443 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1444 efe->accessTime = cpu_to_lets(cpu_time);
1445 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1446 efe->modificationTime = cpu_to_lets(cpu_time);
1447 if (udf_time_to_stamp(&cpu_time, UDF_I_CRTIME(inode)))
1448 efe->createTime = cpu_to_lets(cpu_time);
1449 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1450 efe->attrTime = cpu_to_lets(cpu_time);
1451
1452 memset(&(efe->impIdent), 0, sizeof(regid));
1453 strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
1454 efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1455 efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1456 efe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1457 efe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1458 efe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1459 efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE);
1460 crclen = sizeof(struct extendedFileEntry);
1461 }
1462 if (UDF_I_STRAT4096(inode))
1463 {
1464 fe->icbTag.strategyType = cpu_to_le16(4096);
1465 fe->icbTag.strategyParameter = cpu_to_le16(1);
1466 fe->icbTag.numEntries = cpu_to_le16(2);
1467 }
1468 else
1469 {
1470 fe->icbTag.strategyType = cpu_to_le16(4);
1471 fe->icbTag.numEntries = cpu_to_le16(1);
1472 }
1473
1474 if (S_ISDIR(inode->i_mode))
1475 fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY;
1476 else if (S_ISREG(inode->i_mode))
1477 fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR;
1478 else if (S_ISLNK(inode->i_mode))
1479 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SYMLINK;
1480 else if (S_ISBLK(inode->i_mode))
1481 fe->icbTag.fileType = ICBTAG_FILE_TYPE_BLOCK;
1482 else if (S_ISCHR(inode->i_mode))
1483 fe->icbTag.fileType = ICBTAG_FILE_TYPE_CHAR;
1484 else if (S_ISFIFO(inode->i_mode))
1485 fe->icbTag.fileType = ICBTAG_FILE_TYPE_FIFO;
1486 else if (S_ISSOCK(inode->i_mode))
1487 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET;
1488
1489 icbflags = UDF_I_ALLOCTYPE(inode) |
1490 ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) |
1491 ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) |
1492 ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) |
1493 (le16_to_cpu(fe->icbTag.flags) &
1494 ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID |
1495 ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY));
1496
1497 fe->icbTag.flags = cpu_to_le16(icbflags);
1498 if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1499 fe->descTag.descVersion = cpu_to_le16(3);
1500 else
1501 fe->descTag.descVersion = cpu_to_le16(2);
1502 fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb));
1503 fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1504 crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag);
1505 fe->descTag.descCRCLength = cpu_to_le16(crclen);
1506 fe->descTag.descCRC = cpu_to_le16(udf_crc((char *)fe + sizeof(tag), crclen, 0));
1507
1508 fe->descTag.tagChecksum = 0;
1509 for (i=0; i<16; i++)
1510 if (i != 4)
1511 fe->descTag.tagChecksum += ((uint8_t *)&(fe->descTag))[i];
1512
1513 /* write the data blocks */
1514 mark_buffer_dirty(bh);
1515 if (do_sync)
1516 {
1517 sync_dirty_buffer(bh);
1518 if (buffer_req(bh) && !buffer_uptodate(bh))
1519 {
1520 printk("IO error syncing udf inode [%s:%08lx]\n",
1521 inode->i_sb->s_id, inode->i_ino);
1522 err = -EIO;
1523 }
1524 }
1525 udf_release_data(bh);
1526 return err;
1527}
1528
1529struct inode *
1530udf_iget(struct super_block *sb, kernel_lb_addr ino)
1531{
1532 unsigned long block = udf_get_lb_pblock(sb, ino, 0);
1533 struct inode *inode = iget_locked(sb, block);
1534
1535 if (!inode)
1536 return NULL;
1537
1538 if (inode->i_state & I_NEW) {
1539 memcpy(&UDF_I_LOCATION(inode), &ino, sizeof(kernel_lb_addr));
1540 __udf_read_inode(inode);
1541 unlock_new_inode(inode);
1542 }
1543
1544 if (is_bad_inode(inode))
1545 goto out_iput;
1546
1547 if (ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) {
1548 udf_debug("block=%d, partition=%d out of range\n",
1549 ino.logicalBlockNum, ino.partitionReferenceNum);
1550 make_bad_inode(inode);
1551 goto out_iput;
1552 }
1553
1554 return inode;
1555
1556 out_iput:
1557 iput(inode);
1558 return NULL;
1559}
1560
1561int8_t udf_add_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1562 kernel_lb_addr eloc, uint32_t elen, struct buffer_head **bh, int inc)
1563{
1564 int adsize;
1565 short_ad *sad = NULL;
1566 long_ad *lad = NULL;
1567 struct allocExtDesc *aed;
1568 int8_t etype;
1569 uint8_t *ptr;
1570
1571 if (!*bh)
1572 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1573 else
1574 ptr = (*bh)->b_data + *extoffset;
1575
1576 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
1577 adsize = sizeof(short_ad);
1578 else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
1579 adsize = sizeof(long_ad);
1580 else
1581 return -1;
1582
1583 if (*extoffset + (2 * adsize) > inode->i_sb->s_blocksize)
1584 {
1585 char *sptr, *dptr;
1586 struct buffer_head *nbh;
1587 int err, loffset;
1588 kernel_lb_addr obloc = *bloc;
1589
1590 if (!(bloc->logicalBlockNum = udf_new_block(inode->i_sb, NULL,
1591 obloc.partitionReferenceNum, obloc.logicalBlockNum, &err)))
1592 {
1593 return -1;
1594 }
1595 if (!(nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb,
1596 *bloc, 0))))
1597 {
1598 return -1;
1599 }
1600 lock_buffer(nbh);
1601 memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize);
1602 set_buffer_uptodate(nbh);
1603 unlock_buffer(nbh);
1604 mark_buffer_dirty_inode(nbh, inode);
1605
1606 aed = (struct allocExtDesc *)(nbh->b_data);
1607 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
1608 aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum);
1609 if (*extoffset + adsize > inode->i_sb->s_blocksize)
1610 {
1611 loffset = *extoffset;
1612 aed->lengthAllocDescs = cpu_to_le32(adsize);
1613 sptr = ptr - adsize;
1614 dptr = nbh->b_data + sizeof(struct allocExtDesc);
1615 memcpy(dptr, sptr, adsize);
1616 *extoffset = sizeof(struct allocExtDesc) + adsize;
1617 }
1618 else
1619 {
1620 loffset = *extoffset + adsize;
1621 aed->lengthAllocDescs = cpu_to_le32(0);
1622 sptr = ptr;
1623 *extoffset = sizeof(struct allocExtDesc);
1624
1625 if (*bh)
1626 {
1627 aed = (struct allocExtDesc *)(*bh)->b_data;
1628 aed->lengthAllocDescs =
1629 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1630 }
1631 else
1632 {
1633 UDF_I_LENALLOC(inode) += adsize;
1634 mark_inode_dirty(inode);
1635 }
1636 }
1637 if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1638 udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1,
1639 bloc->logicalBlockNum, sizeof(tag));
1640 else
1641 udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1,
1642 bloc->logicalBlockNum, sizeof(tag));
1643 switch (UDF_I_ALLOCTYPE(inode))
1644 {
1645 case ICBTAG_FLAG_AD_SHORT:
1646 {
1647 sad = (short_ad *)sptr;
1648 sad->extLength = cpu_to_le32(
1649 EXT_NEXT_EXTENT_ALLOCDECS |
1650 inode->i_sb->s_blocksize);
1651 sad->extPosition = cpu_to_le32(bloc->logicalBlockNum);
1652 break;
1653 }
1654 case ICBTAG_FLAG_AD_LONG:
1655 {
1656 lad = (long_ad *)sptr;
1657 lad->extLength = cpu_to_le32(
1658 EXT_NEXT_EXTENT_ALLOCDECS |
1659 inode->i_sb->s_blocksize);
1660 lad->extLocation = cpu_to_lelb(*bloc);
1661 memset(lad->impUse, 0x00, sizeof(lad->impUse));
1662 break;
1663 }
1664 }
1665 if (*bh)
1666 {
1667 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1668 udf_update_tag((*bh)->b_data, loffset);
1669 else
1670 udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
1671 mark_buffer_dirty_inode(*bh, inode);
1672 udf_release_data(*bh);
1673 }
1674 else
1675 mark_inode_dirty(inode);
1676 *bh = nbh;
1677 }
1678
1679 etype = udf_write_aext(inode, *bloc, extoffset, eloc, elen, *bh, inc);
1680
1681 if (!*bh)
1682 {
1683 UDF_I_LENALLOC(inode) += adsize;
1684 mark_inode_dirty(inode);
1685 }
1686 else
1687 {
1688 aed = (struct allocExtDesc *)(*bh)->b_data;
1689 aed->lengthAllocDescs =
1690 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1691 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1692 udf_update_tag((*bh)->b_data, *extoffset + (inc ? 0 : adsize));
1693 else
1694 udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
1695 mark_buffer_dirty_inode(*bh, inode);
1696 }
1697
1698 return etype;
1699}
1700
1701int8_t udf_write_aext(struct inode *inode, kernel_lb_addr bloc, int *extoffset,
1702 kernel_lb_addr eloc, uint32_t elen, struct buffer_head *bh, int inc)
1703{
1704 int adsize;
1705 uint8_t *ptr;
1706
1707 if (!bh)
1708 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1709 else
1710 {
1711 ptr = bh->b_data + *extoffset;
1712 atomic_inc(&bh->b_count);
1713 }
1714
1715 switch (UDF_I_ALLOCTYPE(inode))
1716 {
1717 case ICBTAG_FLAG_AD_SHORT:
1718 {
1719 short_ad *sad = (short_ad *)ptr;
1720 sad->extLength = cpu_to_le32(elen);
1721 sad->extPosition = cpu_to_le32(eloc.logicalBlockNum);
1722 adsize = sizeof(short_ad);
1723 break;
1724 }
1725 case ICBTAG_FLAG_AD_LONG:
1726 {
1727 long_ad *lad = (long_ad *)ptr;
1728 lad->extLength = cpu_to_le32(elen);
1729 lad->extLocation = cpu_to_lelb(eloc);
1730 memset(lad->impUse, 0x00, sizeof(lad->impUse));
1731 adsize = sizeof(long_ad);
1732 break;
1733 }
1734 default:
1735 return -1;
1736 }
1737
1738 if (bh)
1739 {
1740 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1741 {
1742 struct allocExtDesc *aed = (struct allocExtDesc *)(bh)->b_data;
1743 udf_update_tag((bh)->b_data,
1744 le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc));
1745 }
1746 mark_buffer_dirty_inode(bh, inode);
1747 udf_release_data(bh);
1748 }
1749 else
1750 mark_inode_dirty(inode);
1751
1752 if (inc)
1753 *extoffset += adsize;
1754 return (elen >> 30);
1755}
1756
1757int8_t udf_next_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1758 kernel_lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
1759{
1760 int8_t etype;
1761
1762 while ((etype = udf_current_aext(inode, bloc, extoffset, eloc, elen, bh, inc)) ==
1763 (EXT_NEXT_EXTENT_ALLOCDECS >> 30))
1764 {
1765 *bloc = *eloc;
1766 *extoffset = sizeof(struct allocExtDesc);
1767 udf_release_data(*bh);
1768 if (!(*bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, *bloc, 0))))
1769 {
1770 udf_debug("reading block %d failed!\n",
1771 udf_get_lb_pblock(inode->i_sb, *bloc, 0));
1772 return -1;
1773 }
1774 }
1775
1776 return etype;
1777}
1778
1779int8_t udf_current_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1780 kernel_lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
1781{
1782 int alen;
1783 int8_t etype;
1784 uint8_t *ptr;
1785
1786 if (!*bh)
1787 {
1788 if (!(*extoffset))
1789 *extoffset = udf_file_entry_alloc_offset(inode);
1790 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1791 alen = udf_file_entry_alloc_offset(inode) + UDF_I_LENALLOC(inode);
1792 }
1793 else
1794 {
1795 if (!(*extoffset))
1796 *extoffset = sizeof(struct allocExtDesc);
1797 ptr = (*bh)->b_data + *extoffset;
1798 alen = sizeof(struct allocExtDesc) + le32_to_cpu(((struct allocExtDesc *)(*bh)->b_data)->lengthAllocDescs);
1799 }
1800
1801 switch (UDF_I_ALLOCTYPE(inode))
1802 {
1803 case ICBTAG_FLAG_AD_SHORT:
1804 {
1805 short_ad *sad;
1806
1807 if (!(sad = udf_get_fileshortad(ptr, alen, extoffset, inc)))
1808 return -1;
1809
1810 etype = le32_to_cpu(sad->extLength) >> 30;
1811 eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
1812 eloc->partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
1813 *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
1814 break;
1815 }
1816 case ICBTAG_FLAG_AD_LONG:
1817 {
1818 long_ad *lad;
1819
1820 if (!(lad = udf_get_filelongad(ptr, alen, extoffset, inc)))
1821 return -1;
1822
1823 etype = le32_to_cpu(lad->extLength) >> 30;
1824 *eloc = lelb_to_cpu(lad->extLocation);
1825 *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK;
1826 break;
1827 }
1828 default:
1829 {
1830 udf_debug("alloc_type = %d unsupported\n", UDF_I_ALLOCTYPE(inode));
1831 return -1;
1832 }
1833 }
1834
1835 return etype;
1836}
1837
1838static int8_t
1839udf_insert_aext(struct inode *inode, kernel_lb_addr bloc, int extoffset,
1840 kernel_lb_addr neloc, uint32_t nelen, struct buffer_head *bh)
1841{
1842 kernel_lb_addr oeloc;
1843 uint32_t oelen;
1844 int8_t etype;
1845
1846 if (bh)
1847 atomic_inc(&bh->b_count);
1848
1849 while ((etype = udf_next_aext(inode, &bloc, &extoffset, &oeloc, &oelen, &bh, 0)) != -1)
1850 {
1851 udf_write_aext(inode, bloc, &extoffset, neloc, nelen, bh, 1);
1852
1853 neloc = oeloc;
1854 nelen = (etype << 30) | oelen;
1855 }
1856 udf_add_aext(inode, &bloc, &extoffset, neloc, nelen, &bh, 1);
1857 udf_release_data(bh);
1858 return (nelen >> 30);
1859}
1860
1861int8_t udf_delete_aext(struct inode *inode, kernel_lb_addr nbloc, int nextoffset,
1862 kernel_lb_addr eloc, uint32_t elen, struct buffer_head *nbh)
1863{
1864 struct buffer_head *obh;
1865 kernel_lb_addr obloc;
1866 int oextoffset, adsize;
1867 int8_t etype;
1868 struct allocExtDesc *aed;
1869
1870 if (nbh)
1871 {
1872 atomic_inc(&nbh->b_count);
1873 atomic_inc(&nbh->b_count);
1874 }
1875
1876 if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
1877 adsize = sizeof(short_ad);
1878 else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
1879 adsize = sizeof(long_ad);
1880 else
1881 adsize = 0;
1882
1883 obh = nbh;
1884 obloc = nbloc;
1885 oextoffset = nextoffset;
1886
1887 if (udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1) == -1)
1888 return -1;
1889
1890 while ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) != -1)
1891 {
1892 udf_write_aext(inode, obloc, &oextoffset, eloc, (etype << 30) | elen, obh, 1);
1893 if (obh != nbh)
1894 {
1895 obloc = nbloc;
1896 udf_release_data(obh);
1897 atomic_inc(&nbh->b_count);
1898 obh = nbh;
1899 oextoffset = nextoffset - adsize;
1900 }
1901 }
1902 memset(&eloc, 0x00, sizeof(kernel_lb_addr));
1903 elen = 0;
1904
1905 if (nbh != obh)
1906 {
1907 udf_free_blocks(inode->i_sb, inode, nbloc, 0, 1);
1908 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1909 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1910 if (!obh)
1911 {
1912 UDF_I_LENALLOC(inode) -= (adsize * 2);
1913 mark_inode_dirty(inode);
1914 }
1915 else
1916 {
1917 aed = (struct allocExtDesc *)(obh)->b_data;
1918 aed->lengthAllocDescs =
1919 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2*adsize));
1920 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1921 udf_update_tag((obh)->b_data, oextoffset - (2*adsize));
1922 else
1923 udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
1924 mark_buffer_dirty_inode(obh, inode);
1925 }
1926 }
1927 else
1928 {
1929 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1930 if (!obh)
1931 {
1932 UDF_I_LENALLOC(inode) -= adsize;
1933 mark_inode_dirty(inode);
1934 }
1935 else
1936 {
1937 aed = (struct allocExtDesc *)(obh)->b_data;
1938 aed->lengthAllocDescs =
1939 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize);
1940 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1941 udf_update_tag((obh)->b_data, oextoffset - adsize);
1942 else
1943 udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
1944 mark_buffer_dirty_inode(obh, inode);
1945 }
1946 }
1947
1948 udf_release_data(nbh);
1949 udf_release_data(obh);
1950 return (elen >> 30);
1951}
1952
1953int8_t inode_bmap(struct inode *inode, int block, kernel_lb_addr *bloc, uint32_t *extoffset,
1954 kernel_lb_addr *eloc, uint32_t *elen, uint32_t *offset, struct buffer_head **bh)
1955{
1956 uint64_t lbcount = 0, bcount = (uint64_t)block << inode->i_sb->s_blocksize_bits;
1957 int8_t etype;
1958
1959 if (block < 0)
1960 {
1961 printk(KERN_ERR "udf: inode_bmap: block < 0\n");
1962 return -1;
1963 }
Linus Torvalds1da177e2005-04-16 15:20:36 -07001964
1965 *extoffset = 0;
1966 *elen = 0;
1967 *bloc = UDF_I_LOCATION(inode);
1968
1969 do
1970 {
1971 if ((etype = udf_next_aext(inode, bloc, extoffset, eloc, elen, bh, 1)) == -1)
1972 {
1973 *offset = bcount - lbcount;
1974 UDF_I_LENEXTENTS(inode) = lbcount;
1975 return -1;
1976 }
1977 lbcount += *elen;
1978 } while (lbcount <= bcount);
1979
1980 *offset = bcount + *elen - lbcount;
1981
1982 return etype;
1983}
1984
1985long udf_block_map(struct inode *inode, long block)
1986{
1987 kernel_lb_addr eloc, bloc;
1988 uint32_t offset, extoffset, elen;
1989 struct buffer_head *bh = NULL;
1990 int ret;
1991
1992 lock_kernel();
1993
1994 if (inode_bmap(inode, block, &bloc, &extoffset, &eloc, &elen, &offset, &bh) == (EXT_RECORDED_ALLOCATED >> 30))
1995 ret = udf_get_lb_pblock(inode->i_sb, eloc, offset >> inode->i_sb->s_blocksize_bits);
1996 else
1997 ret = 0;
1998
1999 unlock_kernel();
2000 udf_release_data(bh);
2001
2002 if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
2003 return udf_fixed_to_variable(ret);
2004 else
2005 return ret;
2006}