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