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