Pull model-name into release branch
[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 const 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         BUG_ON(bh);
316         if (err)
317                 goto abort;
318         BUG_ON(!phys);
319
320         if (new)
321                 set_buffer_new(bh_result);
322         map_bh(bh_result, inode->i_sb, phys);
323 abort:
324         unlock_kernel();
325         return err;
326
327 abort_negative:
328         udf_warning(inode->i_sb, "udf_get_block", "block < 0");
329         goto abort;
330 }
331
332 static struct buffer_head *
333 udf_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
357 static 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
557 static 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
619 static 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
711 static 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
796 static 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
832 struct 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
852 void 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
900 static 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
996 static 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);
1046         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;
1049
1050         inode->i_gid = le32_to_cpu(fe->gid);
1051         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;
1054
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
1241 static mode_t
1242 udf_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
1276 int 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
1285 int udf_sync_inode(struct inode * inode)
1286 {
1287         return udf_update_inode(inode, 1);
1288 }
1289
1290 static int
1291 udf_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
1340         if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_UID_FORGET))
1341                 fe->uid = cpu_to_le32(-1);
1342         else fe->uid = cpu_to_le32(inode->i_uid);
1343
1344         if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_GID_FORGET))
1345                 fe->gid = cpu_to_le32(-1);
1346         else fe->gid = cpu_to_le32(inode->i_gid);
1347
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
1529 struct inode *
1530 udf_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
1561 int8_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
1701 int8_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
1757 int8_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
1779 int8_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
1838 static int8_t
1839 udf_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
1861 int8_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
1953 int8_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         }
1964
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
1985 long 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 }