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