linux/fs/udf/namei.c
<<
>>
Prefs
   1/*
   2 * namei.c
   3 *
   4 * PURPOSE
   5 *      Inode name 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-2004 Ben Fennema
  14 *  (C) 1999-2000 Stelias Computing Inc
  15 *
  16 * HISTORY
  17 *
  18 *  12/12/98 blf  Created. Split out the lookup code from dir.c
  19 *  04/19/99 blf  link, mknod, symlink support
  20 */
  21
  22#include "udfdecl.h"
  23
  24#include "udf_i.h"
  25#include "udf_sb.h"
  26#include <linux/string.h>
  27#include <linux/errno.h>
  28#include <linux/mm.h>
  29#include <linux/slab.h>
  30#include <linux/sched.h>
  31#include <linux/crc-itu-t.h>
  32#include <linux/exportfs.h>
  33
  34static inline int udf_match(int len1, const unsigned char *name1, int len2,
  35                            const unsigned char *name2)
  36{
  37        if (len1 != len2)
  38                return 0;
  39
  40        return !memcmp(name1, name2, len1);
  41}
  42
  43int udf_write_fi(struct inode *inode, struct fileIdentDesc *cfi,
  44                 struct fileIdentDesc *sfi, struct udf_fileident_bh *fibh,
  45                 uint8_t *impuse, uint8_t *fileident)
  46{
  47        uint16_t crclen = fibh->eoffset - fibh->soffset - sizeof(struct tag);
  48        uint16_t crc;
  49        int offset;
  50        uint16_t liu = le16_to_cpu(cfi->lengthOfImpUse);
  51        uint8_t lfi = cfi->lengthFileIdent;
  52        int padlen = fibh->eoffset - fibh->soffset - liu - lfi -
  53                sizeof(struct fileIdentDesc);
  54        int adinicb = 0;
  55
  56        if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
  57                adinicb = 1;
  58
  59        offset = fibh->soffset + sizeof(struct fileIdentDesc);
  60
  61        if (impuse) {
  62                if (adinicb || (offset + liu < 0)) {
  63                        memcpy((uint8_t *)sfi->impUse, impuse, liu);
  64                } else if (offset >= 0) {
  65                        memcpy(fibh->ebh->b_data + offset, impuse, liu);
  66                } else {
  67                        memcpy((uint8_t *)sfi->impUse, impuse, -offset);
  68                        memcpy(fibh->ebh->b_data, impuse - offset,
  69                                liu + offset);
  70                }
  71        }
  72
  73        offset += liu;
  74
  75        if (fileident) {
  76                if (adinicb || (offset + lfi < 0)) {
  77                        memcpy((uint8_t *)sfi->fileIdent + liu, fileident, lfi);
  78                } else if (offset >= 0) {
  79                        memcpy(fibh->ebh->b_data + offset, fileident, lfi);
  80                } else {
  81                        memcpy((uint8_t *)sfi->fileIdent + liu, fileident,
  82                                -offset);
  83                        memcpy(fibh->ebh->b_data, fileident - offset,
  84                                lfi + offset);
  85                }
  86        }
  87
  88        offset += lfi;
  89
  90        if (adinicb || (offset + padlen < 0)) {
  91                memset((uint8_t *)sfi->padding + liu + lfi, 0x00, padlen);
  92        } else if (offset >= 0) {
  93                memset(fibh->ebh->b_data + offset, 0x00, padlen);
  94        } else {
  95                memset((uint8_t *)sfi->padding + liu + lfi, 0x00, -offset);
  96                memset(fibh->ebh->b_data, 0x00, padlen + offset);
  97        }
  98
  99        crc = crc_itu_t(0, (uint8_t *)cfi + sizeof(struct tag),
 100                      sizeof(struct fileIdentDesc) - sizeof(struct tag));
 101
 102        if (fibh->sbh == fibh->ebh) {
 103                crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
 104                              crclen + sizeof(struct tag) -
 105                              sizeof(struct fileIdentDesc));
 106        } else if (sizeof(struct fileIdentDesc) >= -fibh->soffset) {
 107                crc = crc_itu_t(crc, fibh->ebh->b_data +
 108                                        sizeof(struct fileIdentDesc) +
 109                                        fibh->soffset,
 110                              crclen + sizeof(struct tag) -
 111                                        sizeof(struct fileIdentDesc));
 112        } else {
 113                crc = crc_itu_t(crc, (uint8_t *)sfi->impUse,
 114                              -fibh->soffset - sizeof(struct fileIdentDesc));
 115                crc = crc_itu_t(crc, fibh->ebh->b_data, fibh->eoffset);
 116        }
 117
 118        cfi->descTag.descCRC = cpu_to_le16(crc);
 119        cfi->descTag.descCRCLength = cpu_to_le16(crclen);
 120        cfi->descTag.tagChecksum = udf_tag_checksum(&cfi->descTag);
 121
 122        if (adinicb || (sizeof(struct fileIdentDesc) <= -fibh->soffset)) {
 123                memcpy((uint8_t *)sfi, (uint8_t *)cfi,
 124                        sizeof(struct fileIdentDesc));
 125        } else {
 126                memcpy((uint8_t *)sfi, (uint8_t *)cfi, -fibh->soffset);
 127                memcpy(fibh->ebh->b_data, (uint8_t *)cfi - fibh->soffset,
 128                       sizeof(struct fileIdentDesc) + fibh->soffset);
 129        }
 130
 131        if (adinicb) {
 132                mark_inode_dirty(inode);
 133        } else {
 134                if (fibh->sbh != fibh->ebh)
 135                        mark_buffer_dirty_inode(fibh->ebh, inode);
 136                mark_buffer_dirty_inode(fibh->sbh, inode);
 137        }
 138        return 0;
 139}
 140
 141/**
 142 * udf_find_entry - find entry in given directory.
 143 *
 144 * @dir:        directory inode to search in
 145 * @child:      qstr of the name
 146 * @fibh:       buffer head / inode with file identifier descriptor we found
 147 * @cfi:        found file identifier descriptor with given name
 148 *
 149 * This function searches in the directory @dir for a file name @child. When
 150 * found, @fibh points to the buffer head(s) (bh is NULL for in ICB
 151 * directories) containing the file identifier descriptor (FID). In that case
 152 * the function returns pointer to the FID in the buffer or inode - but note
 153 * that FID may be split among two buffers (blocks) so accessing it via that
 154 * pointer isn't easily possible. This pointer can be used only as an iterator
 155 * for other directory manipulation functions. For inspection of the FID @cfi
 156 * can be used - the found FID is copied there.
 157 *
 158 * Returns pointer to FID, NULL when nothing found, or error code.
 159 */
 160static struct fileIdentDesc *udf_find_entry(struct inode *dir,
 161                                            const struct qstr *child,
 162                                            struct udf_fileident_bh *fibh,
 163                                            struct fileIdentDesc *cfi)
 164{
 165        struct fileIdentDesc *fi = NULL;
 166        loff_t f_pos;
 167        udf_pblk_t block;
 168        int flen;
 169        unsigned char *fname = NULL, *copy_name = NULL;
 170        unsigned char *nameptr;
 171        uint8_t lfi;
 172        uint16_t liu;
 173        loff_t size;
 174        struct kernel_lb_addr eloc;
 175        uint32_t elen;
 176        sector_t offset;
 177        struct extent_position epos = {};
 178        struct udf_inode_info *dinfo = UDF_I(dir);
 179        int isdotdot = child->len == 2 &&
 180                child->name[0] == '.' && child->name[1] == '.';
 181        struct super_block *sb = dir->i_sb;
 182
 183        size = udf_ext0_offset(dir) + dir->i_size;
 184        f_pos = udf_ext0_offset(dir);
 185
 186        fibh->sbh = fibh->ebh = NULL;
 187        fibh->soffset = fibh->eoffset = f_pos & (sb->s_blocksize - 1);
 188        if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 189                if (inode_bmap(dir, f_pos >> sb->s_blocksize_bits, &epos,
 190                    &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) {
 191                        fi = ERR_PTR(-EIO);
 192                        goto out_err;
 193                }
 194
 195                block = udf_get_lb_pblock(sb, &eloc, offset);
 196                if ((++offset << sb->s_blocksize_bits) < elen) {
 197                        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 198                                epos.offset -= sizeof(struct short_ad);
 199                        else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 200                                epos.offset -= sizeof(struct long_ad);
 201                } else
 202                        offset = 0;
 203
 204                fibh->sbh = fibh->ebh = udf_tread(sb, block);
 205                if (!fibh->sbh) {
 206                        fi = ERR_PTR(-EIO);
 207                        goto out_err;
 208                }
 209        }
 210
 211        fname = kmalloc(UDF_NAME_LEN, GFP_NOFS);
 212        if (!fname) {
 213                fi = ERR_PTR(-ENOMEM);
 214                goto out_err;
 215        }
 216
 217        while (f_pos < size) {
 218                fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
 219                                        &elen, &offset);
 220                if (!fi) {
 221                        fi = ERR_PTR(-EIO);
 222                        goto out_err;
 223                }
 224
 225                liu = le16_to_cpu(cfi->lengthOfImpUse);
 226                lfi = cfi->lengthFileIdent;
 227
 228                if (fibh->sbh == fibh->ebh) {
 229                        nameptr = fi->fileIdent + liu;
 230                } else {
 231                        int poffset;    /* Unpaded ending offset */
 232
 233                        poffset = fibh->soffset + sizeof(struct fileIdentDesc) +
 234                                        liu + lfi;
 235
 236                        if (poffset >= lfi)
 237                                nameptr = (uint8_t *)(fibh->ebh->b_data +
 238                                                      poffset - lfi);
 239                        else {
 240                                if (!copy_name) {
 241                                        copy_name = kmalloc(UDF_NAME_LEN,
 242                                                            GFP_NOFS);
 243                                        if (!copy_name) {
 244                                                fi = ERR_PTR(-ENOMEM);
 245                                                goto out_err;
 246                                        }
 247                                }
 248                                nameptr = copy_name;
 249                                memcpy(nameptr, fi->fileIdent + liu,
 250                                        lfi - poffset);
 251                                memcpy(nameptr + lfi - poffset,
 252                                        fibh->ebh->b_data, poffset);
 253                        }
 254                }
 255
 256                if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
 257                        if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
 258                                continue;
 259                }
 260
 261                if ((cfi->fileCharacteristics & FID_FILE_CHAR_HIDDEN) != 0) {
 262                        if (!UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
 263                                continue;
 264                }
 265
 266                if ((cfi->fileCharacteristics & FID_FILE_CHAR_PARENT) &&
 267                    isdotdot)
 268                        goto out_ok;
 269
 270                if (!lfi)
 271                        continue;
 272
 273                flen = udf_get_filename(sb, nameptr, lfi, fname, UDF_NAME_LEN);
 274                if (flen < 0) {
 275                        fi = ERR_PTR(flen);
 276                        goto out_err;
 277                }
 278
 279                if (udf_match(flen, fname, child->len, child->name))
 280                        goto out_ok;
 281        }
 282
 283        fi = NULL;
 284out_err:
 285        if (fibh->sbh != fibh->ebh)
 286                brelse(fibh->ebh);
 287        brelse(fibh->sbh);
 288out_ok:
 289        brelse(epos.bh);
 290        kfree(fname);
 291        kfree(copy_name);
 292
 293        return fi;
 294}
 295
 296static struct dentry *udf_lookup(struct inode *dir, struct dentry *dentry,
 297                                 unsigned int flags)
 298{
 299        struct inode *inode = NULL;
 300        struct fileIdentDesc cfi;
 301        struct udf_fileident_bh fibh;
 302        struct fileIdentDesc *fi;
 303
 304        if (dentry->d_name.len > UDF_NAME_LEN)
 305                return ERR_PTR(-ENAMETOOLONG);
 306
 307        fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 308        if (IS_ERR(fi))
 309                return ERR_CAST(fi);
 310
 311        if (fi) {
 312                struct kernel_lb_addr loc;
 313
 314                if (fibh.sbh != fibh.ebh)
 315                        brelse(fibh.ebh);
 316                brelse(fibh.sbh);
 317
 318                loc = lelb_to_cpu(cfi.icb.extLocation);
 319                inode = udf_iget(dir->i_sb, &loc);
 320                if (IS_ERR(inode))
 321                        return ERR_CAST(inode);
 322        }
 323
 324        return d_splice_alias(inode, dentry);
 325}
 326
 327static struct fileIdentDesc *udf_add_entry(struct inode *dir,
 328                                           struct dentry *dentry,
 329                                           struct udf_fileident_bh *fibh,
 330                                           struct fileIdentDesc *cfi, int *err)
 331{
 332        struct super_block *sb = dir->i_sb;
 333        struct fileIdentDesc *fi = NULL;
 334        unsigned char *name = NULL;
 335        int namelen;
 336        loff_t f_pos;
 337        loff_t size = udf_ext0_offset(dir) + dir->i_size;
 338        int nfidlen;
 339        udf_pblk_t block;
 340        struct kernel_lb_addr eloc;
 341        uint32_t elen = 0;
 342        sector_t offset;
 343        struct extent_position epos = {};
 344        struct udf_inode_info *dinfo;
 345
 346        fibh->sbh = fibh->ebh = NULL;
 347        name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
 348        if (!name) {
 349                *err = -ENOMEM;
 350                goto out_err;
 351        }
 352
 353        if (dentry) {
 354                if (!dentry->d_name.len) {
 355                        *err = -EINVAL;
 356                        goto out_err;
 357                }
 358                namelen = udf_put_filename(sb, dentry->d_name.name,
 359                                           dentry->d_name.len,
 360                                           name, UDF_NAME_LEN_CS0);
 361                if (!namelen) {
 362                        *err = -ENAMETOOLONG;
 363                        goto out_err;
 364                }
 365        } else {
 366                namelen = 0;
 367        }
 368
 369        nfidlen = ALIGN(sizeof(struct fileIdentDesc) + namelen, UDF_NAME_PAD);
 370
 371        f_pos = udf_ext0_offset(dir);
 372
 373        fibh->soffset = fibh->eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
 374        dinfo = UDF_I(dir);
 375        if (dinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 376                if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits, &epos,
 377                    &eloc, &elen, &offset) != (EXT_RECORDED_ALLOCATED >> 30)) {
 378                        block = udf_get_lb_pblock(dir->i_sb,
 379                                        &dinfo->i_location, 0);
 380                        fibh->soffset = fibh->eoffset = sb->s_blocksize;
 381                        goto add;
 382                }
 383                block = udf_get_lb_pblock(dir->i_sb, &eloc, offset);
 384                if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
 385                        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 386                                epos.offset -= sizeof(struct short_ad);
 387                        else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 388                                epos.offset -= sizeof(struct long_ad);
 389                } else
 390                        offset = 0;
 391
 392                fibh->sbh = fibh->ebh = udf_tread(dir->i_sb, block);
 393                if (!fibh->sbh) {
 394                        *err = -EIO;
 395                        goto out_err;
 396                }
 397
 398                block = dinfo->i_location.logicalBlockNum;
 399        }
 400
 401        while (f_pos < size) {
 402                fi = udf_fileident_read(dir, &f_pos, fibh, cfi, &epos, &eloc,
 403                                        &elen, &offset);
 404
 405                if (!fi) {
 406                        *err = -EIO;
 407                        goto out_err;
 408                }
 409
 410                if ((cfi->fileCharacteristics & FID_FILE_CHAR_DELETED) != 0) {
 411                        if (udf_dir_entry_len(cfi) == nfidlen) {
 412                                cfi->descTag.tagSerialNum = cpu_to_le16(1);
 413                                cfi->fileVersionNum = cpu_to_le16(1);
 414                                cfi->fileCharacteristics = 0;
 415                                cfi->lengthFileIdent = namelen;
 416                                cfi->lengthOfImpUse = cpu_to_le16(0);
 417                                if (!udf_write_fi(dir, cfi, fi, fibh, NULL,
 418                                                  name))
 419                                        goto out_ok;
 420                                else {
 421                                        *err = -EIO;
 422                                        goto out_err;
 423                                }
 424                        }
 425                }
 426        }
 427
 428add:
 429        f_pos += nfidlen;
 430
 431        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB &&
 432            sb->s_blocksize - fibh->eoffset < nfidlen) {
 433                brelse(epos.bh);
 434                epos.bh = NULL;
 435                fibh->soffset -= udf_ext0_offset(dir);
 436                fibh->eoffset -= udf_ext0_offset(dir);
 437                f_pos -= udf_ext0_offset(dir);
 438                if (fibh->sbh != fibh->ebh)
 439                        brelse(fibh->ebh);
 440                brelse(fibh->sbh);
 441                fibh->sbh = fibh->ebh =
 442                                udf_expand_dir_adinicb(dir, &block, err);
 443                if (!fibh->sbh)
 444                        goto out_err;
 445                epos.block = dinfo->i_location;
 446                epos.offset = udf_file_entry_alloc_offset(dir);
 447                /* Load extent udf_expand_dir_adinicb() has created */
 448                udf_current_aext(dir, &epos, &eloc, &elen, 1);
 449        }
 450
 451        /* Entry fits into current block? */
 452        if (sb->s_blocksize - fibh->eoffset >= nfidlen) {
 453                fibh->soffset = fibh->eoffset;
 454                fibh->eoffset += nfidlen;
 455                if (fibh->sbh != fibh->ebh) {
 456                        brelse(fibh->sbh);
 457                        fibh->sbh = fibh->ebh;
 458                }
 459
 460                if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
 461                        block = dinfo->i_location.logicalBlockNum;
 462                        fi = (struct fileIdentDesc *)
 463                                        (dinfo->i_ext.i_data +
 464                                         fibh->soffset -
 465                                         udf_ext0_offset(dir) +
 466                                         dinfo->i_lenEAttr);
 467                } else {
 468                        block = eloc.logicalBlockNum +
 469                                        ((elen - 1) >>
 470                                                dir->i_sb->s_blocksize_bits);
 471                        fi = (struct fileIdentDesc *)
 472                                (fibh->sbh->b_data + fibh->soffset);
 473                }
 474        } else {
 475                /* Round up last extent in the file */
 476                elen = (elen + sb->s_blocksize - 1) & ~(sb->s_blocksize - 1);
 477                if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 478                        epos.offset -= sizeof(struct short_ad);
 479                else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 480                        epos.offset -= sizeof(struct long_ad);
 481                udf_write_aext(dir, &epos, &eloc, elen, 1);
 482                dinfo->i_lenExtents = (dinfo->i_lenExtents + sb->s_blocksize
 483                                        - 1) & ~(sb->s_blocksize - 1);
 484
 485                fibh->soffset = fibh->eoffset - sb->s_blocksize;
 486                fibh->eoffset += nfidlen - sb->s_blocksize;
 487                if (fibh->sbh != fibh->ebh) {
 488                        brelse(fibh->sbh);
 489                        fibh->sbh = fibh->ebh;
 490                }
 491
 492                block = eloc.logicalBlockNum + ((elen - 1) >>
 493                                                dir->i_sb->s_blocksize_bits);
 494                fibh->ebh = udf_bread(dir,
 495                                f_pos >> dir->i_sb->s_blocksize_bits, 1, err);
 496                if (!fibh->ebh)
 497                        goto out_err;
 498                /* Extents could have been merged, invalidate our position */
 499                brelse(epos.bh);
 500                epos.bh = NULL;
 501                epos.block = dinfo->i_location;
 502                epos.offset = udf_file_entry_alloc_offset(dir);
 503
 504                if (!fibh->soffset) {
 505                        /* Find the freshly allocated block */
 506                        while (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
 507                                (EXT_RECORDED_ALLOCATED >> 30))
 508                                ;
 509                        block = eloc.logicalBlockNum + ((elen - 1) >>
 510                                        dir->i_sb->s_blocksize_bits);
 511                        brelse(fibh->sbh);
 512                        fibh->sbh = fibh->ebh;
 513                        fi = (struct fileIdentDesc *)(fibh->sbh->b_data);
 514                } else {
 515                        fi = (struct fileIdentDesc *)
 516                                (fibh->sbh->b_data + sb->s_blocksize +
 517                                        fibh->soffset);
 518                }
 519        }
 520
 521        memset(cfi, 0, sizeof(struct fileIdentDesc));
 522        if (UDF_SB(sb)->s_udfrev >= 0x0200)
 523                udf_new_tag((char *)cfi, TAG_IDENT_FID, 3, 1, block,
 524                            sizeof(struct tag));
 525        else
 526                udf_new_tag((char *)cfi, TAG_IDENT_FID, 2, 1, block,
 527                            sizeof(struct tag));
 528        cfi->fileVersionNum = cpu_to_le16(1);
 529        cfi->lengthFileIdent = namelen;
 530        cfi->lengthOfImpUse = cpu_to_le16(0);
 531        if (!udf_write_fi(dir, cfi, fi, fibh, NULL, name)) {
 532                dir->i_size += nfidlen;
 533                if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 534                        dinfo->i_lenAlloc += nfidlen;
 535                else {
 536                        /* Find the last extent and truncate it to proper size */
 537                        while (udf_next_aext(dir, &epos, &eloc, &elen, 1) ==
 538                                (EXT_RECORDED_ALLOCATED >> 30))
 539                                ;
 540                        elen -= dinfo->i_lenExtents - dir->i_size;
 541                        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 542                                epos.offset -= sizeof(struct short_ad);
 543                        else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 544                                epos.offset -= sizeof(struct long_ad);
 545                        udf_write_aext(dir, &epos, &eloc, elen, 1);
 546                        dinfo->i_lenExtents = dir->i_size;
 547                }
 548
 549                mark_inode_dirty(dir);
 550                goto out_ok;
 551        } else {
 552                *err = -EIO;
 553                goto out_err;
 554        }
 555
 556out_err:
 557        fi = NULL;
 558        if (fibh->sbh != fibh->ebh)
 559                brelse(fibh->ebh);
 560        brelse(fibh->sbh);
 561out_ok:
 562        brelse(epos.bh);
 563        kfree(name);
 564        return fi;
 565}
 566
 567static int udf_delete_entry(struct inode *inode, struct fileIdentDesc *fi,
 568                            struct udf_fileident_bh *fibh,
 569                            struct fileIdentDesc *cfi)
 570{
 571        cfi->fileCharacteristics |= FID_FILE_CHAR_DELETED;
 572
 573        if (UDF_QUERY_FLAG(inode->i_sb, UDF_FLAG_STRICT))
 574                memset(&(cfi->icb), 0x00, sizeof(struct long_ad));
 575
 576        return udf_write_fi(inode, cfi, fi, fibh, NULL, NULL);
 577}
 578
 579static int udf_add_nondir(struct dentry *dentry, struct inode *inode)
 580{
 581        struct udf_inode_info *iinfo = UDF_I(inode);
 582        struct inode *dir = d_inode(dentry->d_parent);
 583        struct udf_fileident_bh fibh;
 584        struct fileIdentDesc cfi, *fi;
 585        int err;
 586
 587        fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
 588        if (unlikely(!fi)) {
 589                inode_dec_link_count(inode);
 590                discard_new_inode(inode);
 591                return err;
 592        }
 593        cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 594        cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
 595        *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 596                cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
 597        udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
 598        dir->i_ctime = dir->i_mtime = current_time(dir);
 599        mark_inode_dirty(dir);
 600        if (fibh.sbh != fibh.ebh)
 601                brelse(fibh.ebh);
 602        brelse(fibh.sbh);
 603        d_instantiate_new(dentry, inode);
 604
 605        return 0;
 606}
 607
 608static int udf_create(struct inode *dir, struct dentry *dentry, umode_t mode,
 609                      bool excl)
 610{
 611        struct inode *inode = udf_new_inode(dir, mode);
 612
 613        if (IS_ERR(inode))
 614                return PTR_ERR(inode);
 615
 616        if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 617                inode->i_data.a_ops = &udf_adinicb_aops;
 618        else
 619                inode->i_data.a_ops = &udf_aops;
 620        inode->i_op = &udf_file_inode_operations;
 621        inode->i_fop = &udf_file_operations;
 622        mark_inode_dirty(inode);
 623
 624        return udf_add_nondir(dentry, inode);
 625}
 626
 627static int udf_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
 628{
 629        struct inode *inode = udf_new_inode(dir, mode);
 630
 631        if (IS_ERR(inode))
 632                return PTR_ERR(inode);
 633
 634        if (UDF_I(inode)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 635                inode->i_data.a_ops = &udf_adinicb_aops;
 636        else
 637                inode->i_data.a_ops = &udf_aops;
 638        inode->i_op = &udf_file_inode_operations;
 639        inode->i_fop = &udf_file_operations;
 640        mark_inode_dirty(inode);
 641        d_tmpfile(dentry, inode);
 642        unlock_new_inode(inode);
 643        return 0;
 644}
 645
 646static int udf_mknod(struct inode *dir, struct dentry *dentry, umode_t mode,
 647                     dev_t rdev)
 648{
 649        struct inode *inode;
 650
 651        if (!old_valid_dev(rdev))
 652                return -EINVAL;
 653
 654        inode = udf_new_inode(dir, mode);
 655        if (IS_ERR(inode))
 656                return PTR_ERR(inode);
 657
 658        init_special_inode(inode, mode, rdev);
 659        return udf_add_nondir(dentry, inode);
 660}
 661
 662static int udf_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
 663{
 664        struct inode *inode;
 665        struct udf_fileident_bh fibh;
 666        struct fileIdentDesc cfi, *fi;
 667        int err;
 668        struct udf_inode_info *dinfo = UDF_I(dir);
 669        struct udf_inode_info *iinfo;
 670
 671        inode = udf_new_inode(dir, S_IFDIR | mode);
 672        if (IS_ERR(inode))
 673                return PTR_ERR(inode);
 674
 675        iinfo = UDF_I(inode);
 676        inode->i_op = &udf_dir_inode_operations;
 677        inode->i_fop = &udf_dir_operations;
 678        fi = udf_add_entry(inode, NULL, &fibh, &cfi, &err);
 679        if (!fi) {
 680                inode_dec_link_count(inode);
 681                discard_new_inode(inode);
 682                goto out;
 683        }
 684        set_nlink(inode, 2);
 685        cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 686        cfi.icb.extLocation = cpu_to_lelb(dinfo->i_location);
 687        *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 688                cpu_to_le32(dinfo->i_unique & 0x00000000FFFFFFFFUL);
 689        cfi.fileCharacteristics =
 690                        FID_FILE_CHAR_DIRECTORY | FID_FILE_CHAR_PARENT;
 691        udf_write_fi(inode, &cfi, fi, &fibh, NULL, NULL);
 692        brelse(fibh.sbh);
 693        mark_inode_dirty(inode);
 694
 695        fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
 696        if (!fi) {
 697                clear_nlink(inode);
 698                mark_inode_dirty(inode);
 699                discard_new_inode(inode);
 700                goto out;
 701        }
 702        cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
 703        cfi.icb.extLocation = cpu_to_lelb(iinfo->i_location);
 704        *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
 705                cpu_to_le32(iinfo->i_unique & 0x00000000FFFFFFFFUL);
 706        cfi.fileCharacteristics |= FID_FILE_CHAR_DIRECTORY;
 707        udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
 708        inc_nlink(dir);
 709        dir->i_ctime = dir->i_mtime = current_time(dir);
 710        mark_inode_dirty(dir);
 711        d_instantiate_new(dentry, inode);
 712        if (fibh.sbh != fibh.ebh)
 713                brelse(fibh.ebh);
 714        brelse(fibh.sbh);
 715        err = 0;
 716
 717out:
 718        return err;
 719}
 720
 721static int empty_dir(struct inode *dir)
 722{
 723        struct fileIdentDesc *fi, cfi;
 724        struct udf_fileident_bh fibh;
 725        loff_t f_pos;
 726        loff_t size = udf_ext0_offset(dir) + dir->i_size;
 727        udf_pblk_t block;
 728        struct kernel_lb_addr eloc;
 729        uint32_t elen;
 730        sector_t offset;
 731        struct extent_position epos = {};
 732        struct udf_inode_info *dinfo = UDF_I(dir);
 733
 734        f_pos = udf_ext0_offset(dir);
 735        fibh.soffset = fibh.eoffset = f_pos & (dir->i_sb->s_blocksize - 1);
 736
 737        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
 738                fibh.sbh = fibh.ebh = NULL;
 739        else if (inode_bmap(dir, f_pos >> dir->i_sb->s_blocksize_bits,
 740                              &epos, &eloc, &elen, &offset) ==
 741                                        (EXT_RECORDED_ALLOCATED >> 30)) {
 742                block = udf_get_lb_pblock(dir->i_sb, &eloc, offset);
 743                if ((++offset << dir->i_sb->s_blocksize_bits) < elen) {
 744                        if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT)
 745                                epos.offset -= sizeof(struct short_ad);
 746                        else if (dinfo->i_alloc_type == ICBTAG_FLAG_AD_LONG)
 747                                epos.offset -= sizeof(struct long_ad);
 748                } else
 749                        offset = 0;
 750
 751                fibh.sbh = fibh.ebh = udf_tread(dir->i_sb, block);
 752                if (!fibh.sbh) {
 753                        brelse(epos.bh);
 754                        return 0;
 755                }
 756        } else {
 757                brelse(epos.bh);
 758                return 0;
 759        }
 760
 761        while (f_pos < size) {
 762                fi = udf_fileident_read(dir, &f_pos, &fibh, &cfi, &epos, &eloc,
 763                                        &elen, &offset);
 764                if (!fi) {
 765                        if (fibh.sbh != fibh.ebh)
 766                                brelse(fibh.ebh);
 767                        brelse(fibh.sbh);
 768                        brelse(epos.bh);
 769                        return 0;
 770                }
 771
 772                if (cfi.lengthFileIdent &&
 773                    (cfi.fileCharacteristics & FID_FILE_CHAR_DELETED) == 0) {
 774                        if (fibh.sbh != fibh.ebh)
 775                                brelse(fibh.ebh);
 776                        brelse(fibh.sbh);
 777                        brelse(epos.bh);
 778                        return 0;
 779                }
 780        }
 781
 782        if (fibh.sbh != fibh.ebh)
 783                brelse(fibh.ebh);
 784        brelse(fibh.sbh);
 785        brelse(epos.bh);
 786
 787        return 1;
 788}
 789
 790static int udf_rmdir(struct inode *dir, struct dentry *dentry)
 791{
 792        int retval;
 793        struct inode *inode = d_inode(dentry);
 794        struct udf_fileident_bh fibh;
 795        struct fileIdentDesc *fi, cfi;
 796        struct kernel_lb_addr tloc;
 797
 798        retval = -ENOENT;
 799        fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 800        if (IS_ERR_OR_NULL(fi)) {
 801                if (fi)
 802                        retval = PTR_ERR(fi);
 803                goto out;
 804        }
 805
 806        retval = -EIO;
 807        tloc = lelb_to_cpu(cfi.icb.extLocation);
 808        if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
 809                goto end_rmdir;
 810        retval = -ENOTEMPTY;
 811        if (!empty_dir(inode))
 812                goto end_rmdir;
 813        retval = udf_delete_entry(dir, fi, &fibh, &cfi);
 814        if (retval)
 815                goto end_rmdir;
 816        if (inode->i_nlink != 2)
 817                udf_warn(inode->i_sb, "empty directory has nlink != 2 (%u)\n",
 818                         inode->i_nlink);
 819        clear_nlink(inode);
 820        inode->i_size = 0;
 821        inode_dec_link_count(dir);
 822        inode->i_ctime = dir->i_ctime = dir->i_mtime =
 823                                                current_time(inode);
 824        mark_inode_dirty(dir);
 825
 826end_rmdir:
 827        if (fibh.sbh != fibh.ebh)
 828                brelse(fibh.ebh);
 829        brelse(fibh.sbh);
 830
 831out:
 832        return retval;
 833}
 834
 835static int udf_unlink(struct inode *dir, struct dentry *dentry)
 836{
 837        int retval;
 838        struct inode *inode = d_inode(dentry);
 839        struct udf_fileident_bh fibh;
 840        struct fileIdentDesc *fi;
 841        struct fileIdentDesc cfi;
 842        struct kernel_lb_addr tloc;
 843
 844        retval = -ENOENT;
 845        fi = udf_find_entry(dir, &dentry->d_name, &fibh, &cfi);
 846
 847        if (IS_ERR_OR_NULL(fi)) {
 848                if (fi)
 849                        retval = PTR_ERR(fi);
 850                goto out;
 851        }
 852
 853        retval = -EIO;
 854        tloc = lelb_to_cpu(cfi.icb.extLocation);
 855        if (udf_get_lb_pblock(dir->i_sb, &tloc, 0) != inode->i_ino)
 856                goto end_unlink;
 857
 858        if (!inode->i_nlink) {
 859                udf_debug("Deleting nonexistent file (%lu), %u\n",
 860                          inode->i_ino, inode->i_nlink);
 861                set_nlink(inode, 1);
 862        }
 863        retval = udf_delete_entry(dir, fi, &fibh, &cfi);
 864        if (retval)
 865                goto end_unlink;
 866        dir->i_ctime = dir->i_mtime = current_time(dir);
 867        mark_inode_dirty(dir);
 868        inode_dec_link_count(inode);
 869        inode->i_ctime = dir->i_ctime;
 870        retval = 0;
 871
 872end_unlink:
 873        if (fibh.sbh != fibh.ebh)
 874                brelse(fibh.ebh);
 875        brelse(fibh.sbh);
 876
 877out:
 878        return retval;
 879}
 880
 881static int udf_symlink(struct inode *dir, struct dentry *dentry,
 882                       const char *symname)
 883{
 884        struct inode *inode = udf_new_inode(dir, S_IFLNK | 0777);
 885        struct pathComponent *pc;
 886        const char *compstart;
 887        struct extent_position epos = {};
 888        int eoffset, elen = 0;
 889        uint8_t *ea;
 890        int err;
 891        udf_pblk_t block;
 892        unsigned char *name = NULL;
 893        int namelen;
 894        struct udf_inode_info *iinfo;
 895        struct super_block *sb = dir->i_sb;
 896
 897        if (IS_ERR(inode))
 898                return PTR_ERR(inode);
 899
 900        iinfo = UDF_I(inode);
 901        down_write(&iinfo->i_data_sem);
 902        name = kmalloc(UDF_NAME_LEN_CS0, GFP_NOFS);
 903        if (!name) {
 904                err = -ENOMEM;
 905                goto out_no_entry;
 906        }
 907
 908        inode->i_data.a_ops = &udf_symlink_aops;
 909        inode->i_op = &udf_symlink_inode_operations;
 910        inode_nohighmem(inode);
 911
 912        if (iinfo->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
 913                struct kernel_lb_addr eloc;
 914                uint32_t bsize;
 915
 916                block = udf_new_block(sb, inode,
 917                                iinfo->i_location.partitionReferenceNum,
 918                                iinfo->i_location.logicalBlockNum, &err);
 919                if (!block)
 920                        goto out_no_entry;
 921                epos.block = iinfo->i_location;
 922                epos.offset = udf_file_entry_alloc_offset(inode);
 923                epos.bh = NULL;
 924                eloc.logicalBlockNum = block;
 925                eloc.partitionReferenceNum =
 926                                iinfo->i_location.partitionReferenceNum;
 927                bsize = sb->s_blocksize;
 928                iinfo->i_lenExtents = bsize;
 929                udf_add_aext(inode, &epos, &eloc, bsize, 0);
 930                brelse(epos.bh);
 931
 932                block = udf_get_pblock(sb, block,
 933                                iinfo->i_location.partitionReferenceNum,
 934                                0);
 935                epos.bh = udf_tgetblk(sb, block);
 936                lock_buffer(epos.bh);
 937                memset(epos.bh->b_data, 0x00, bsize);
 938                set_buffer_uptodate(epos.bh);
 939                unlock_buffer(epos.bh);
 940                mark_buffer_dirty_inode(epos.bh, inode);
 941                ea = epos.bh->b_data + udf_ext0_offset(inode);
 942        } else
 943                ea = iinfo->i_ext.i_data + iinfo->i_lenEAttr;
 944
 945        eoffset = sb->s_blocksize - udf_ext0_offset(inode);
 946        pc = (struct pathComponent *)ea;
 947
 948        if (*symname == '/') {
 949                do {
 950                        symname++;
 951                } while (*symname == '/');
 952
 953                pc->componentType = 1;
 954                pc->lengthComponentIdent = 0;
 955                pc->componentFileVersionNum = 0;
 956                elen += sizeof(struct pathComponent);
 957        }
 958
 959        err = -ENAMETOOLONG;
 960
 961        while (*symname) {
 962                if (elen + sizeof(struct pathComponent) > eoffset)
 963                        goto out_no_entry;
 964
 965                pc = (struct pathComponent *)(ea + elen);
 966
 967                compstart = symname;
 968
 969                do {
 970                        symname++;
 971                } while (*symname && *symname != '/');
 972
 973                pc->componentType = 5;
 974                pc->lengthComponentIdent = 0;
 975                pc->componentFileVersionNum = 0;
 976                if (compstart[0] == '.') {
 977                        if ((symname - compstart) == 1)
 978                                pc->componentType = 4;
 979                        else if ((symname - compstart) == 2 &&
 980                                        compstart[1] == '.')
 981                                pc->componentType = 3;
 982                }
 983
 984                if (pc->componentType == 5) {
 985                        namelen = udf_put_filename(sb, compstart,
 986                                                   symname - compstart,
 987                                                   name, UDF_NAME_LEN_CS0);
 988                        if (!namelen)
 989                                goto out_no_entry;
 990
 991                        if (elen + sizeof(struct pathComponent) + namelen >
 992                                        eoffset)
 993                                goto out_no_entry;
 994                        else
 995                                pc->lengthComponentIdent = namelen;
 996
 997                        memcpy(pc->componentIdent, name, namelen);
 998                }
 999
1000                elen += sizeof(struct pathComponent) + pc->lengthComponentIdent;
1001
1002                if (*symname) {
1003                        do {
1004                                symname++;
1005                        } while (*symname == '/');
1006                }
1007        }
1008
1009        brelse(epos.bh);
1010        inode->i_size = elen;
1011        if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1012                iinfo->i_lenAlloc = inode->i_size;
1013        else
1014                udf_truncate_tail_extent(inode);
1015        mark_inode_dirty(inode);
1016        up_write(&iinfo->i_data_sem);
1017
1018        err = udf_add_nondir(dentry, inode);
1019out:
1020        kfree(name);
1021        return err;
1022
1023out_no_entry:
1024        up_write(&iinfo->i_data_sem);
1025        inode_dec_link_count(inode);
1026        discard_new_inode(inode);
1027        goto out;
1028}
1029
1030static int udf_link(struct dentry *old_dentry, struct inode *dir,
1031                    struct dentry *dentry)
1032{
1033        struct inode *inode = d_inode(old_dentry);
1034        struct udf_fileident_bh fibh;
1035        struct fileIdentDesc cfi, *fi;
1036        int err;
1037
1038        fi = udf_add_entry(dir, dentry, &fibh, &cfi, &err);
1039        if (!fi) {
1040                return err;
1041        }
1042        cfi.icb.extLength = cpu_to_le32(inode->i_sb->s_blocksize);
1043        cfi.icb.extLocation = cpu_to_lelb(UDF_I(inode)->i_location);
1044        if (UDF_SB(inode->i_sb)->s_lvid_bh) {
1045                *(__le32 *)((struct allocDescImpUse *)cfi.icb.impUse)->impUse =
1046                        cpu_to_le32(lvid_get_unique_id(inode->i_sb));
1047        }
1048        udf_write_fi(dir, &cfi, fi, &fibh, NULL, NULL);
1049        if (UDF_I(dir)->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1050                mark_inode_dirty(dir);
1051
1052        if (fibh.sbh != fibh.ebh)
1053                brelse(fibh.ebh);
1054        brelse(fibh.sbh);
1055        inc_nlink(inode);
1056        inode->i_ctime = current_time(inode);
1057        mark_inode_dirty(inode);
1058        dir->i_ctime = dir->i_mtime = current_time(dir);
1059        mark_inode_dirty(dir);
1060        ihold(inode);
1061        d_instantiate(dentry, inode);
1062
1063        return 0;
1064}
1065
1066/* Anybody can rename anything with this: the permission checks are left to the
1067 * higher-level routines.
1068 */
1069static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
1070                      struct inode *new_dir, struct dentry *new_dentry,
1071                      unsigned int flags)
1072{
1073        struct inode *old_inode = d_inode(old_dentry);
1074        struct inode *new_inode = d_inode(new_dentry);
1075        struct udf_fileident_bh ofibh, nfibh;
1076        struct fileIdentDesc *ofi = NULL, *nfi = NULL, *dir_fi = NULL;
1077        struct fileIdentDesc ocfi, ncfi;
1078        struct buffer_head *dir_bh = NULL;
1079        int retval = -ENOENT;
1080        struct kernel_lb_addr tloc;
1081        struct udf_inode_info *old_iinfo = UDF_I(old_inode);
1082
1083        if (flags & ~RENAME_NOREPLACE)
1084                return -EINVAL;
1085
1086        ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
1087        if (IS_ERR(ofi)) {
1088                retval = PTR_ERR(ofi);
1089                goto end_rename;
1090        }
1091
1092        if (ofibh.sbh != ofibh.ebh)
1093                brelse(ofibh.ebh);
1094
1095        brelse(ofibh.sbh);
1096        tloc = lelb_to_cpu(ocfi.icb.extLocation);
1097        if (!ofi || udf_get_lb_pblock(old_dir->i_sb, &tloc, 0)
1098            != old_inode->i_ino)
1099                goto end_rename;
1100
1101        nfi = udf_find_entry(new_dir, &new_dentry->d_name, &nfibh, &ncfi);
1102        if (IS_ERR(nfi)) {
1103                retval = PTR_ERR(nfi);
1104                goto end_rename;
1105        }
1106        if (nfi && !new_inode) {
1107                if (nfibh.sbh != nfibh.ebh)
1108                        brelse(nfibh.ebh);
1109                brelse(nfibh.sbh);
1110                nfi = NULL;
1111        }
1112        if (S_ISDIR(old_inode->i_mode)) {
1113                int offset = udf_ext0_offset(old_inode);
1114
1115                if (new_inode) {
1116                        retval = -ENOTEMPTY;
1117                        if (!empty_dir(new_inode))
1118                                goto end_rename;
1119                }
1120                retval = -EIO;
1121                if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
1122                        dir_fi = udf_get_fileident(
1123                                        old_iinfo->i_ext.i_data -
1124                                          (old_iinfo->i_efe ?
1125                                           sizeof(struct extendedFileEntry) :
1126                                           sizeof(struct fileEntry)),
1127                                        old_inode->i_sb->s_blocksize, &offset);
1128                } else {
1129                        dir_bh = udf_bread(old_inode, 0, 0, &retval);
1130                        if (!dir_bh)
1131                                goto end_rename;
1132                        dir_fi = udf_get_fileident(dir_bh->b_data,
1133                                        old_inode->i_sb->s_blocksize, &offset);
1134                }
1135                if (!dir_fi)
1136                        goto end_rename;
1137                tloc = lelb_to_cpu(dir_fi->icb.extLocation);
1138                if (udf_get_lb_pblock(old_inode->i_sb, &tloc, 0) !=
1139                                old_dir->i_ino)
1140                        goto end_rename;
1141        }
1142        if (!nfi) {
1143                nfi = udf_add_entry(new_dir, new_dentry, &nfibh, &ncfi,
1144                                    &retval);
1145                if (!nfi)
1146                        goto end_rename;
1147        }
1148
1149        /*
1150         * Like most other Unix systems, set the ctime for inodes on a
1151         * rename.
1152         */
1153        old_inode->i_ctime = current_time(old_inode);
1154        mark_inode_dirty(old_inode);
1155
1156        /*
1157         * ok, that's it
1158         */
1159        ncfi.fileVersionNum = ocfi.fileVersionNum;
1160        ncfi.fileCharacteristics = ocfi.fileCharacteristics;
1161        memcpy(&(ncfi.icb), &(ocfi.icb), sizeof(ocfi.icb));
1162        udf_write_fi(new_dir, &ncfi, nfi, &nfibh, NULL, NULL);
1163
1164        /* The old fid may have moved - find it again */
1165        ofi = udf_find_entry(old_dir, &old_dentry->d_name, &ofibh, &ocfi);
1166        udf_delete_entry(old_dir, ofi, &ofibh, &ocfi);
1167
1168        if (new_inode) {
1169                new_inode->i_ctime = current_time(new_inode);
1170                inode_dec_link_count(new_inode);
1171        }
1172        old_dir->i_ctime = old_dir->i_mtime = current_time(old_dir);
1173        new_dir->i_ctime = new_dir->i_mtime = current_time(new_dir);
1174        mark_inode_dirty(old_dir);
1175        mark_inode_dirty(new_dir);
1176
1177        if (dir_fi) {
1178                dir_fi->icb.extLocation = cpu_to_lelb(UDF_I(new_dir)->i_location);
1179                udf_update_tag((char *)dir_fi, udf_dir_entry_len(dir_fi));
1180                if (old_iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB)
1181                        mark_inode_dirty(old_inode);
1182                else
1183                        mark_buffer_dirty_inode(dir_bh, old_inode);
1184
1185                inode_dec_link_count(old_dir);
1186                if (new_inode)
1187                        inode_dec_link_count(new_inode);
1188                else {
1189                        inc_nlink(new_dir);
1190                        mark_inode_dirty(new_dir);
1191                }
1192        }
1193
1194        if (ofi) {
1195                if (ofibh.sbh != ofibh.ebh)
1196                        brelse(ofibh.ebh);
1197                brelse(ofibh.sbh);
1198        }
1199
1200        retval = 0;
1201
1202end_rename:
1203        brelse(dir_bh);
1204        if (nfi) {
1205                if (nfibh.sbh != nfibh.ebh)
1206                        brelse(nfibh.ebh);
1207                brelse(nfibh.sbh);
1208        }
1209
1210        return retval;
1211}
1212
1213static struct dentry *udf_get_parent(struct dentry *child)
1214{
1215        struct kernel_lb_addr tloc;
1216        struct inode *inode = NULL;
1217        struct qstr dotdot = QSTR_INIT("..", 2);
1218        struct fileIdentDesc cfi;
1219        struct udf_fileident_bh fibh;
1220
1221        if (!udf_find_entry(d_inode(child), &dotdot, &fibh, &cfi))
1222                return ERR_PTR(-EACCES);
1223
1224        if (fibh.sbh != fibh.ebh)
1225                brelse(fibh.ebh);
1226        brelse(fibh.sbh);
1227
1228        tloc = lelb_to_cpu(cfi.icb.extLocation);
1229        inode = udf_iget(child->d_sb, &tloc);
1230        if (IS_ERR(inode))
1231                return ERR_CAST(inode);
1232
1233        return d_obtain_alias(inode);
1234}
1235
1236
1237static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block,
1238                                        u16 partref, __u32 generation)
1239{
1240        struct inode *inode;
1241        struct kernel_lb_addr loc;
1242
1243        if (block == 0)
1244                return ERR_PTR(-ESTALE);
1245
1246        loc.logicalBlockNum = block;
1247        loc.partitionReferenceNum = partref;
1248        inode = udf_iget(sb, &loc);
1249
1250        if (IS_ERR(inode))
1251                return ERR_CAST(inode);
1252
1253        if (generation && inode->i_generation != generation) {
1254                iput(inode);
1255                return ERR_PTR(-ESTALE);
1256        }
1257        return d_obtain_alias(inode);
1258}
1259
1260static struct dentry *udf_fh_to_dentry(struct super_block *sb,
1261                                       struct fid *fid, int fh_len, int fh_type)
1262{
1263        if (fh_len < 3 ||
1264            (fh_type != FILEID_UDF_WITH_PARENT &&
1265             fh_type != FILEID_UDF_WITHOUT_PARENT))
1266                return NULL;
1267
1268        return udf_nfs_get_inode(sb, fid->udf.block, fid->udf.partref,
1269                        fid->udf.generation);
1270}
1271
1272static struct dentry *udf_fh_to_parent(struct super_block *sb,
1273                                       struct fid *fid, int fh_len, int fh_type)
1274{
1275        if (fh_len < 5 || fh_type != FILEID_UDF_WITH_PARENT)
1276                return NULL;
1277
1278        return udf_nfs_get_inode(sb, fid->udf.parent_block,
1279                                 fid->udf.parent_partref,
1280                                 fid->udf.parent_generation);
1281}
1282static int udf_encode_fh(struct inode *inode, __u32 *fh, int *lenp,
1283                         struct inode *parent)
1284{
1285        int len = *lenp;
1286        struct kernel_lb_addr location = UDF_I(inode)->i_location;
1287        struct fid *fid = (struct fid *)fh;
1288        int type = FILEID_UDF_WITHOUT_PARENT;
1289
1290        if (parent && (len < 5)) {
1291                *lenp = 5;
1292                return FILEID_INVALID;
1293        } else if (len < 3) {
1294                *lenp = 3;
1295                return FILEID_INVALID;
1296        }
1297
1298        *lenp = 3;
1299        fid->udf.block = location.logicalBlockNum;
1300        fid->udf.partref = location.partitionReferenceNum;
1301        fid->udf.parent_partref = 0;
1302        fid->udf.generation = inode->i_generation;
1303
1304        if (parent) {
1305                location = UDF_I(parent)->i_location;
1306                fid->udf.parent_block = location.logicalBlockNum;
1307                fid->udf.parent_partref = location.partitionReferenceNum;
1308                fid->udf.parent_generation = inode->i_generation;
1309                *lenp = 5;
1310                type = FILEID_UDF_WITH_PARENT;
1311        }
1312
1313        return type;
1314}
1315
1316const struct export_operations udf_export_ops = {
1317        .encode_fh      = udf_encode_fh,
1318        .fh_to_dentry   = udf_fh_to_dentry,
1319        .fh_to_parent   = udf_fh_to_parent,
1320        .get_parent     = udf_get_parent,
1321};
1322
1323const struct inode_operations udf_dir_inode_operations = {
1324        .lookup                         = udf_lookup,
1325        .create                         = udf_create,
1326        .link                           = udf_link,
1327        .unlink                         = udf_unlink,
1328        .symlink                        = udf_symlink,
1329        .mkdir                          = udf_mkdir,
1330        .rmdir                          = udf_rmdir,
1331        .mknod                          = udf_mknod,
1332        .rename                         = udf_rename,
1333        .tmpfile                        = udf_tmpfile,
1334};
1335