]> err.no Git - linux-2.6/blob - fs/udf/inode.c
Merge git://oss.sgi.com:8090/oss/git/xfs-2.6
[linux-2.6] / fs / udf / inode.c
1 /*
2  * inode.c
3  *
4  * PURPOSE
5  *  Inode handling routines for the OSTA-UDF(tm) filesystem.
6  *
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.
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
43 MODULE_AUTHOR("Ben Fennema");
44 MODULE_DESCRIPTION("Universal Disk Format Filesystem");
45 MODULE_LICENSE("GPL");
46
47 #define EXTENT_MERGE_SIZE 5
48
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);
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  */
83 void udf_delete_inode(struct inode * inode)
84 {
85         truncate_inode_pages(&inode->i_data, 0);
86
87         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;
99 no_delete:
100         clear_inode(inode);
101 }
102
103 void 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
115 static int udf_writepage(struct page *page, struct writeback_control *wbc)
116 {
117         return block_write_full_page(page, udf_get_block, wbc);
118 }
119
120 static int udf_readpage(struct file *file, struct page *page)
121 {
122         return block_read_full_page(page, udf_get_block);
123 }
124
125 static 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
130 static sector_t udf_bmap(struct address_space *mapping, sector_t block)
131 {
132         return generic_block_bmap(mapping,block,udf_get_block);
133 }
134
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,
142 };
143
144 void 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);
167         BUG_ON(!PageLocked(page));
168
169         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
194 struct 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
283 static 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);
315         if (bh)
316                 BUG();
317         if (err)
318                 goto abort;
319         if (!phys)
320                 BUG();
321
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;
328
329 abort_negative:
330         udf_warning(inode->i_sb, "udf_get_block", "block < 0");
331         goto abort;
332 }
333
334 static struct buffer_head *
335 udf_getblk(struct inode *inode, long block, int create, int *err)
336 {
337         struct buffer_head dummy;
338
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))
343         {
344                 struct buffer_head *bh;
345                 bh = sb_getblk(inode->i_sb, dummy.b_blocknr);
346                 if (buffer_new(&dummy))
347                 {
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);
353                 }
354                 return bh;
355         }
356         return NULL;
357 }
358
359 static struct buffer_head * inode_getblk(struct inode * inode, long block,
360         int *err, long *phys, int *new)
361 {
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;
374
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);
378
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 */
382         do
383         {
384                 if (pbh != cbh)
385                 {
386                         udf_release_data(pbh);
387                         atomic_inc(&cbh->b_count);
388                         pbh = cbh;
389                 }
390                 if (cbh != nbh)
391                 {
392                         udf_release_data(cbh);
393                         atomic_inc(&nbh->b_count);
394                         cbh = nbh;
395                 }
396
397                 lbcount += elen;
398
399                 pbloc = cbloc;
400                 cbloc = nbloc;
401
402                 pextoffset = cextoffset;
403                 cextoffset = nextoffset;
404
405                 if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) == -1)
406                         break;
407
408                 c = !c;
409
410                 laarr[c].extLength = (etype << 30) | elen;
411                 laarr[c].extLocation = eloc;
412
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);
417
418                 count ++;
419         } while (lbcount + elen <= b_off);
420
421         b_off -= lbcount;
422         offset = b_off >> inode->i_sb->s_blocksize_bits;
423
424         /* if the extent is allocated and recorded, return the block
425        if the extent is not a multiple of the blocksize, round up */
426
427         if (etype == (EXT_RECORDED_ALLOCATED >> 30))
428         {
429                 if (elen & (inode->i_sb->s_blocksize - 1))
430                 {
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);
435                 }
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;
442         }
443
444         if (etype == -1)
445         {
446                 endnum = startnum = ((count > 1) ? 1 : count);
447                 if (laarr[c].extLength & (inode->i_sb->s_blocksize - 1))
448                 {
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);
457                 }
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;
465         }
466         else
467                 endnum = startnum = ((count > 2) ? 2 : count);
468
469         /* if the current extent is in position 0, swap it with the previous */
470         if (!c && count != 1)
471         {
472                 laarr[2] = laarr[0];
473                 laarr[0] = laarr[1];
474                 laarr[1] = laarr[2];
475                 c = 1;
476         }
477
478         /* if the current block is located in a extent, read the next extent */
479         if (etype != -1)
480         {
481                 if ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 0)) != -1)
482                 {
483                         laarr[c+1].extLength = (etype << 30) | elen;
484                         laarr[c+1].extLocation = eloc;
485                         count ++;
486                         startnum ++;
487                         endnum ++;
488                 }
489                 else
490                         lastblock = 1;
491         }
492         udf_release_data(cbh);
493         udf_release_data(nbh);
494
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 */
500         {
501                 if (UDF_I_NEXT_ALLOC_BLOCK(inode) == block)
502                         goal = UDF_I_NEXT_ALLOC_GOAL(inode);
503
504                 if (!goal)
505                 {
506                         if (!(goal = pgoal))
507                                 goal = UDF_I_LOCATION(inode).logicalBlockNum + 1;
508                 }
509
510                 if (!(newblocknum = udf_new_block(inode->i_sb, inode,
511                         UDF_I_LOCATION(inode).partitionReferenceNum, goal, err)))
512                 {
513                         udf_release_data(pbh);
514                         *err = -ENOSPC;
515                         return NULL;
516                 }
517                 UDF_I_LENEXTENTS(inode) += inode->i_sb->s_blocksize;
518         }
519
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);
524
525 #ifdef UDF_PREALLOCATE
526         /* preallocate blocks */
527         udf_prealloc_extents(inode, c, lastblock, laarr, &endnum);
528 #endif
529
530         /* merge any continuous blocks in laarr */
531         udf_merge_extents(inode, laarr, &endnum);
532
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);
537
538         udf_release_data(pbh);
539
540         if (!(newblock = udf_get_pblock(inode->i_sb, newblocknum,
541                 UDF_I_LOCATION(inode).partitionReferenceNum, 0)))
542         {
543                 return NULL;
544         }
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);
551
552         if (IS_SYNC(inode))
553                 udf_sync_inode(inode);
554         else
555                 mark_inode_dirty(inode);
556         return result;
557 }
558
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)
561 {
562         if ((laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30) ||
563                 (laarr[*c].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30))
564         {
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);
569
570                 if (blen == 1)
571                         ;
572                 else if (!offset || blen == offset + 1)
573                 {
574                         laarr[curr+2] = laarr[curr+1];
575                         laarr[curr+1] = laarr[curr];
576                 }
577                 else
578                 {
579                         laarr[curr+3] = laarr[curr+1];
580                         laarr[curr+2] = laarr[curr+1] = laarr[curr];
581                 }
582
583                 if (offset)
584                 {
585                         if (etype == (EXT_NOT_RECORDED_ALLOCATED >> 30))
586                         {
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;
592                         }
593                         else
594                                 laarr[curr].extLength = (etype << 30) |
595                                         (offset << inode->i_sb->s_blocksize_bits);
596                         curr ++;
597                         (*c) ++;
598                         (*endnum) ++;
599                 }
600                 
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 ++;
608
609                 if (blen != offset + 1)
610                 {
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) ++;
617                 }
618         }
619 }
620
621 static void udf_prealloc_extents(struct inode *inode, int c, int lastblock,
622          kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
623 {
624         int start, length = 0, currlength = 0, i;
625
626         if (*endnum >= (c+1))
627         {
628                 if (!lastblock)
629                         return;
630                 else
631                         start = c;
632         }
633         else
634         {
635                 if ((laarr[c+1].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
636                 {
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);
640                 }
641                 else
642                         start = c;
643         }
644
645         for (i=start+1; i<=*endnum; i++)
646         {
647                 if (i == *endnum)
648                 {
649                         if (lastblock)
650                                 length += UDF_DEFAULT_PREALLOC_BLOCKS;
651                 }
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;
657         }
658
659         if (length)
660         {
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);
668
669                 if (numalloc)
670                 {
671                         if (start == (c+1))
672                                 laarr[start].extLength +=
673                                         (numalloc << inode->i_sb->s_blocksize_bits);
674                         else
675                         {
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;
685                         }
686
687                         for (i=start+1; numalloc && i<*endnum; i++)
688                         {
689                                 int elen = ((laarr[i].extLength & UDF_EXTENT_LENGTH_MASK) +
690                                         inode->i_sb->s_blocksize - 1) >> inode->i_sb->s_blocksize_bits;
691
692                                 if (elen > numalloc)
693                                 {
694                                         laarr[i].extLength -=
695                                                 (numalloc << inode->i_sb->s_blocksize_bits);
696                                         numalloc = 0;
697                                 }
698                                 else
699                                 {
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) --;
706                                 }
707                         }
708                         UDF_I_LENEXTENTS(inode) += numalloc << inode->i_sb->s_blocksize_bits;
709                 }
710         }
711 }
712
713 static void udf_merge_extents(struct inode *inode,
714          kernel_long_ad laarr[EXTENT_MERGE_SIZE], int *endnum)
715 {
716         int i;
717
718         for (i=0; i<(*endnum-1); i++)
719         {
720                 if ((laarr[i].extLength >> 30) == (laarr[i+1].extLength >> 30))
721                 {
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)))
726                         {
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)
730                                 {
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);
740                                 }
741                                 else
742                                 {
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) --;
751                                 }
752                         }
753                 }
754                 else if (((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30)) &&
755                         ((laarr[i+1].extLength >> 30) == (EXT_NOT_RECORDED_NOT_ALLOCATED >> 30)))
756                 {
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;
762
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)
766                         {
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;
772                         }
773                         else
774                         {
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) --;
783                         }
784                 }
785                 else if ((laarr[i].extLength >> 30) == (EXT_NOT_RECORDED_ALLOCATED >> 30))
786                 {
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;
794                 }
795         }
796 }
797
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)
801 {
802         int start = 0, i;
803         kernel_lb_addr tmploc;
804         uint32_t tmplen;
805
806         if (startnum > endnum)
807         {
808                 for (i=0; i<(startnum-endnum); i++)
809                 {
810                         udf_delete_aext(inode, pbloc, pextoffset, laarr[i].extLocation,
811                                 laarr[i].extLength, *pbh);
812                 }
813         }
814         else if (startnum < endnum)
815         {
816                 for (i=0; i<(endnum-startnum); i++)
817                 {
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 ++;
823                 }
824         }
825
826         for (i=start; i<endnum; i++)
827         {
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);
831         }
832 }
833
834 struct buffer_head * udf_bread(struct inode * inode, int block,
835         int create, int * err)
836 {
837         struct buffer_head * bh = NULL;
838
839         bh = udf_getblk(inode, block, create, err);
840         if (!bh)
841                 return NULL;
842
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;
852 }
853
854 void udf_truncate(struct inode * inode)
855 {
856         int offset;
857         int err;
858
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;
864
865         lock_kernel();
866         if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
867         {
868                 if (inode->i_sb->s_blocksize < (udf_file_entry_alloc_offset(inode) +
869                         inode->i_size))
870                 {
871                         udf_expand_file_adinicb(inode, inode->i_size, &err);
872                         if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
873                         {
874                                 inode->i_size = UDF_I_LENALLOC(inode);
875                                 unlock_kernel();
876                                 return;
877                         }
878                         else
879                                 udf_truncate_extents(inode);
880                 }
881                 else
882                 {
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;
886                 }
887         }
888         else
889         {
890                 block_truncate_page(inode->i_mapping, inode->i_size, udf_get_block);
891                 udf_truncate_extents(inode);
892         }       
893
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();
900 }
901
902 static void
903 __udf_read_inode(struct inode *inode)
904 {
905         struct buffer_head *bh = NULL;
906         struct fileEntry *fe;
907         uint16_t ident;
908
909         /*
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;
920          */
921         inode->i_blksize = PAGE_SIZE;
922
923         bh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 0, &ident);
924
925         if (!bh)
926         {
927                 printk(KERN_ERR "udf: udf_read_inode(ino %ld) failed !bh\n",
928                         inode->i_ino);
929                 make_bad_inode(inode);
930                 return;
931         }
932
933         if (ident != TAG_IDENT_FE && ident != TAG_IDENT_EFE &&
934                 ident != TAG_IDENT_USE)
935         {
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;
941         }
942
943         fe = (struct fileEntry *)bh->b_data;
944
945         if (le16_to_cpu(fe->icbTag.strategyType) == 4096)
946         {
947                 struct buffer_head *ibh = NULL, *nbh = NULL;
948                 struct indirectEntry *ie;
949
950                 ibh = udf_read_ptagged(inode->i_sb, UDF_I_LOCATION(inode), 1, &ident);
951                 if (ident == TAG_IDENT_IE)
952                 {
953                         if (ibh)
954                         {
955                                 kernel_lb_addr loc;
956                                 ie = (struct indirectEntry *)ibh->b_data;
957         
958                                 loc = lelb_to_cpu(ie->indirectICB.extLocation);
959         
960                                 if (ie->indirectICB.extLength && 
961                                         (nbh = udf_read_ptagged(inode->i_sb, loc, 0, &ident)))
962                                 {
963                                         if (ident == TAG_IDENT_FE ||
964                                                 ident == TAG_IDENT_EFE)
965                                         {
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;
972                                         }
973                                         else
974                                         {
975                                                 udf_release_data(nbh);
976                                                 udf_release_data(ibh);
977                                         }
978                                 }
979                                 else
980                                         udf_release_data(ibh);
981                         }
982                 }
983                 else
984                         udf_release_data(ibh);
985         }
986         else if (le16_to_cpu(fe->icbTag.strategyType) != 4)
987         {
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;
993         }
994         udf_fill_inode(inode, bh);
995         udf_release_data(bh);
996 }
997
998 static void udf_fill_inode(struct inode *inode, struct buffer_head *bh)
999 {
1000         struct fileEntry *fe;
1001         struct extendedFileEntry *efe;
1002         time_t convtime;
1003         long convtime_usec;
1004         int offset;
1005
1006         fe = (struct fileEntry *)bh->b_data;
1007         efe = (struct extendedFileEntry *)bh->b_data;
1008
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;
1013
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)
1022         {
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));
1027         }
1028         else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_FE)
1029         {
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));
1034         }
1035         else if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1036         {
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;
1045         }
1046
1047         inode->i_uid = le32_to_cpu(fe->uid);
1048         if ( inode->i_uid == -1 ) inode->i_uid = UDF_SB(inode->i_sb)->s_uid;
1049
1050         inode->i_gid = le32_to_cpu(fe->gid);
1051         if ( inode->i_gid == -1 ) inode->i_gid = UDF_SB(inode->i_sb)->s_gid;
1052
1053         inode->i_nlink = le16_to_cpu(fe->fileLinkCount);
1054         if (!inode->i_nlink)
1055                 inode->i_nlink = 1;
1056         
1057         inode->i_size = le64_to_cpu(fe->informationLength);
1058         UDF_I_LENEXTENTS(inode) = inode->i_size;
1059
1060         inode->i_mode = udf_convert_permissions(fe);
1061         inode->i_mode &= ~UDF_SB(inode->i_sb)->s_umask;
1062
1063         if (UDF_I_EFE(inode) == 0)
1064         {
1065                 inode->i_blocks = le64_to_cpu(fe->logicalBlocksRecorded) <<
1066                         (inode->i_sb->s_blocksize_bits - 9);
1067
1068                 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1069                         lets_to_cpu(fe->accessTime)) )
1070                 {
1071                         inode->i_atime.tv_sec = convtime;
1072                         inode->i_atime.tv_nsec = convtime_usec * 1000;
1073                 }
1074                 else
1075                 {
1076                         inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1077                 }
1078
1079                 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1080                         lets_to_cpu(fe->modificationTime)) )
1081                 {
1082                         inode->i_mtime.tv_sec = convtime;
1083                         inode->i_mtime.tv_nsec = convtime_usec * 1000;
1084                 }
1085                 else
1086                 {
1087                         inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1088                 }
1089
1090                 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1091                         lets_to_cpu(fe->attrTime)) )
1092                 {
1093                         inode->i_ctime.tv_sec = convtime;
1094                         inode->i_ctime.tv_nsec = convtime_usec * 1000;
1095                 }
1096                 else
1097                 {
1098                         inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1099                 }
1100
1101                 UDF_I_UNIQUE(inode) = le64_to_cpu(fe->uniqueID);
1102                 UDF_I_LENEATTR(inode) = le32_to_cpu(fe->lengthExtendedAttr);
1103                 UDF_I_LENALLOC(inode) = le32_to_cpu(fe->lengthAllocDescs);
1104                 offset = sizeof(struct fileEntry) + UDF_I_LENEATTR(inode);
1105         }
1106         else
1107         {
1108                 inode->i_blocks = le64_to_cpu(efe->logicalBlocksRecorded) << 
1109                         (inode->i_sb->s_blocksize_bits - 9);
1110
1111                 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1112                         lets_to_cpu(efe->accessTime)) )
1113                 {
1114                         inode->i_atime.tv_sec = convtime;
1115                         inode->i_atime.tv_nsec = convtime_usec * 1000;
1116                 }
1117                 else
1118                 {
1119                         inode->i_atime = UDF_SB_RECORDTIME(inode->i_sb);
1120                 }
1121
1122                 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1123                         lets_to_cpu(efe->modificationTime)) )
1124                 {
1125                         inode->i_mtime.tv_sec = convtime;
1126                         inode->i_mtime.tv_nsec = convtime_usec * 1000;
1127                 }
1128                 else
1129                 {
1130                         inode->i_mtime = UDF_SB_RECORDTIME(inode->i_sb);
1131                 }
1132
1133                 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1134                         lets_to_cpu(efe->createTime)) )
1135                 {
1136                         UDF_I_CRTIME(inode).tv_sec = convtime;
1137                         UDF_I_CRTIME(inode).tv_nsec = convtime_usec * 1000;
1138                 }
1139                 else
1140                 {
1141                         UDF_I_CRTIME(inode) = UDF_SB_RECORDTIME(inode->i_sb);
1142                 }
1143
1144                 if ( udf_stamp_to_time(&convtime, &convtime_usec,
1145                         lets_to_cpu(efe->attrTime)) )
1146                 {
1147                         inode->i_ctime.tv_sec = convtime;
1148                         inode->i_ctime.tv_nsec = convtime_usec * 1000;
1149                 }
1150                 else
1151                 {
1152                         inode->i_ctime = UDF_SB_RECORDTIME(inode->i_sb);
1153                 }
1154
1155                 UDF_I_UNIQUE(inode) = le64_to_cpu(efe->uniqueID);
1156                 UDF_I_LENEATTR(inode) = le32_to_cpu(efe->lengthExtendedAttr);
1157                 UDF_I_LENALLOC(inode) = le32_to_cpu(efe->lengthAllocDescs);
1158                 offset = sizeof(struct extendedFileEntry) + UDF_I_LENEATTR(inode);
1159         }
1160
1161         switch (fe->icbTag.fileType)
1162         {
1163                 case ICBTAG_FILE_TYPE_DIRECTORY:
1164                 {
1165                         inode->i_op = &udf_dir_inode_operations;
1166                         inode->i_fop = &udf_dir_operations;
1167                         inode->i_mode |= S_IFDIR;
1168                         inode->i_nlink ++;
1169                         break;
1170                 }
1171                 case ICBTAG_FILE_TYPE_REALTIME:
1172                 case ICBTAG_FILE_TYPE_REGULAR:
1173                 case ICBTAG_FILE_TYPE_UNDEF:
1174                 {
1175                         if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_IN_ICB)
1176                                 inode->i_data.a_ops = &udf_adinicb_aops;
1177                         else
1178                                 inode->i_data.a_ops = &udf_aops;
1179                         inode->i_op = &udf_file_inode_operations;
1180                         inode->i_fop = &udf_file_operations;
1181                         inode->i_mode |= S_IFREG;
1182                         break;
1183                 }
1184                 case ICBTAG_FILE_TYPE_BLOCK:
1185                 {
1186                         inode->i_mode |= S_IFBLK;
1187                         break;
1188                 }
1189                 case ICBTAG_FILE_TYPE_CHAR:
1190                 {
1191                         inode->i_mode |= S_IFCHR;
1192                         break;
1193                 }
1194                 case ICBTAG_FILE_TYPE_FIFO:
1195                 {
1196                         init_special_inode(inode, inode->i_mode | S_IFIFO, 0);
1197                         break;
1198                 }
1199                 case ICBTAG_FILE_TYPE_SOCKET:
1200                 {
1201                         init_special_inode(inode, inode->i_mode | S_IFSOCK, 0);
1202                         break;
1203                 }
1204                 case ICBTAG_FILE_TYPE_SYMLINK:
1205                 {
1206                         inode->i_data.a_ops = &udf_symlink_aops;
1207                         inode->i_op = &page_symlink_inode_operations;
1208                         inode->i_mode = S_IFLNK|S_IRWXUGO;
1209                         break;
1210                 }
1211                 default:
1212                 {
1213                         printk(KERN_ERR "udf: udf_fill_inode(ino %ld) failed unknown file type=%d\n",
1214                                 inode->i_ino, fe->icbTag.fileType);
1215                         make_bad_inode(inode);
1216                         return;
1217                 }
1218         }
1219         if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1220         {
1221                 struct deviceSpec *dsea =
1222                         (struct deviceSpec *)
1223                                 udf_get_extendedattr(inode, 12, 1);
1224
1225                 if (dsea)
1226                 {
1227                         init_special_inode(inode, inode->i_mode, MKDEV(
1228                                 le32_to_cpu(dsea->majorDeviceIdent),
1229                                 le32_to_cpu(dsea->minorDeviceIdent)));
1230                         /* Developer ID ??? */
1231                 }
1232                 else
1233                 {
1234                         make_bad_inode(inode);
1235                 }
1236         }
1237 }
1238
1239 static mode_t
1240 udf_convert_permissions(struct fileEntry *fe)
1241 {
1242         mode_t mode;
1243         uint32_t permissions;
1244         uint32_t flags;
1245
1246         permissions = le32_to_cpu(fe->permissions);
1247         flags = le16_to_cpu(fe->icbTag.flags);
1248
1249         mode =  (( permissions      ) & S_IRWXO) |
1250                 (( permissions >> 2 ) & S_IRWXG) |
1251                 (( permissions >> 4 ) & S_IRWXU) |
1252                 (( flags & ICBTAG_FLAG_SETUID) ? S_ISUID : 0) |
1253                 (( flags & ICBTAG_FLAG_SETGID) ? S_ISGID : 0) |
1254                 (( flags & ICBTAG_FLAG_STICKY) ? S_ISVTX : 0);
1255
1256         return mode;
1257 }
1258
1259 /*
1260  * udf_write_inode
1261  *
1262  * PURPOSE
1263  *      Write out the specified inode.
1264  *
1265  * DESCRIPTION
1266  *      This routine is called whenever an inode is synced.
1267  *      Currently this routine is just a placeholder.
1268  *
1269  * HISTORY
1270  *      July 1, 1997 - Andrew E. Mileski
1271  *      Written, tested, and released.
1272  */
1273
1274 int udf_write_inode(struct inode * inode, int sync)
1275 {
1276         int ret;
1277         lock_kernel();
1278         ret = udf_update_inode(inode, sync);
1279         unlock_kernel();
1280         return ret;
1281 }
1282
1283 int udf_sync_inode(struct inode * inode)
1284 {
1285         return udf_update_inode(inode, 1);
1286 }
1287
1288 static int
1289 udf_update_inode(struct inode *inode, int do_sync)
1290 {
1291         struct buffer_head *bh = NULL;
1292         struct fileEntry *fe;
1293         struct extendedFileEntry *efe;
1294         uint32_t udfperms;
1295         uint16_t icbflags;
1296         uint16_t crclen;
1297         int i;
1298         kernel_timestamp cpu_time;
1299         int err = 0;
1300
1301         bh = udf_tread(inode->i_sb,
1302                 udf_get_lb_pblock(inode->i_sb, UDF_I_LOCATION(inode), 0));
1303
1304         if (!bh)
1305         {
1306                 udf_debug("bread failure\n");
1307                 return -EIO;
1308         }
1309
1310         memset(bh->b_data, 0x00, inode->i_sb->s_blocksize);
1311
1312         fe = (struct fileEntry *)bh->b_data;
1313         efe = (struct extendedFileEntry *)bh->b_data;
1314
1315         if (le16_to_cpu(fe->descTag.tagIdent) == TAG_IDENT_USE)
1316         {
1317                 struct unallocSpaceEntry *use =
1318                         (struct unallocSpaceEntry *)bh->b_data;
1319
1320                 use->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1321                 memcpy(bh->b_data + sizeof(struct unallocSpaceEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct unallocSpaceEntry));
1322                 crclen = sizeof(struct unallocSpaceEntry) + UDF_I_LENALLOC(inode) -
1323                         sizeof(tag);
1324                 use->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1325                 use->descTag.descCRCLength = cpu_to_le16(crclen);
1326                 use->descTag.descCRC = cpu_to_le16(udf_crc((char *)use + sizeof(tag), crclen, 0));
1327
1328                 use->descTag.tagChecksum = 0;
1329                 for (i=0; i<16; i++)
1330                         if (i != 4)
1331                                 use->descTag.tagChecksum += ((uint8_t *)&(use->descTag))[i];
1332
1333                 mark_buffer_dirty(bh);
1334                 udf_release_data(bh);
1335                 return err;
1336         }
1337
1338         if (inode->i_uid != UDF_SB(inode->i_sb)->s_uid)
1339                 fe->uid = cpu_to_le32(inode->i_uid);
1340
1341         if (inode->i_gid != UDF_SB(inode->i_sb)->s_gid)
1342                 fe->gid = cpu_to_le32(inode->i_gid);
1343
1344         udfperms =      ((inode->i_mode & S_IRWXO)     ) |
1345                         ((inode->i_mode & S_IRWXG) << 2) |
1346                         ((inode->i_mode & S_IRWXU) << 4);
1347
1348         udfperms |=     (le32_to_cpu(fe->permissions) &
1349                         (FE_PERM_O_DELETE | FE_PERM_O_CHATTR |
1350                          FE_PERM_G_DELETE | FE_PERM_G_CHATTR |
1351                          FE_PERM_U_DELETE | FE_PERM_U_CHATTR));
1352         fe->permissions = cpu_to_le32(udfperms);
1353
1354         if (S_ISDIR(inode->i_mode))
1355                 fe->fileLinkCount = cpu_to_le16(inode->i_nlink - 1);
1356         else
1357                 fe->fileLinkCount = cpu_to_le16(inode->i_nlink);
1358
1359         fe->informationLength = cpu_to_le64(inode->i_size);
1360
1361         if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
1362         {
1363                 regid *eid;
1364                 struct deviceSpec *dsea =
1365                         (struct deviceSpec *)
1366                                 udf_get_extendedattr(inode, 12, 1);
1367
1368                 if (!dsea)
1369                 {
1370                         dsea = (struct deviceSpec *)
1371                                 udf_add_extendedattr(inode,
1372                                         sizeof(struct deviceSpec) +
1373                                         sizeof(regid), 12, 0x3);
1374                         dsea->attrType = cpu_to_le32(12);
1375                         dsea->attrSubtype = 1;
1376                         dsea->attrLength = cpu_to_le32(sizeof(struct deviceSpec) +
1377                                 sizeof(regid));
1378                         dsea->impUseLength = cpu_to_le32(sizeof(regid));
1379                 }
1380                 eid = (regid *)dsea->impUse;
1381                 memset(eid, 0, sizeof(regid));
1382                 strcpy(eid->ident, UDF_ID_DEVELOPER);
1383                 eid->identSuffix[0] = UDF_OS_CLASS_UNIX;
1384                 eid->identSuffix[1] = UDF_OS_ID_LINUX;
1385                 dsea->majorDeviceIdent = cpu_to_le32(imajor(inode));
1386                 dsea->minorDeviceIdent = cpu_to_le32(iminor(inode));
1387         }
1388
1389         if (UDF_I_EFE(inode) == 0)
1390         {
1391                 memcpy(bh->b_data + sizeof(struct fileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct fileEntry));
1392                 fe->logicalBlocksRecorded = cpu_to_le64(
1393                         (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1394                         (inode->i_sb->s_blocksize_bits - 9));
1395
1396                 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1397                         fe->accessTime = cpu_to_lets(cpu_time);
1398                 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1399                         fe->modificationTime = cpu_to_lets(cpu_time);
1400                 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1401                         fe->attrTime = cpu_to_lets(cpu_time);
1402                 memset(&(fe->impIdent), 0, sizeof(regid));
1403                 strcpy(fe->impIdent.ident, UDF_ID_DEVELOPER);
1404                 fe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1405                 fe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1406                 fe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1407                 fe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1408                 fe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1409                 fe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_FE);
1410                 crclen = sizeof(struct fileEntry);
1411         }
1412         else
1413         {
1414                 memcpy(bh->b_data + sizeof(struct extendedFileEntry), UDF_I_DATA(inode), inode->i_sb->s_blocksize - sizeof(struct extendedFileEntry));
1415                 efe->objectSize = cpu_to_le64(inode->i_size);
1416                 efe->logicalBlocksRecorded = cpu_to_le64(
1417                         (inode->i_blocks + (1 << (inode->i_sb->s_blocksize_bits - 9)) - 1) >>
1418                         (inode->i_sb->s_blocksize_bits - 9));
1419
1420                 if (UDF_I_CRTIME(inode).tv_sec > inode->i_atime.tv_sec ||
1421                         (UDF_I_CRTIME(inode).tv_sec == inode->i_atime.tv_sec &&
1422                          UDF_I_CRTIME(inode).tv_nsec > inode->i_atime.tv_nsec))
1423                 {
1424                         UDF_I_CRTIME(inode) = inode->i_atime;
1425                 }
1426                 if (UDF_I_CRTIME(inode).tv_sec > inode->i_mtime.tv_sec ||
1427                         (UDF_I_CRTIME(inode).tv_sec == inode->i_mtime.tv_sec &&
1428                          UDF_I_CRTIME(inode).tv_nsec > inode->i_mtime.tv_nsec))
1429                 {
1430                         UDF_I_CRTIME(inode) = inode->i_mtime;
1431                 }
1432                 if (UDF_I_CRTIME(inode).tv_sec > inode->i_ctime.tv_sec ||
1433                         (UDF_I_CRTIME(inode).tv_sec == inode->i_ctime.tv_sec &&
1434                          UDF_I_CRTIME(inode).tv_nsec > inode->i_ctime.tv_nsec))
1435                 {
1436                         UDF_I_CRTIME(inode) = inode->i_ctime;
1437                 }
1438
1439                 if (udf_time_to_stamp(&cpu_time, inode->i_atime))
1440                         efe->accessTime = cpu_to_lets(cpu_time);
1441                 if (udf_time_to_stamp(&cpu_time, inode->i_mtime))
1442                         efe->modificationTime = cpu_to_lets(cpu_time);
1443                 if (udf_time_to_stamp(&cpu_time, UDF_I_CRTIME(inode)))
1444                         efe->createTime = cpu_to_lets(cpu_time);
1445                 if (udf_time_to_stamp(&cpu_time, inode->i_ctime))
1446                         efe->attrTime = cpu_to_lets(cpu_time);
1447
1448                 memset(&(efe->impIdent), 0, sizeof(regid));
1449                 strcpy(efe->impIdent.ident, UDF_ID_DEVELOPER);
1450                 efe->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1451                 efe->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1452                 efe->uniqueID = cpu_to_le64(UDF_I_UNIQUE(inode));
1453                 efe->lengthExtendedAttr = cpu_to_le32(UDF_I_LENEATTR(inode));
1454                 efe->lengthAllocDescs = cpu_to_le32(UDF_I_LENALLOC(inode));
1455                 efe->descTag.tagIdent = cpu_to_le16(TAG_IDENT_EFE);
1456                 crclen = sizeof(struct extendedFileEntry);
1457         }
1458         if (UDF_I_STRAT4096(inode))
1459         {
1460                 fe->icbTag.strategyType = cpu_to_le16(4096);
1461                 fe->icbTag.strategyParameter = cpu_to_le16(1);
1462                 fe->icbTag.numEntries = cpu_to_le16(2);
1463         }
1464         else
1465         {
1466                 fe->icbTag.strategyType = cpu_to_le16(4);
1467                 fe->icbTag.numEntries = cpu_to_le16(1);
1468         }
1469
1470         if (S_ISDIR(inode->i_mode))
1471                 fe->icbTag.fileType = ICBTAG_FILE_TYPE_DIRECTORY;
1472         else if (S_ISREG(inode->i_mode))
1473                 fe->icbTag.fileType = ICBTAG_FILE_TYPE_REGULAR;
1474         else if (S_ISLNK(inode->i_mode))
1475                 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SYMLINK;
1476         else if (S_ISBLK(inode->i_mode))
1477                 fe->icbTag.fileType = ICBTAG_FILE_TYPE_BLOCK;
1478         else if (S_ISCHR(inode->i_mode))
1479                 fe->icbTag.fileType = ICBTAG_FILE_TYPE_CHAR;
1480         else if (S_ISFIFO(inode->i_mode))
1481                 fe->icbTag.fileType = ICBTAG_FILE_TYPE_FIFO;
1482         else if (S_ISSOCK(inode->i_mode))
1483                 fe->icbTag.fileType = ICBTAG_FILE_TYPE_SOCKET;
1484
1485         icbflags =      UDF_I_ALLOCTYPE(inode) |
1486                         ((inode->i_mode & S_ISUID) ? ICBTAG_FLAG_SETUID : 0) |
1487                         ((inode->i_mode & S_ISGID) ? ICBTAG_FLAG_SETGID : 0) |
1488                         ((inode->i_mode & S_ISVTX) ? ICBTAG_FLAG_STICKY : 0) |
1489                         (le16_to_cpu(fe->icbTag.flags) &
1490                                 ~(ICBTAG_FLAG_AD_MASK | ICBTAG_FLAG_SETUID |
1491                                 ICBTAG_FLAG_SETGID | ICBTAG_FLAG_STICKY));
1492
1493         fe->icbTag.flags = cpu_to_le16(icbflags);
1494         if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1495                 fe->descTag.descVersion = cpu_to_le16(3);
1496         else
1497                 fe->descTag.descVersion = cpu_to_le16(2);
1498         fe->descTag.tagSerialNum = cpu_to_le16(UDF_SB_SERIALNUM(inode->i_sb));
1499         fe->descTag.tagLocation = cpu_to_le32(UDF_I_LOCATION(inode).logicalBlockNum);
1500         crclen += UDF_I_LENEATTR(inode) + UDF_I_LENALLOC(inode) - sizeof(tag);
1501         fe->descTag.descCRCLength = cpu_to_le16(crclen);
1502         fe->descTag.descCRC = cpu_to_le16(udf_crc((char *)fe + sizeof(tag), crclen, 0));
1503
1504         fe->descTag.tagChecksum = 0;
1505         for (i=0; i<16; i++)
1506                 if (i != 4)
1507                         fe->descTag.tagChecksum += ((uint8_t *)&(fe->descTag))[i];
1508
1509         /* write the data blocks */
1510         mark_buffer_dirty(bh);
1511         if (do_sync)
1512         {
1513                 sync_dirty_buffer(bh);
1514                 if (buffer_req(bh) && !buffer_uptodate(bh))
1515                 {
1516                         printk("IO error syncing udf inode [%s:%08lx]\n",
1517                                 inode->i_sb->s_id, inode->i_ino);
1518                         err = -EIO;
1519                 }
1520         }
1521         udf_release_data(bh);
1522         return err;
1523 }
1524
1525 struct inode *
1526 udf_iget(struct super_block *sb, kernel_lb_addr ino)
1527 {
1528         unsigned long block = udf_get_lb_pblock(sb, ino, 0);
1529         struct inode *inode = iget_locked(sb, block);
1530
1531         if (!inode)
1532                 return NULL;
1533
1534         if (inode->i_state & I_NEW) {
1535                 memcpy(&UDF_I_LOCATION(inode), &ino, sizeof(kernel_lb_addr));
1536                 __udf_read_inode(inode);
1537                 unlock_new_inode(inode);
1538         }
1539
1540         if (is_bad_inode(inode))
1541                 goto out_iput;
1542
1543         if (ino.logicalBlockNum >= UDF_SB_PARTLEN(sb, ino.partitionReferenceNum)) {
1544                 udf_debug("block=%d, partition=%d out of range\n",
1545                         ino.logicalBlockNum, ino.partitionReferenceNum);
1546                 make_bad_inode(inode);
1547                 goto out_iput;
1548         }
1549
1550         return inode;
1551
1552  out_iput:
1553         iput(inode);
1554         return NULL;
1555 }
1556
1557 int8_t udf_add_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1558         kernel_lb_addr eloc, uint32_t elen, struct buffer_head **bh, int inc)
1559 {
1560         int adsize;
1561         short_ad *sad = NULL;
1562         long_ad *lad = NULL;
1563         struct allocExtDesc *aed;
1564         int8_t etype;
1565         uint8_t *ptr;
1566
1567         if (!*bh)
1568                 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1569         else
1570                 ptr = (*bh)->b_data + *extoffset;
1571
1572         if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
1573                 adsize = sizeof(short_ad);
1574         else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
1575                 adsize = sizeof(long_ad);
1576         else
1577                 return -1;
1578
1579         if (*extoffset + (2 * adsize) > inode->i_sb->s_blocksize)
1580         {
1581                 char *sptr, *dptr;
1582                 struct buffer_head *nbh;
1583                 int err, loffset;
1584                 kernel_lb_addr obloc = *bloc;
1585
1586                 if (!(bloc->logicalBlockNum = udf_new_block(inode->i_sb, NULL,
1587                         obloc.partitionReferenceNum, obloc.logicalBlockNum, &err)))
1588                 {
1589                         return -1;
1590                 }
1591                 if (!(nbh = udf_tgetblk(inode->i_sb, udf_get_lb_pblock(inode->i_sb,
1592                         *bloc, 0))))
1593                 {
1594                         return -1;
1595                 }
1596                 lock_buffer(nbh);
1597                 memset(nbh->b_data, 0x00, inode->i_sb->s_blocksize);
1598                 set_buffer_uptodate(nbh);
1599                 unlock_buffer(nbh);
1600                 mark_buffer_dirty_inode(nbh, inode);
1601
1602                 aed = (struct allocExtDesc *)(nbh->b_data);
1603                 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
1604                         aed->previousAllocExtLocation = cpu_to_le32(obloc.logicalBlockNum);
1605                 if (*extoffset + adsize > inode->i_sb->s_blocksize)
1606                 {
1607                         loffset = *extoffset;
1608                         aed->lengthAllocDescs = cpu_to_le32(adsize);
1609                         sptr = ptr - adsize;
1610                         dptr = nbh->b_data + sizeof(struct allocExtDesc);
1611                         memcpy(dptr, sptr, adsize);
1612                         *extoffset = sizeof(struct allocExtDesc) + adsize;
1613                 }
1614                 else
1615                 {
1616                         loffset = *extoffset + adsize;
1617                         aed->lengthAllocDescs = cpu_to_le32(0);
1618                         sptr = ptr;
1619                         *extoffset = sizeof(struct allocExtDesc);
1620
1621                         if (*bh)
1622                         {
1623                                 aed = (struct allocExtDesc *)(*bh)->b_data;
1624                                 aed->lengthAllocDescs =
1625                                         cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1626                         }
1627                         else
1628                         {
1629                                 UDF_I_LENALLOC(inode) += adsize;
1630                                 mark_inode_dirty(inode);
1631                         }
1632                 }
1633                 if (UDF_SB_UDFREV(inode->i_sb) >= 0x0200)
1634                         udf_new_tag(nbh->b_data, TAG_IDENT_AED, 3, 1,
1635                                 bloc->logicalBlockNum, sizeof(tag));
1636                 else
1637                         udf_new_tag(nbh->b_data, TAG_IDENT_AED, 2, 1,
1638                                 bloc->logicalBlockNum, sizeof(tag));
1639                 switch (UDF_I_ALLOCTYPE(inode))
1640                 {
1641                         case ICBTAG_FLAG_AD_SHORT:
1642                         {
1643                                 sad = (short_ad *)sptr;
1644                                 sad->extLength = cpu_to_le32(
1645                                         EXT_NEXT_EXTENT_ALLOCDECS |
1646                                         inode->i_sb->s_blocksize);
1647                                 sad->extPosition = cpu_to_le32(bloc->logicalBlockNum);
1648                                 break;
1649                         }
1650                         case ICBTAG_FLAG_AD_LONG:
1651                         {
1652                                 lad = (long_ad *)sptr;
1653                                 lad->extLength = cpu_to_le32(
1654                                         EXT_NEXT_EXTENT_ALLOCDECS |
1655                                         inode->i_sb->s_blocksize);
1656                                 lad->extLocation = cpu_to_lelb(*bloc);
1657                                 memset(lad->impUse, 0x00, sizeof(lad->impUse));
1658                                 break;
1659                         }
1660                 }
1661                 if (*bh)
1662                 {
1663                         if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1664                                 udf_update_tag((*bh)->b_data, loffset);
1665                         else
1666                                 udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
1667                         mark_buffer_dirty_inode(*bh, inode);
1668                         udf_release_data(*bh);
1669                 }
1670                 else
1671                         mark_inode_dirty(inode);
1672                 *bh = nbh;
1673         }
1674
1675         etype = udf_write_aext(inode, *bloc, extoffset, eloc, elen, *bh, inc);
1676
1677         if (!*bh)
1678         {
1679                 UDF_I_LENALLOC(inode) += adsize;
1680                 mark_inode_dirty(inode);
1681         }
1682         else
1683         {
1684                 aed = (struct allocExtDesc *)(*bh)->b_data;
1685                 aed->lengthAllocDescs =
1686                         cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) + adsize);
1687                 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1688                         udf_update_tag((*bh)->b_data, *extoffset + (inc ? 0 : adsize));
1689                 else
1690                         udf_update_tag((*bh)->b_data, sizeof(struct allocExtDesc));
1691                 mark_buffer_dirty_inode(*bh, inode);
1692         }
1693
1694         return etype;
1695 }
1696
1697 int8_t udf_write_aext(struct inode *inode, kernel_lb_addr bloc, int *extoffset,
1698     kernel_lb_addr eloc, uint32_t elen, struct buffer_head *bh, int inc)
1699 {
1700         int adsize;
1701         uint8_t *ptr;
1702
1703         if (!bh)
1704                 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1705         else
1706         {
1707                 ptr = bh->b_data + *extoffset;
1708                 atomic_inc(&bh->b_count);
1709         }
1710
1711         switch (UDF_I_ALLOCTYPE(inode))
1712         {
1713                 case ICBTAG_FLAG_AD_SHORT:
1714                 {
1715                         short_ad *sad = (short_ad *)ptr;
1716                         sad->extLength = cpu_to_le32(elen);
1717                         sad->extPosition = cpu_to_le32(eloc.logicalBlockNum);
1718                         adsize = sizeof(short_ad);
1719                         break;
1720                 }
1721                 case ICBTAG_FLAG_AD_LONG:
1722                 {
1723                         long_ad *lad = (long_ad *)ptr;
1724                         lad->extLength = cpu_to_le32(elen);
1725                         lad->extLocation = cpu_to_lelb(eloc);
1726                         memset(lad->impUse, 0x00, sizeof(lad->impUse));
1727                         adsize = sizeof(long_ad);
1728                         break;
1729                 }
1730                 default:
1731                         return -1;
1732         }
1733
1734         if (bh)
1735         {
1736                 if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1737                 {
1738                         struct allocExtDesc *aed = (struct allocExtDesc *)(bh)->b_data;
1739                         udf_update_tag((bh)->b_data,
1740                                 le32_to_cpu(aed->lengthAllocDescs) + sizeof(struct allocExtDesc));
1741                 }
1742                 mark_buffer_dirty_inode(bh, inode);
1743                 udf_release_data(bh);
1744         }
1745         else
1746                 mark_inode_dirty(inode);
1747
1748         if (inc)
1749                 *extoffset += adsize;
1750         return (elen >> 30);
1751 }
1752
1753 int8_t udf_next_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1754         kernel_lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
1755 {
1756         int8_t etype;
1757
1758         while ((etype = udf_current_aext(inode, bloc, extoffset, eloc, elen, bh, inc)) ==
1759                 (EXT_NEXT_EXTENT_ALLOCDECS >> 30))
1760         {
1761                 *bloc = *eloc;
1762                 *extoffset = sizeof(struct allocExtDesc);
1763                 udf_release_data(*bh);
1764                 if (!(*bh = udf_tread(inode->i_sb, udf_get_lb_pblock(inode->i_sb, *bloc, 0))))
1765                 {
1766                         udf_debug("reading block %d failed!\n",
1767                                 udf_get_lb_pblock(inode->i_sb, *bloc, 0));
1768                         return -1;
1769                 }
1770         }
1771
1772         return etype;
1773 }
1774
1775 int8_t udf_current_aext(struct inode *inode, kernel_lb_addr *bloc, int *extoffset,
1776         kernel_lb_addr *eloc, uint32_t *elen, struct buffer_head **bh, int inc)
1777 {
1778         int alen;
1779         int8_t etype;
1780         uint8_t *ptr;
1781
1782         if (!*bh)
1783         {
1784                 if (!(*extoffset))
1785                         *extoffset = udf_file_entry_alloc_offset(inode);
1786                 ptr = UDF_I_DATA(inode) + *extoffset - udf_file_entry_alloc_offset(inode) + UDF_I_LENEATTR(inode);
1787                 alen = udf_file_entry_alloc_offset(inode) + UDF_I_LENALLOC(inode);
1788         }
1789         else
1790         {
1791                 if (!(*extoffset))
1792                         *extoffset = sizeof(struct allocExtDesc);
1793                 ptr = (*bh)->b_data + *extoffset;
1794                 alen = sizeof(struct allocExtDesc) + le32_to_cpu(((struct allocExtDesc *)(*bh)->b_data)->lengthAllocDescs);
1795         }
1796
1797         switch (UDF_I_ALLOCTYPE(inode))
1798         {
1799                 case ICBTAG_FLAG_AD_SHORT:
1800                 {
1801                         short_ad *sad;
1802
1803                         if (!(sad = udf_get_fileshortad(ptr, alen, extoffset, inc)))
1804                                 return -1;
1805
1806                         etype = le32_to_cpu(sad->extLength) >> 30;
1807                         eloc->logicalBlockNum = le32_to_cpu(sad->extPosition);
1808                         eloc->partitionReferenceNum = UDF_I_LOCATION(inode).partitionReferenceNum;
1809                         *elen = le32_to_cpu(sad->extLength) & UDF_EXTENT_LENGTH_MASK;
1810                         break;
1811                 }
1812                 case ICBTAG_FLAG_AD_LONG:
1813                 {
1814                         long_ad *lad;
1815
1816                         if (!(lad = udf_get_filelongad(ptr, alen, extoffset, inc)))
1817                                 return -1;
1818
1819                         etype = le32_to_cpu(lad->extLength) >> 30;
1820                         *eloc = lelb_to_cpu(lad->extLocation);
1821                         *elen = le32_to_cpu(lad->extLength) & UDF_EXTENT_LENGTH_MASK;
1822                         break;
1823                 }
1824                 default:
1825                 {
1826                         udf_debug("alloc_type = %d unsupported\n", UDF_I_ALLOCTYPE(inode));
1827                         return -1;
1828                 }
1829         }
1830
1831         return etype;
1832 }
1833
1834 static int8_t
1835 udf_insert_aext(struct inode *inode, kernel_lb_addr bloc, int extoffset,
1836                 kernel_lb_addr neloc, uint32_t nelen, struct buffer_head *bh)
1837 {
1838         kernel_lb_addr oeloc;
1839         uint32_t oelen;
1840         int8_t etype;
1841
1842         if (bh)
1843                 atomic_inc(&bh->b_count);
1844
1845         while ((etype = udf_next_aext(inode, &bloc, &extoffset, &oeloc, &oelen, &bh, 0)) != -1)
1846         {
1847                 udf_write_aext(inode, bloc, &extoffset, neloc, nelen, bh, 1);
1848
1849                 neloc = oeloc;
1850                 nelen = (etype << 30) | oelen;
1851         }
1852         udf_add_aext(inode, &bloc, &extoffset, neloc, nelen, &bh, 1);
1853         udf_release_data(bh);
1854         return (nelen >> 30);
1855 }
1856
1857 int8_t udf_delete_aext(struct inode *inode, kernel_lb_addr nbloc, int nextoffset,
1858         kernel_lb_addr eloc, uint32_t elen, struct buffer_head *nbh)
1859 {
1860         struct buffer_head *obh;
1861         kernel_lb_addr obloc;
1862         int oextoffset, adsize;
1863         int8_t etype;
1864         struct allocExtDesc *aed;
1865
1866         if (nbh)
1867         {
1868                 atomic_inc(&nbh->b_count);
1869                 atomic_inc(&nbh->b_count);
1870         }
1871
1872         if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_SHORT)
1873                 adsize = sizeof(short_ad);
1874         else if (UDF_I_ALLOCTYPE(inode) == ICBTAG_FLAG_AD_LONG)
1875                 adsize = sizeof(long_ad);
1876         else
1877                 adsize = 0;
1878
1879         obh = nbh;
1880         obloc = nbloc;
1881         oextoffset = nextoffset;
1882
1883         if (udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1) == -1)
1884                 return -1;
1885
1886         while ((etype = udf_next_aext(inode, &nbloc, &nextoffset, &eloc, &elen, &nbh, 1)) != -1)
1887         {
1888                 udf_write_aext(inode, obloc, &oextoffset, eloc, (etype << 30) | elen, obh, 1);
1889                 if (obh != nbh)
1890                 {
1891                         obloc = nbloc;
1892                         udf_release_data(obh);
1893                         atomic_inc(&nbh->b_count);
1894                         obh = nbh;
1895                         oextoffset = nextoffset - adsize;
1896                 }
1897         }
1898         memset(&eloc, 0x00, sizeof(kernel_lb_addr));
1899         elen = 0;
1900
1901         if (nbh != obh)
1902         {
1903                 udf_free_blocks(inode->i_sb, inode, nbloc, 0, 1);
1904                 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1905                 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1906                 if (!obh)
1907                 {
1908                         UDF_I_LENALLOC(inode) -= (adsize * 2);
1909                         mark_inode_dirty(inode);
1910                 }
1911                 else
1912                 {
1913                         aed = (struct allocExtDesc *)(obh)->b_data;
1914                         aed->lengthAllocDescs =
1915                                 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - (2*adsize));
1916                         if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1917                                 udf_update_tag((obh)->b_data, oextoffset - (2*adsize));
1918                         else
1919                                 udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
1920                         mark_buffer_dirty_inode(obh, inode);
1921                 }
1922         }
1923         else
1924         {
1925                 udf_write_aext(inode, obloc, &oextoffset, eloc, elen, obh, 1);
1926                 if (!obh)
1927                 {
1928                         UDF_I_LENALLOC(inode) -= adsize;
1929                         mark_inode_dirty(inode);
1930                 }
1931                 else
1932                 {
1933                         aed = (struct allocExtDesc *)(obh)->b_data;
1934                         aed->lengthAllocDescs =
1935                                 cpu_to_le32(le32_to_cpu(aed->lengthAllocDescs) - adsize);
1936                         if (!UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT) || UDF_SB_UDFREV(inode->i_sb) >= 0x0201)
1937                                 udf_update_tag((obh)->b_data, oextoffset - adsize);
1938                         else
1939                                 udf_update_tag((obh)->b_data, sizeof(struct allocExtDesc));
1940                         mark_buffer_dirty_inode(obh, inode);
1941                 }
1942         }
1943         
1944         udf_release_data(nbh);
1945         udf_release_data(obh);
1946         return (elen >> 30);
1947 }
1948
1949 int8_t inode_bmap(struct inode *inode, int block, kernel_lb_addr *bloc, uint32_t *extoffset,
1950         kernel_lb_addr *eloc, uint32_t *elen, uint32_t *offset, struct buffer_head **bh)
1951 {
1952         uint64_t lbcount = 0, bcount = (uint64_t)block << inode->i_sb->s_blocksize_bits;
1953         int8_t etype;
1954
1955         if (block < 0)
1956         {
1957                 printk(KERN_ERR "udf: inode_bmap: block < 0\n");
1958                 return -1;
1959         }
1960
1961         *extoffset = 0;
1962         *elen = 0;
1963         *bloc = UDF_I_LOCATION(inode);
1964
1965         do
1966         {
1967                 if ((etype = udf_next_aext(inode, bloc, extoffset, eloc, elen, bh, 1)) == -1)
1968                 {
1969                         *offset = bcount - lbcount;
1970                         UDF_I_LENEXTENTS(inode) = lbcount;
1971                         return -1;
1972                 }
1973                 lbcount += *elen;
1974         } while (lbcount <= bcount);
1975
1976         *offset = bcount + *elen - lbcount;
1977
1978         return etype;
1979 }
1980
1981 long udf_block_map(struct inode *inode, long block)
1982 {
1983         kernel_lb_addr eloc, bloc;
1984         uint32_t offset, extoffset, elen;
1985         struct buffer_head *bh = NULL;
1986         int ret;
1987
1988         lock_kernel();
1989
1990         if (inode_bmap(inode, block, &bloc, &extoffset, &eloc, &elen, &offset, &bh) == (EXT_RECORDED_ALLOCATED >> 30))
1991                 ret = udf_get_lb_pblock(inode->i_sb, eloc, offset >> inode->i_sb->s_blocksize_bits);
1992         else
1993                 ret = 0;
1994
1995         unlock_kernel();
1996         udf_release_data(bh);
1997
1998         if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_VARCONV))
1999                 return udf_fixed_to_variable(ret);
2000         else
2001                 return ret;
2002 }