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