linux/fs/udf/super.c
<<
>>
Prefs
   1/*
   2 * super.c
   3 *
   4 * PURPOSE
   5 *  Super block routines for the OSTA-UDF(tm) filesystem.
   6 *
   7 * DESCRIPTION
   8 *  OSTA-UDF(tm) = Optical Storage Technology Association
   9 *  Universal Disk Format.
  10 *
  11 *  This code is based on version 2.00 of the UDF specification,
  12 *  and revision 3 of the ECMA 167 standard [equivalent to ISO 13346].
  13 *    http://www.osta.org/
  14 *    http://www.ecma.ch/
  15 *    http://www.iso.org/
  16 *
  17 * COPYRIGHT
  18 *  This file is distributed under the terms of the GNU General Public
  19 *  License (GPL). Copies of the GPL can be obtained from:
  20 *    ftp://prep.ai.mit.edu/pub/gnu/GPL
  21 *  Each contributing author retains all rights to their own work.
  22 *
  23 *  (C) 1998 Dave Boynton
  24 *  (C) 1998-2004 Ben Fennema
  25 *  (C) 2000 Stelias Computing Inc
  26 *
  27 * HISTORY
  28 *
  29 *  09/24/98 dgb  changed to allow compiling outside of kernel, and
  30 *                added some debugging.
  31 *  10/01/98 dgb  updated to allow (some) possibility of compiling w/2.0.34
  32 *  10/16/98      attempting some multi-session support
  33 *  10/17/98      added freespace count for "df"
  34 *  11/11/98 gr   added novrs option
  35 *  11/26/98 dgb  added fileset,anchor mount options
  36 *  12/06/98 blf  really hosed things royally. vat/sparing support. sequenced
  37 *                vol descs. rewrote option handling based on isofs
  38 *  12/20/98      find the free space bitmap (if it exists)
  39 */
  40
  41#include "udfdecl.h"
  42
  43#include <linux/blkdev.h>
  44#include <linux/slab.h>
  45#include <linux/kernel.h>
  46#include <linux/module.h>
  47#include <linux/parser.h>
  48#include <linux/stat.h>
  49#include <linux/cdrom.h>
  50#include <linux/nls.h>
  51#include <linux/buffer_head.h>
  52#include <linux/vfs.h>
  53#include <linux/vmalloc.h>
  54#include <linux/errno.h>
  55#include <linux/mount.h>
  56#include <linux/seq_file.h>
  57#include <linux/bitmap.h>
  58#include <linux/crc-itu-t.h>
  59#include <linux/log2.h>
  60#include <asm/byteorder.h>
  61
  62#include "udf_sb.h"
  63#include "udf_i.h"
  64
  65#include <linux/init.h>
  66#include <asm/uaccess.h>
  67
  68#define VDS_POS_PRIMARY_VOL_DESC        0
  69#define VDS_POS_UNALLOC_SPACE_DESC      1
  70#define VDS_POS_LOGICAL_VOL_DESC        2
  71#define VDS_POS_PARTITION_DESC          3
  72#define VDS_POS_IMP_USE_VOL_DESC        4
  73#define VDS_POS_VOL_DESC_PTR            5
  74#define VDS_POS_TERMINATING_DESC        6
  75#define VDS_POS_LENGTH                  7
  76
  77#define UDF_DEFAULT_BLOCKSIZE 2048
  78
  79enum { UDF_MAX_LINKS = 0xffff };
  80
  81/* These are the "meat" - everything else is stuffing */
  82static int udf_fill_super(struct super_block *, void *, int);
  83static void udf_put_super(struct super_block *);
  84static int udf_sync_fs(struct super_block *, int);
  85static int udf_remount_fs(struct super_block *, int *, char *);
  86static void udf_load_logicalvolint(struct super_block *, struct kernel_extent_ad);
  87static int udf_find_fileset(struct super_block *, struct kernel_lb_addr *,
  88                            struct kernel_lb_addr *);
  89static void udf_load_fileset(struct super_block *, struct buffer_head *,
  90                             struct kernel_lb_addr *);
  91static void udf_open_lvid(struct super_block *);
  92static void udf_close_lvid(struct super_block *);
  93static unsigned int udf_count_free(struct super_block *);
  94static int udf_statfs(struct dentry *, struct kstatfs *);
  95static int udf_show_options(struct seq_file *, struct dentry *);
  96
  97struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb)
  98{
  99        struct logicalVolIntegrityDesc *lvid;
 100        unsigned int partnum;
 101        unsigned int offset;
 102
 103        if (!UDF_SB(sb)->s_lvid_bh)
 104                return NULL;
 105        lvid = (struct logicalVolIntegrityDesc *)UDF_SB(sb)->s_lvid_bh->b_data;
 106        partnum = le32_to_cpu(lvid->numOfPartitions);
 107        if ((sb->s_blocksize - sizeof(struct logicalVolIntegrityDescImpUse) -
 108             offsetof(struct logicalVolIntegrityDesc, impUse)) /
 109             (2 * sizeof(uint32_t)) < partnum) {
 110                udf_err(sb, "Logical volume integrity descriptor corrupted "
 111                        "(numOfPartitions = %u)!\n", partnum);
 112                return NULL;
 113        }
 114        /* The offset is to skip freeSpaceTable and sizeTable arrays */
 115        offset = partnum * 2 * sizeof(uint32_t);
 116        return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]);
 117}
 118
 119/* UDF filesystem type */
 120static struct dentry *udf_mount(struct file_system_type *fs_type,
 121                      int flags, const char *dev_name, void *data)
 122{
 123        return mount_bdev(fs_type, flags, dev_name, data, udf_fill_super);
 124}
 125
 126static struct file_system_type udf_fstype = {
 127        .owner          = THIS_MODULE,
 128        .name           = "udf",
 129        .mount          = udf_mount,
 130        .kill_sb        = kill_block_super,
 131        .fs_flags       = FS_REQUIRES_DEV,
 132};
 133MODULE_ALIAS_FS("udf");
 134
 135static struct kmem_cache *udf_inode_cachep;
 136
 137static struct inode *udf_alloc_inode(struct super_block *sb)
 138{
 139        struct udf_inode_info *ei;
 140        ei = kmem_cache_alloc(udf_inode_cachep, GFP_KERNEL);
 141        if (!ei)
 142                return NULL;
 143
 144        ei->i_unique = 0;
 145        ei->i_lenExtents = 0;
 146        ei->i_next_alloc_block = 0;
 147        ei->i_next_alloc_goal = 0;
 148        ei->i_strat4096 = 0;
 149        init_rwsem(&ei->i_data_sem);
 150        ei->cached_extent.lstart = -1;
 151        spin_lock_init(&ei->i_extent_cache_lock);
 152
 153        return &ei->vfs_inode;
 154}
 155
 156static void udf_i_callback(struct rcu_head *head)
 157{
 158        struct inode *inode = container_of(head, struct inode, i_rcu);
 159        kmem_cache_free(udf_inode_cachep, UDF_I(inode));
 160}
 161
 162static void udf_destroy_inode(struct inode *inode)
 163{
 164        call_rcu(&inode->i_rcu, udf_i_callback);
 165}
 166
 167static void init_once(void *foo)
 168{
 169        struct udf_inode_info *ei = (struct udf_inode_info *)foo;
 170
 171        ei->i_ext.i_data = NULL;
 172        inode_init_once(&ei->vfs_inode);
 173}
 174
 175static int init_inodecache(void)
 176{
 177        udf_inode_cachep = kmem_cache_create("udf_inode_cache",
 178                                             sizeof(struct udf_inode_info),
 179                                             0, (SLAB_RECLAIM_ACCOUNT |
 180                                                 SLAB_MEM_SPREAD),
 181                                             init_once);
 182        if (!udf_inode_cachep)
 183                return -ENOMEM;
 184        return 0;
 185}
 186
 187static void destroy_inodecache(void)
 188{
 189        /*
 190         * Make sure all delayed rcu free inodes are flushed before we
 191         * destroy cache.
 192         */
 193        rcu_barrier();
 194        kmem_cache_destroy(udf_inode_cachep);
 195}
 196
 197/* Superblock operations */
 198static const struct super_operations udf_sb_ops = {
 199        .alloc_inode    = udf_alloc_inode,
 200        .destroy_inode  = udf_destroy_inode,
 201        .write_inode    = udf_write_inode,
 202        .evict_inode    = udf_evict_inode,
 203        .put_super      = udf_put_super,
 204        .sync_fs        = udf_sync_fs,
 205        .statfs         = udf_statfs,
 206        .remount_fs     = udf_remount_fs,
 207        .show_options   = udf_show_options,
 208};
 209
 210struct udf_options {
 211        unsigned char novrs;
 212        unsigned int blocksize;
 213        unsigned int session;
 214        unsigned int lastblock;
 215        unsigned int anchor;
 216        unsigned int volume;
 217        unsigned short partition;
 218        unsigned int fileset;
 219        unsigned int rootdir;
 220        unsigned int flags;
 221        umode_t umask;
 222        kgid_t gid;
 223        kuid_t uid;
 224        umode_t fmode;
 225        umode_t dmode;
 226        struct nls_table *nls_map;
 227};
 228
 229static int __init init_udf_fs(void)
 230{
 231        int err;
 232
 233        err = init_inodecache();
 234        if (err)
 235                goto out1;
 236        err = register_filesystem(&udf_fstype);
 237        if (err)
 238                goto out;
 239
 240        return 0;
 241
 242out:
 243        destroy_inodecache();
 244
 245out1:
 246        return err;
 247}
 248
 249static void __exit exit_udf_fs(void)
 250{
 251        unregister_filesystem(&udf_fstype);
 252        destroy_inodecache();
 253}
 254
 255module_init(init_udf_fs)
 256module_exit(exit_udf_fs)
 257
 258static int udf_sb_alloc_partition_maps(struct super_block *sb, u32 count)
 259{
 260        struct udf_sb_info *sbi = UDF_SB(sb);
 261
 262        sbi->s_partmaps = kcalloc(count, sizeof(struct udf_part_map),
 263                                  GFP_KERNEL);
 264        if (!sbi->s_partmaps) {
 265                udf_err(sb, "Unable to allocate space for %d partition maps\n",
 266                        count);
 267                sbi->s_partitions = 0;
 268                return -ENOMEM;
 269        }
 270
 271        sbi->s_partitions = count;
 272        return 0;
 273}
 274
 275static void udf_sb_free_bitmap(struct udf_bitmap *bitmap)
 276{
 277        int i;
 278        int nr_groups = bitmap->s_nr_groups;
 279        int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) *
 280                                                nr_groups);
 281
 282        for (i = 0; i < nr_groups; i++)
 283                if (bitmap->s_block_bitmap[i])
 284                        brelse(bitmap->s_block_bitmap[i]);
 285
 286        if (size <= PAGE_SIZE)
 287                kfree(bitmap);
 288        else
 289                vfree(bitmap);
 290}
 291
 292static void udf_free_partition(struct udf_part_map *map)
 293{
 294        int i;
 295        struct udf_meta_data *mdata;
 296
 297        if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE)
 298                iput(map->s_uspace.s_table);
 299        if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE)
 300                iput(map->s_fspace.s_table);
 301        if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP)
 302                udf_sb_free_bitmap(map->s_uspace.s_bitmap);
 303        if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP)
 304                udf_sb_free_bitmap(map->s_fspace.s_bitmap);
 305        if (map->s_partition_type == UDF_SPARABLE_MAP15)
 306                for (i = 0; i < 4; i++)
 307                        brelse(map->s_type_specific.s_sparing.s_spar_map[i]);
 308        else if (map->s_partition_type == UDF_METADATA_MAP25) {
 309                mdata = &map->s_type_specific.s_metadata;
 310                iput(mdata->s_metadata_fe);
 311                mdata->s_metadata_fe = NULL;
 312
 313                iput(mdata->s_mirror_fe);
 314                mdata->s_mirror_fe = NULL;
 315
 316                iput(mdata->s_bitmap_fe);
 317                mdata->s_bitmap_fe = NULL;
 318        }
 319}
 320
 321static void udf_sb_free_partitions(struct super_block *sb)
 322{
 323        struct udf_sb_info *sbi = UDF_SB(sb);
 324        int i;
 325        if (sbi->s_partmaps == NULL)
 326                return;
 327        for (i = 0; i < sbi->s_partitions; i++)
 328                udf_free_partition(&sbi->s_partmaps[i]);
 329        kfree(sbi->s_partmaps);
 330        sbi->s_partmaps = NULL;
 331}
 332
 333static int udf_show_options(struct seq_file *seq, struct dentry *root)
 334{
 335        struct super_block *sb = root->d_sb;
 336        struct udf_sb_info *sbi = UDF_SB(sb);
 337
 338        if (!UDF_QUERY_FLAG(sb, UDF_FLAG_STRICT))
 339                seq_puts(seq, ",nostrict");
 340        if (UDF_QUERY_FLAG(sb, UDF_FLAG_BLOCKSIZE_SET))
 341                seq_printf(seq, ",bs=%lu", sb->s_blocksize);
 342        if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNHIDE))
 343                seq_puts(seq, ",unhide");
 344        if (UDF_QUERY_FLAG(sb, UDF_FLAG_UNDELETE))
 345                seq_puts(seq, ",undelete");
 346        if (!UDF_QUERY_FLAG(sb, UDF_FLAG_USE_AD_IN_ICB))
 347                seq_puts(seq, ",noadinicb");
 348        if (UDF_QUERY_FLAG(sb, UDF_FLAG_USE_SHORT_AD))
 349                seq_puts(seq, ",shortad");
 350        if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_FORGET))
 351                seq_puts(seq, ",uid=forget");
 352        if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_IGNORE))
 353                seq_puts(seq, ",uid=ignore");
 354        if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_FORGET))
 355                seq_puts(seq, ",gid=forget");
 356        if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_IGNORE))
 357                seq_puts(seq, ",gid=ignore");
 358        if (UDF_QUERY_FLAG(sb, UDF_FLAG_UID_SET))
 359                seq_printf(seq, ",uid=%u", from_kuid(&init_user_ns, sbi->s_uid));
 360        if (UDF_QUERY_FLAG(sb, UDF_FLAG_GID_SET))
 361                seq_printf(seq, ",gid=%u", from_kgid(&init_user_ns, sbi->s_gid));
 362        if (sbi->s_umask != 0)
 363                seq_printf(seq, ",umask=%ho", sbi->s_umask);
 364        if (sbi->s_fmode != UDF_INVALID_MODE)
 365                seq_printf(seq, ",mode=%ho", sbi->s_fmode);
 366        if (sbi->s_dmode != UDF_INVALID_MODE)
 367                seq_printf(seq, ",dmode=%ho", sbi->s_dmode);
 368        if (UDF_QUERY_FLAG(sb, UDF_FLAG_SESSION_SET))
 369                seq_printf(seq, ",session=%u", sbi->s_session);
 370        if (UDF_QUERY_FLAG(sb, UDF_FLAG_LASTBLOCK_SET))
 371                seq_printf(seq, ",lastblock=%u", sbi->s_last_block);
 372        if (sbi->s_anchor != 0)
 373                seq_printf(seq, ",anchor=%u", sbi->s_anchor);
 374        /*
 375         * volume, partition, fileset and rootdir seem to be ignored
 376         * currently
 377         */
 378        if (UDF_QUERY_FLAG(sb, UDF_FLAG_UTF8))
 379                seq_puts(seq, ",utf8");
 380        if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP) && sbi->s_nls_map)
 381                seq_printf(seq, ",iocharset=%s", sbi->s_nls_map->charset);
 382
 383        return 0;
 384}
 385
 386/*
 387 * udf_parse_options
 388 *
 389 * PURPOSE
 390 *      Parse mount options.
 391 *
 392 * DESCRIPTION
 393 *      The following mount options are supported:
 394 *
 395 *      gid=            Set the default group.
 396 *      umask=          Set the default umask.
 397 *      mode=           Set the default file permissions.
 398 *      dmode=          Set the default directory permissions.
 399 *      uid=            Set the default user.
 400 *      bs=             Set the block size.
 401 *      unhide          Show otherwise hidden files.
 402 *      undelete        Show deleted files in lists.
 403 *      adinicb         Embed data in the inode (default)
 404 *      noadinicb       Don't embed data in the inode
 405 *      shortad         Use short ad's
 406 *      longad          Use long ad's (default)
 407 *      nostrict        Unset strict conformance
 408 *      iocharset=      Set the NLS character set
 409 *
 410 *      The remaining are for debugging and disaster recovery:
 411 *
 412 *      novrs           Skip volume sequence recognition
 413 *
 414 *      The following expect a offset from 0.
 415 *
 416 *      session=        Set the CDROM session (default= last session)
 417 *      anchor=         Override standard anchor location. (default= 256)
 418 *      volume=         Override the VolumeDesc location. (unused)
 419 *      partition=      Override the PartitionDesc location. (unused)
 420 *      lastblock=      Set the last block of the filesystem/
 421 *
 422 *      The following expect a offset from the partition root.
 423 *
 424 *      fileset=        Override the fileset block location. (unused)
 425 *      rootdir=        Override the root directory location. (unused)
 426 *              WARNING: overriding the rootdir to a non-directory may
 427 *              yield highly unpredictable results.
 428 *
 429 * PRE-CONDITIONS
 430 *      options         Pointer to mount options string.
 431 *      uopts           Pointer to mount options variable.
 432 *
 433 * POST-CONDITIONS
 434 *      <return>        1       Mount options parsed okay.
 435 *      <return>        0       Error parsing mount options.
 436 *
 437 * HISTORY
 438 *      July 1, 1997 - Andrew E. Mileski
 439 *      Written, tested, and released.
 440 */
 441
 442enum {
 443        Opt_novrs, Opt_nostrict, Opt_bs, Opt_unhide, Opt_undelete,
 444        Opt_noadinicb, Opt_adinicb, Opt_shortad, Opt_longad,
 445        Opt_gid, Opt_uid, Opt_umask, Opt_session, Opt_lastblock,
 446        Opt_anchor, Opt_volume, Opt_partition, Opt_fileset,
 447        Opt_rootdir, Opt_utf8, Opt_iocharset,
 448        Opt_err, Opt_uforget, Opt_uignore, Opt_gforget, Opt_gignore,
 449        Opt_fmode, Opt_dmode
 450};
 451
 452static const match_table_t tokens = {
 453        {Opt_novrs,     "novrs"},
 454        {Opt_nostrict,  "nostrict"},
 455        {Opt_bs,        "bs=%u"},
 456        {Opt_unhide,    "unhide"},
 457        {Opt_undelete,  "undelete"},
 458        {Opt_noadinicb, "noadinicb"},
 459        {Opt_adinicb,   "adinicb"},
 460        {Opt_shortad,   "shortad"},
 461        {Opt_longad,    "longad"},
 462        {Opt_uforget,   "uid=forget"},
 463        {Opt_uignore,   "uid=ignore"},
 464        {Opt_gforget,   "gid=forget"},
 465        {Opt_gignore,   "gid=ignore"},
 466        {Opt_gid,       "gid=%u"},
 467        {Opt_uid,       "uid=%u"},
 468        {Opt_umask,     "umask=%o"},
 469        {Opt_session,   "session=%u"},
 470        {Opt_lastblock, "lastblock=%u"},
 471        {Opt_anchor,    "anchor=%u"},
 472        {Opt_volume,    "volume=%u"},
 473        {Opt_partition, "partition=%u"},
 474        {Opt_fileset,   "fileset=%u"},
 475        {Opt_rootdir,   "rootdir=%u"},
 476        {Opt_utf8,      "utf8"},
 477        {Opt_iocharset, "iocharset=%s"},
 478        {Opt_fmode,     "mode=%o"},
 479        {Opt_dmode,     "dmode=%o"},
 480        {Opt_err,       NULL}
 481};
 482
 483static int udf_parse_options(char *options, struct udf_options *uopt,
 484                             bool remount)
 485{
 486        char *p;
 487        int option;
 488
 489        uopt->novrs = 0;
 490        uopt->partition = 0xFFFF;
 491        uopt->session = 0xFFFFFFFF;
 492        uopt->lastblock = 0;
 493        uopt->anchor = 0;
 494        uopt->volume = 0xFFFFFFFF;
 495        uopt->rootdir = 0xFFFFFFFF;
 496        uopt->fileset = 0xFFFFFFFF;
 497        uopt->nls_map = NULL;
 498
 499        if (!options)
 500                return 1;
 501
 502        while ((p = strsep(&options, ",")) != NULL) {
 503                substring_t args[MAX_OPT_ARGS];
 504                int token;
 505                if (!*p)
 506                        continue;
 507
 508                token = match_token(p, tokens, args);
 509                switch (token) {
 510                case Opt_novrs:
 511                        uopt->novrs = 1;
 512                        break;
 513                case Opt_bs:
 514                        if (match_int(&args[0], &option))
 515                                return 0;
 516                        uopt->blocksize = option;
 517                        uopt->flags |= (1 << UDF_FLAG_BLOCKSIZE_SET);
 518                        break;
 519                case Opt_unhide:
 520                        uopt->flags |= (1 << UDF_FLAG_UNHIDE);
 521                        break;
 522                case Opt_undelete:
 523                        uopt->flags |= (1 << UDF_FLAG_UNDELETE);
 524                        break;
 525                case Opt_noadinicb:
 526                        uopt->flags &= ~(1 << UDF_FLAG_USE_AD_IN_ICB);
 527                        break;
 528                case Opt_adinicb:
 529                        uopt->flags |= (1 << UDF_FLAG_USE_AD_IN_ICB);
 530                        break;
 531                case Opt_shortad:
 532                        uopt->flags |= (1 << UDF_FLAG_USE_SHORT_AD);
 533                        break;
 534                case Opt_longad:
 535                        uopt->flags &= ~(1 << UDF_FLAG_USE_SHORT_AD);
 536                        break;
 537                case Opt_gid:
 538                        if (match_int(args, &option))
 539                                return 0;
 540                        uopt->gid = make_kgid(current_user_ns(), option);
 541                        if (!gid_valid(uopt->gid))
 542                                return 0;
 543                        uopt->flags |= (1 << UDF_FLAG_GID_SET);
 544                        break;
 545                case Opt_uid:
 546                        if (match_int(args, &option))
 547                                return 0;
 548                        uopt->uid = make_kuid(current_user_ns(), option);
 549                        if (!uid_valid(uopt->uid))
 550                                return 0;
 551                        uopt->flags |= (1 << UDF_FLAG_UID_SET);
 552                        break;
 553                case Opt_umask:
 554                        if (match_octal(args, &option))
 555                                return 0;
 556                        uopt->umask = option;
 557                        break;
 558                case Opt_nostrict:
 559                        uopt->flags &= ~(1 << UDF_FLAG_STRICT);
 560                        break;
 561                case Opt_session:
 562                        if (match_int(args, &option))
 563                                return 0;
 564                        uopt->session = option;
 565                        if (!remount)
 566                                uopt->flags |= (1 << UDF_FLAG_SESSION_SET);
 567                        break;
 568                case Opt_lastblock:
 569                        if (match_int(args, &option))
 570                                return 0;
 571                        uopt->lastblock = option;
 572                        if (!remount)
 573                                uopt->flags |= (1 << UDF_FLAG_LASTBLOCK_SET);
 574                        break;
 575                case Opt_anchor:
 576                        if (match_int(args, &option))
 577                                return 0;
 578                        uopt->anchor = option;
 579                        break;
 580                case Opt_volume:
 581                        if (match_int(args, &option))
 582                                return 0;
 583                        uopt->volume = option;
 584                        break;
 585                case Opt_partition:
 586                        if (match_int(args, &option))
 587                                return 0;
 588                        uopt->partition = option;
 589                        break;
 590                case Opt_fileset:
 591                        if (match_int(args, &option))
 592                                return 0;
 593                        uopt->fileset = option;
 594                        break;
 595                case Opt_rootdir:
 596                        if (match_int(args, &option))
 597                                return 0;
 598                        uopt->rootdir = option;
 599                        break;
 600                case Opt_utf8:
 601                        uopt->flags |= (1 << UDF_FLAG_UTF8);
 602                        break;
 603#ifdef CONFIG_UDF_NLS
 604                case Opt_iocharset:
 605                        uopt->nls_map = load_nls(args[0].from);
 606                        uopt->flags |= (1 << UDF_FLAG_NLS_MAP);
 607                        break;
 608#endif
 609                case Opt_uignore:
 610                        uopt->flags |= (1 << UDF_FLAG_UID_IGNORE);
 611                        break;
 612                case Opt_uforget:
 613                        uopt->flags |= (1 << UDF_FLAG_UID_FORGET);
 614                        break;
 615                case Opt_gignore:
 616                        uopt->flags |= (1 << UDF_FLAG_GID_IGNORE);
 617                        break;
 618                case Opt_gforget:
 619                        uopt->flags |= (1 << UDF_FLAG_GID_FORGET);
 620                        break;
 621                case Opt_fmode:
 622                        if (match_octal(args, &option))
 623                                return 0;
 624                        uopt->fmode = option & 0777;
 625                        break;
 626                case Opt_dmode:
 627                        if (match_octal(args, &option))
 628                                return 0;
 629                        uopt->dmode = option & 0777;
 630                        break;
 631                default:
 632                        pr_err("bad mount option \"%s\" or missing value\n", p);
 633                        return 0;
 634                }
 635        }
 636        return 1;
 637}
 638
 639static int udf_remount_fs(struct super_block *sb, int *flags, char *options)
 640{
 641        struct udf_options uopt;
 642        struct udf_sb_info *sbi = UDF_SB(sb);
 643        int error = 0;
 644        struct logicalVolIntegrityDescImpUse *lvidiu = udf_sb_lvidiu(sb);
 645
 646        if (lvidiu) {
 647                int write_rev = le16_to_cpu(lvidiu->minUDFWriteRev);
 648                if (write_rev > UDF_MAX_WRITE_VERSION && !(*flags & MS_RDONLY))
 649                        return -EACCES;
 650        }
 651
 652        uopt.flags = sbi->s_flags;
 653        uopt.uid   = sbi->s_uid;
 654        uopt.gid   = sbi->s_gid;
 655        uopt.umask = sbi->s_umask;
 656        uopt.fmode = sbi->s_fmode;
 657        uopt.dmode = sbi->s_dmode;
 658
 659        if (!udf_parse_options(options, &uopt, true))
 660                return -EINVAL;
 661
 662        write_lock(&sbi->s_cred_lock);
 663        sbi->s_flags = uopt.flags;
 664        sbi->s_uid   = uopt.uid;
 665        sbi->s_gid   = uopt.gid;
 666        sbi->s_umask = uopt.umask;
 667        sbi->s_fmode = uopt.fmode;
 668        sbi->s_dmode = uopt.dmode;
 669        write_unlock(&sbi->s_cred_lock);
 670
 671        if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
 672                goto out_unlock;
 673
 674        if (*flags & MS_RDONLY)
 675                udf_close_lvid(sb);
 676        else
 677                udf_open_lvid(sb);
 678
 679out_unlock:
 680        return error;
 681}
 682
 683/* Check Volume Structure Descriptors (ECMA 167 2/9.1) */
 684/* We also check any "CD-ROM Volume Descriptor Set" (ECMA 167 2/8.3.1) */
 685static loff_t udf_check_vsd(struct super_block *sb)
 686{
 687        struct volStructDesc *vsd = NULL;
 688        loff_t sector = 32768;
 689        int sectorsize;
 690        struct buffer_head *bh = NULL;
 691        int nsr02 = 0;
 692        int nsr03 = 0;
 693        struct udf_sb_info *sbi;
 694
 695        sbi = UDF_SB(sb);
 696        if (sb->s_blocksize < sizeof(struct volStructDesc))
 697                sectorsize = sizeof(struct volStructDesc);
 698        else
 699                sectorsize = sb->s_blocksize;
 700
 701        sector += (sbi->s_session << sb->s_blocksize_bits);
 702
 703        udf_debug("Starting at sector %u (%ld byte sectors)\n",
 704                  (unsigned int)(sector >> sb->s_blocksize_bits),
 705                  sb->s_blocksize);
 706        /* Process the sequence (if applicable) */
 707        for (; !nsr02 && !nsr03; sector += sectorsize) {
 708                /* Read a block */
 709                bh = udf_tread(sb, sector >> sb->s_blocksize_bits);
 710                if (!bh)
 711                        break;
 712
 713                /* Look for ISO  descriptors */
 714                vsd = (struct volStructDesc *)(bh->b_data +
 715                                              (sector & (sb->s_blocksize - 1)));
 716
 717                if (vsd->stdIdent[0] == 0) {
 718                        brelse(bh);
 719                        break;
 720                } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_CD001,
 721                                    VSD_STD_ID_LEN)) {
 722                        switch (vsd->structType) {
 723                        case 0:
 724                                udf_debug("ISO9660 Boot Record found\n");
 725                                break;
 726                        case 1:
 727                                udf_debug("ISO9660 Primary Volume Descriptor found\n");
 728                                break;
 729                        case 2:
 730                                udf_debug("ISO9660 Supplementary Volume Descriptor found\n");
 731                                break;
 732                        case 3:
 733                                udf_debug("ISO9660 Volume Partition Descriptor found\n");
 734                                break;
 735                        case 255:
 736                                udf_debug("ISO9660 Volume Descriptor Set Terminator found\n");
 737                                break;
 738                        default:
 739                                udf_debug("ISO9660 VRS (%u) found\n",
 740                                          vsd->structType);
 741                                break;
 742                        }
 743                } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_BEA01,
 744                                    VSD_STD_ID_LEN))
 745                        ; /* nothing */
 746                else if (!strncmp(vsd->stdIdent, VSD_STD_ID_TEA01,
 747                                    VSD_STD_ID_LEN)) {
 748                        brelse(bh);
 749                        break;
 750                } else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR02,
 751                                    VSD_STD_ID_LEN))
 752                        nsr02 = sector;
 753                else if (!strncmp(vsd->stdIdent, VSD_STD_ID_NSR03,
 754                                    VSD_STD_ID_LEN))
 755                        nsr03 = sector;
 756                brelse(bh);
 757        }
 758
 759        if (nsr03)
 760                return nsr03;
 761        else if (nsr02)
 762                return nsr02;
 763        else if (sector - (sbi->s_session << sb->s_blocksize_bits) == 32768)
 764                return -1;
 765        else
 766                return 0;
 767}
 768
 769static int udf_find_fileset(struct super_block *sb,
 770                            struct kernel_lb_addr *fileset,
 771                            struct kernel_lb_addr *root)
 772{
 773        struct buffer_head *bh = NULL;
 774        long lastblock;
 775        uint16_t ident;
 776        struct udf_sb_info *sbi;
 777
 778        if (fileset->logicalBlockNum != 0xFFFFFFFF ||
 779            fileset->partitionReferenceNum != 0xFFFF) {
 780                bh = udf_read_ptagged(sb, fileset, 0, &ident);
 781
 782                if (!bh) {
 783                        return 1;
 784                } else if (ident != TAG_IDENT_FSD) {
 785                        brelse(bh);
 786                        return 1;
 787                }
 788
 789        }
 790
 791        sbi = UDF_SB(sb);
 792        if (!bh) {
 793                /* Search backwards through the partitions */
 794                struct kernel_lb_addr newfileset;
 795
 796/* --> cvg: FIXME - is it reasonable? */
 797                return 1;
 798
 799                for (newfileset.partitionReferenceNum = sbi->s_partitions - 1;
 800                     (newfileset.partitionReferenceNum != 0xFFFF &&
 801                      fileset->logicalBlockNum == 0xFFFFFFFF &&
 802                      fileset->partitionReferenceNum == 0xFFFF);
 803                     newfileset.partitionReferenceNum--) {
 804                        lastblock = sbi->s_partmaps
 805                                        [newfileset.partitionReferenceNum]
 806                                                .s_partition_len;
 807                        newfileset.logicalBlockNum = 0;
 808
 809                        do {
 810                                bh = udf_read_ptagged(sb, &newfileset, 0,
 811                                                      &ident);
 812                                if (!bh) {
 813                                        newfileset.logicalBlockNum++;
 814                                        continue;
 815                                }
 816
 817                                switch (ident) {
 818                                case TAG_IDENT_SBD:
 819                                {
 820                                        struct spaceBitmapDesc *sp;
 821                                        sp = (struct spaceBitmapDesc *)
 822                                                                bh->b_data;
 823                                        newfileset.logicalBlockNum += 1 +
 824                                                ((le32_to_cpu(sp->numOfBytes) +
 825                                                  sizeof(struct spaceBitmapDesc)
 826                                                  - 1) >> sb->s_blocksize_bits);
 827                                        brelse(bh);
 828                                        break;
 829                                }
 830                                case TAG_IDENT_FSD:
 831                                        *fileset = newfileset;
 832                                        break;
 833                                default:
 834                                        newfileset.logicalBlockNum++;
 835                                        brelse(bh);
 836                                        bh = NULL;
 837                                        break;
 838                                }
 839                        } while (newfileset.logicalBlockNum < lastblock &&
 840                                 fileset->logicalBlockNum == 0xFFFFFFFF &&
 841                                 fileset->partitionReferenceNum == 0xFFFF);
 842                }
 843        }
 844
 845        if ((fileset->logicalBlockNum != 0xFFFFFFFF ||
 846             fileset->partitionReferenceNum != 0xFFFF) && bh) {
 847                udf_debug("Fileset at block=%d, partition=%d\n",
 848                          fileset->logicalBlockNum,
 849                          fileset->partitionReferenceNum);
 850
 851                sbi->s_partition = fileset->partitionReferenceNum;
 852                udf_load_fileset(sb, bh, root);
 853                brelse(bh);
 854                return 0;
 855        }
 856        return 1;
 857}
 858
 859/*
 860 * Load primary Volume Descriptor Sequence
 861 *
 862 * Return <0 on error, 0 on success. -EAGAIN is special meaning next sequence
 863 * should be tried.
 864 */
 865static int udf_load_pvoldesc(struct super_block *sb, sector_t block)
 866{
 867        struct primaryVolDesc *pvoldesc;
 868        struct ustr *instr, *outstr;
 869        struct buffer_head *bh;
 870        uint16_t ident;
 871        int ret = -ENOMEM;
 872
 873        instr = kmalloc(sizeof(struct ustr), GFP_NOFS);
 874        if (!instr)
 875                return -ENOMEM;
 876
 877        outstr = kmalloc(sizeof(struct ustr), GFP_NOFS);
 878        if (!outstr)
 879                goto out1;
 880
 881        bh = udf_read_tagged(sb, block, block, &ident);
 882        if (!bh) {
 883                ret = -EAGAIN;
 884                goto out2;
 885        }
 886
 887        if (ident != TAG_IDENT_PVD) {
 888                ret = -EIO;
 889                goto out_bh;
 890        }
 891
 892        pvoldesc = (struct primaryVolDesc *)bh->b_data;
 893
 894        if (udf_disk_stamp_to_time(&UDF_SB(sb)->s_record_time,
 895                              pvoldesc->recordingDateAndTime)) {
 896#ifdef UDFFS_DEBUG
 897                struct timestamp *ts = &pvoldesc->recordingDateAndTime;
 898                udf_debug("recording time %04u/%02u/%02u %02u:%02u (%x)\n",
 899                          le16_to_cpu(ts->year), ts->month, ts->day, ts->hour,
 900                          ts->minute, le16_to_cpu(ts->typeAndTimezone));
 901#endif
 902        }
 903
 904        if (!udf_build_ustr(instr, pvoldesc->volIdent, 32))
 905                if (udf_CS0toUTF8(outstr, instr)) {
 906                        strncpy(UDF_SB(sb)->s_volume_ident, outstr->u_name,
 907                                outstr->u_len > 31 ? 31 : outstr->u_len);
 908                        udf_debug("volIdent[] = '%s'\n",
 909                                  UDF_SB(sb)->s_volume_ident);
 910                }
 911
 912        if (!udf_build_ustr(instr, pvoldesc->volSetIdent, 128))
 913                if (udf_CS0toUTF8(outstr, instr))
 914                        udf_debug("volSetIdent[] = '%s'\n", outstr->u_name);
 915
 916        ret = 0;
 917out_bh:
 918        brelse(bh);
 919out2:
 920        kfree(outstr);
 921out1:
 922        kfree(instr);
 923        return ret;
 924}
 925
 926struct inode *udf_find_metadata_inode_efe(struct super_block *sb,
 927                                        u32 meta_file_loc, u32 partition_num)
 928{
 929        struct kernel_lb_addr addr;
 930        struct inode *metadata_fe;
 931
 932        addr.logicalBlockNum = meta_file_loc;
 933        addr.partitionReferenceNum = partition_num;
 934
 935        metadata_fe = udf_iget(sb, &addr);
 936
 937        if (metadata_fe == NULL)
 938                udf_warn(sb, "metadata inode efe not found\n");
 939        else if (UDF_I(metadata_fe)->i_alloc_type != ICBTAG_FLAG_AD_SHORT) {
 940                udf_warn(sb, "metadata inode efe does not have short allocation descriptors!\n");
 941                iput(metadata_fe);
 942                metadata_fe = NULL;
 943        }
 944
 945        return metadata_fe;
 946}
 947
 948static int udf_load_metadata_files(struct super_block *sb, int partition)
 949{
 950        struct udf_sb_info *sbi = UDF_SB(sb);
 951        struct udf_part_map *map;
 952        struct udf_meta_data *mdata;
 953        struct kernel_lb_addr addr;
 954
 955        map = &sbi->s_partmaps[partition];
 956        mdata = &map->s_type_specific.s_metadata;
 957
 958        /* metadata address */
 959        udf_debug("Metadata file location: block = %d part = %d\n",
 960                  mdata->s_meta_file_loc, map->s_partition_num);
 961
 962        mdata->s_metadata_fe = udf_find_metadata_inode_efe(sb,
 963                mdata->s_meta_file_loc, map->s_partition_num);
 964
 965        if (mdata->s_metadata_fe == NULL) {
 966                /* mirror file entry */
 967                udf_debug("Mirror metadata file location: block = %d part = %d\n",
 968                          mdata->s_mirror_file_loc, map->s_partition_num);
 969
 970                mdata->s_mirror_fe = udf_find_metadata_inode_efe(sb,
 971                        mdata->s_mirror_file_loc, map->s_partition_num);
 972
 973                if (mdata->s_mirror_fe == NULL) {
 974                        udf_err(sb, "Both metadata and mirror metadata inode efe can not found\n");
 975                        return -EIO;
 976                }
 977        }
 978
 979        /*
 980         * bitmap file entry
 981         * Note:
 982         * Load only if bitmap file location differs from 0xFFFFFFFF (DCN-5102)
 983        */
 984        if (mdata->s_bitmap_file_loc != 0xFFFFFFFF) {
 985                addr.logicalBlockNum = mdata->s_bitmap_file_loc;
 986                addr.partitionReferenceNum = map->s_partition_num;
 987
 988                udf_debug("Bitmap file location: block = %d part = %d\n",
 989                          addr.logicalBlockNum, addr.partitionReferenceNum);
 990
 991                mdata->s_bitmap_fe = udf_iget(sb, &addr);
 992                if (mdata->s_bitmap_fe == NULL) {
 993                        if (sb->s_flags & MS_RDONLY)
 994                                udf_warn(sb, "bitmap inode efe not found but it's ok since the disc is mounted read-only\n");
 995                        else {
 996                                udf_err(sb, "bitmap inode efe not found and attempted read-write mount\n");
 997                                return -EIO;
 998                        }
 999                }
1000        }
1001
1002        udf_debug("udf_load_metadata_files Ok\n");
1003        return 0;
1004}
1005
1006static void udf_load_fileset(struct super_block *sb, struct buffer_head *bh,
1007                             struct kernel_lb_addr *root)
1008{
1009        struct fileSetDesc *fset;
1010
1011        fset = (struct fileSetDesc *)bh->b_data;
1012
1013        *root = lelb_to_cpu(fset->rootDirectoryICB.extLocation);
1014
1015        UDF_SB(sb)->s_serial_number = le16_to_cpu(fset->descTag.tagSerialNum);
1016
1017        udf_debug("Rootdir at block=%d, partition=%d\n",
1018                  root->logicalBlockNum, root->partitionReferenceNum);
1019}
1020
1021int udf_compute_nr_groups(struct super_block *sb, u32 partition)
1022{
1023        struct udf_part_map *map = &UDF_SB(sb)->s_partmaps[partition];
1024        return DIV_ROUND_UP(map->s_partition_len +
1025                            (sizeof(struct spaceBitmapDesc) << 3),
1026                            sb->s_blocksize * 8);
1027}
1028
1029static struct udf_bitmap *udf_sb_alloc_bitmap(struct super_block *sb, u32 index)
1030{
1031        struct udf_bitmap *bitmap;
1032        int nr_groups;
1033        int size;
1034
1035        nr_groups = udf_compute_nr_groups(sb, index);
1036        size = sizeof(struct udf_bitmap) +
1037                (sizeof(struct buffer_head *) * nr_groups);
1038
1039        if (size <= PAGE_SIZE)
1040                bitmap = kzalloc(size, GFP_KERNEL);
1041        else
1042                bitmap = vzalloc(size); /* TODO: get rid of vzalloc */
1043
1044        if (bitmap == NULL)
1045                return NULL;
1046
1047        bitmap->s_nr_groups = nr_groups;
1048        return bitmap;
1049}
1050
1051static int udf_fill_partdesc_info(struct super_block *sb,
1052                struct partitionDesc *p, int p_index)
1053{
1054        struct udf_part_map *map;
1055        struct udf_sb_info *sbi = UDF_SB(sb);
1056        struct partitionHeaderDesc *phd;
1057
1058        map = &sbi->s_partmaps[p_index];
1059
1060        map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */
1061        map->s_partition_root = le32_to_cpu(p->partitionStartingLocation);
1062
1063        if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY))
1064                map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY;
1065        if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_WRITE_ONCE))
1066                map->s_partition_flags |= UDF_PART_FLAG_WRITE_ONCE;
1067        if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_REWRITABLE))
1068                map->s_partition_flags |= UDF_PART_FLAG_REWRITABLE;
1069        if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_OVERWRITABLE))
1070                map->s_partition_flags |= UDF_PART_FLAG_OVERWRITABLE;
1071
1072        udf_debug("Partition (%d type %x) starts at physical %d, block length %d\n",
1073                  p_index, map->s_partition_type,
1074                  map->s_partition_root, map->s_partition_len);
1075
1076        if (strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR02) &&
1077            strcmp(p->partitionContents.ident, PD_PARTITION_CONTENTS_NSR03))
1078                return 0;
1079
1080        phd = (struct partitionHeaderDesc *)p->partitionContentsUse;
1081        if (phd->unallocSpaceTable.extLength) {
1082                struct kernel_lb_addr loc = {
1083                        .logicalBlockNum = le32_to_cpu(
1084                                phd->unallocSpaceTable.extPosition),
1085                        .partitionReferenceNum = p_index,
1086                };
1087
1088                map->s_uspace.s_table = udf_iget(sb, &loc);
1089                if (!map->s_uspace.s_table) {
1090                        udf_debug("cannot load unallocSpaceTable (part %d)\n",
1091                                  p_index);
1092                        return -EIO;
1093                }
1094                map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_TABLE;
1095                udf_debug("unallocSpaceTable (part %d) @ %ld\n",
1096                          p_index, map->s_uspace.s_table->i_ino);
1097        }
1098
1099        if (phd->unallocSpaceBitmap.extLength) {
1100                struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
1101                if (!bitmap)
1102                        return -ENOMEM;
1103                map->s_uspace.s_bitmap = bitmap;
1104                bitmap->s_extPosition = le32_to_cpu(
1105                                phd->unallocSpaceBitmap.extPosition);
1106                map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
1107                udf_debug("unallocSpaceBitmap (part %d) @ %d\n",
1108                          p_index, bitmap->s_extPosition);
1109        }
1110
1111        if (phd->partitionIntegrityTable.extLength)
1112                udf_debug("partitionIntegrityTable (part %d)\n", p_index);
1113
1114        if (phd->freedSpaceTable.extLength) {
1115                struct kernel_lb_addr loc = {
1116                        .logicalBlockNum = le32_to_cpu(
1117                                phd->freedSpaceTable.extPosition),
1118                        .partitionReferenceNum = p_index,
1119                };
1120
1121                map->s_fspace.s_table = udf_iget(sb, &loc);
1122                if (!map->s_fspace.s_table) {
1123                        udf_debug("cannot load freedSpaceTable (part %d)\n",
1124                                  p_index);
1125                        return -EIO;
1126                }
1127
1128                map->s_partition_flags |= UDF_PART_FLAG_FREED_TABLE;
1129                udf_debug("freedSpaceTable (part %d) @ %ld\n",
1130                          p_index, map->s_fspace.s_table->i_ino);
1131        }
1132
1133        if (phd->freedSpaceBitmap.extLength) {
1134                struct udf_bitmap *bitmap = udf_sb_alloc_bitmap(sb, p_index);
1135                if (!bitmap)
1136                        return -ENOMEM;
1137                map->s_fspace.s_bitmap = bitmap;
1138                bitmap->s_extPosition = le32_to_cpu(
1139                                phd->freedSpaceBitmap.extPosition);
1140                map->s_partition_flags |= UDF_PART_FLAG_FREED_BITMAP;
1141                udf_debug("freedSpaceBitmap (part %d) @ %d\n",
1142                          p_index, bitmap->s_extPosition);
1143        }
1144        return 0;
1145}
1146
1147static void udf_find_vat_block(struct super_block *sb, int p_index,
1148                               int type1_index, sector_t start_block)
1149{
1150        struct udf_sb_info *sbi = UDF_SB(sb);
1151        struct udf_part_map *map = &sbi->s_partmaps[p_index];
1152        sector_t vat_block;
1153        struct kernel_lb_addr ino;
1154
1155        /*
1156         * VAT file entry is in the last recorded block. Some broken disks have
1157         * it a few blocks before so try a bit harder...
1158         */
1159        ino.partitionReferenceNum = type1_index;
1160        for (vat_block = start_block;
1161             vat_block >= map->s_partition_root &&
1162             vat_block >= start_block - 3 &&
1163             !sbi->s_vat_inode; vat_block--) {
1164                ino.logicalBlockNum = vat_block - map->s_partition_root;
1165                sbi->s_vat_inode = udf_iget(sb, &ino);
1166        }
1167}
1168
1169static int udf_load_vat(struct super_block *sb, int p_index, int type1_index)
1170{
1171        struct udf_sb_info *sbi = UDF_SB(sb);
1172        struct udf_part_map *map = &sbi->s_partmaps[p_index];
1173        struct buffer_head *bh = NULL;
1174        struct udf_inode_info *vati;
1175        uint32_t pos;
1176        struct virtualAllocationTable20 *vat20;
1177        sector_t blocks = sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits;
1178
1179        udf_find_vat_block(sb, p_index, type1_index, sbi->s_last_block);
1180        if (!sbi->s_vat_inode &&
1181            sbi->s_last_block != blocks - 1) {
1182                pr_notice("Failed to read VAT inode from the last recorded block (%lu), retrying with the last block of the device (%lu).\n",
1183                          (unsigned long)sbi->s_last_block,
1184                          (unsigned long)blocks - 1);
1185                udf_find_vat_block(sb, p_index, type1_index, blocks - 1);
1186        }
1187        if (!sbi->s_vat_inode)
1188                return -EIO;
1189
1190        if (map->s_partition_type == UDF_VIRTUAL_MAP15) {
1191                map->s_type_specific.s_virtual.s_start_offset = 0;
1192                map->s_type_specific.s_virtual.s_num_entries =
1193                        (sbi->s_vat_inode->i_size - 36) >> 2;
1194        } else if (map->s_partition_type == UDF_VIRTUAL_MAP20) {
1195                vati = UDF_I(sbi->s_vat_inode);
1196                if (vati->i_alloc_type != ICBTAG_FLAG_AD_IN_ICB) {
1197                        pos = udf_block_map(sbi->s_vat_inode, 0);
1198                        bh = sb_bread(sb, pos);
1199                        if (!bh)
1200                                return -EIO;
1201                        vat20 = (struct virtualAllocationTable20 *)bh->b_data;
1202                } else {
1203                        vat20 = (struct virtualAllocationTable20 *)
1204                                                        vati->i_ext.i_data;
1205                }
1206
1207                map->s_type_specific.s_virtual.s_start_offset =
1208                        le16_to_cpu(vat20->lengthHeader);
1209                map->s_type_specific.s_virtual.s_num_entries =
1210                        (sbi->s_vat_inode->i_size -
1211                                map->s_type_specific.s_virtual.
1212                                        s_start_offset) >> 2;
1213                brelse(bh);
1214        }
1215        return 0;
1216}
1217
1218/*
1219 * Load partition descriptor block
1220 *
1221 * Returns <0 on error, 0 on success, -EAGAIN is special - try next descriptor
1222 * sequence.
1223 */
1224static int udf_load_partdesc(struct super_block *sb, sector_t block)
1225{
1226        struct buffer_head *bh;
1227        struct partitionDesc *p;
1228        struct udf_part_map *map;
1229        struct udf_sb_info *sbi = UDF_SB(sb);
1230        int i, type1_idx;
1231        uint16_t partitionNumber;
1232        uint16_t ident;
1233        int ret;
1234
1235        bh = udf_read_tagged(sb, block, block, &ident);
1236        if (!bh)
1237                return -EAGAIN;
1238        if (ident != TAG_IDENT_PD) {
1239                ret = 0;
1240                goto out_bh;
1241        }
1242
1243        p = (struct partitionDesc *)bh->b_data;
1244        partitionNumber = le16_to_cpu(p->partitionNumber);
1245
1246        /* First scan for TYPE1, SPARABLE and METADATA partitions */
1247        for (i = 0; i < sbi->s_partitions; i++) {
1248                map = &sbi->s_partmaps[i];
1249                udf_debug("Searching map: (%d == %d)\n",
1250                          map->s_partition_num, partitionNumber);
1251                if (map->s_partition_num == partitionNumber &&
1252                    (map->s_partition_type == UDF_TYPE1_MAP15 ||
1253                     map->s_partition_type == UDF_SPARABLE_MAP15))
1254                        break;
1255        }
1256
1257        if (i >= sbi->s_partitions) {
1258                udf_debug("Partition (%d) not found in partition map\n",
1259                          partitionNumber);
1260                ret = 0;
1261                goto out_bh;
1262        }
1263
1264        ret = udf_fill_partdesc_info(sb, p, i);
1265        if (ret < 0)
1266                goto out_bh;
1267
1268        /*
1269         * Now rescan for VIRTUAL or METADATA partitions when SPARABLE and
1270         * PHYSICAL partitions are already set up
1271         */
1272        type1_idx = i;
1273        for (i = 0; i < sbi->s_partitions; i++) {
1274                map = &sbi->s_partmaps[i];
1275
1276                if (map->s_partition_num == partitionNumber &&
1277                    (map->s_partition_type == UDF_VIRTUAL_MAP15 ||
1278                     map->s_partition_type == UDF_VIRTUAL_MAP20 ||
1279                     map->s_partition_type == UDF_METADATA_MAP25))
1280                        break;
1281        }
1282
1283        if (i >= sbi->s_partitions) {
1284                ret = 0;
1285                goto out_bh;
1286        }
1287
1288        ret = udf_fill_partdesc_info(sb, p, i);
1289        if (ret < 0)
1290                goto out_bh;
1291
1292        if (map->s_partition_type == UDF_METADATA_MAP25) {
1293                ret = udf_load_metadata_files(sb, i);
1294                if (ret < 0) {
1295                        udf_err(sb, "error loading MetaData partition map %d\n",
1296                                i);
1297                        goto out_bh;
1298                }
1299        } else {
1300                /*
1301                 * If we have a partition with virtual map, we don't handle
1302                 * writing to it (we overwrite blocks instead of relocating
1303                 * them).
1304                 */
1305                if (!(sb->s_flags & MS_RDONLY)) {
1306                        ret = -EACCES;
1307                        goto out_bh;
1308                }
1309                ret = udf_load_vat(sb, i, type1_idx);
1310                if (ret < 0)
1311                        goto out_bh;
1312        }
1313        ret = 0;
1314out_bh:
1315        /* In case loading failed, we handle cleanup in udf_fill_super */
1316        brelse(bh);
1317        return ret;
1318}
1319
1320static int udf_load_sparable_map(struct super_block *sb,
1321                                 struct udf_part_map *map,
1322                                 struct sparablePartitionMap *spm)
1323{
1324        uint32_t loc;
1325        uint16_t ident;
1326        struct sparingTable *st;
1327        struct udf_sparing_data *sdata = &map->s_type_specific.s_sparing;
1328        int i;
1329        struct buffer_head *bh;
1330
1331        map->s_partition_type = UDF_SPARABLE_MAP15;
1332        sdata->s_packet_len = le16_to_cpu(spm->packetLength);
1333        if (!is_power_of_2(sdata->s_packet_len)) {
1334                udf_err(sb, "error loading logical volume descriptor: "
1335                        "Invalid packet length %u\n",
1336                        (unsigned)sdata->s_packet_len);
1337                return -EIO;
1338        }
1339        if (spm->numSparingTables > 4) {
1340                udf_err(sb, "error loading logical volume descriptor: "
1341                        "Too many sparing tables (%d)\n",
1342                        (int)spm->numSparingTables);
1343                return -EIO;
1344        }
1345
1346        for (i = 0; i < spm->numSparingTables; i++) {
1347                loc = le32_to_cpu(spm->locSparingTable[i]);
1348                bh = udf_read_tagged(sb, loc, loc, &ident);
1349                if (!bh)
1350                        continue;
1351
1352                st = (struct sparingTable *)bh->b_data;
1353                if (ident != 0 ||
1354                    strncmp(st->sparingIdent.ident, UDF_ID_SPARING,
1355                            strlen(UDF_ID_SPARING)) ||
1356                    sizeof(*st) + le16_to_cpu(st->reallocationTableLen) >
1357                                                        sb->s_blocksize) {
1358                        brelse(bh);
1359                        continue;
1360                }
1361
1362                sdata->s_spar_map[i] = bh;
1363        }
1364        map->s_partition_func = udf_get_pblock_spar15;
1365        return 0;
1366}
1367
1368static int udf_load_logicalvol(struct super_block *sb, sector_t block,
1369                               struct kernel_lb_addr *fileset)
1370{
1371        struct logicalVolDesc *lvd;
1372        int i, offset;
1373        uint8_t type;
1374        struct udf_sb_info *sbi = UDF_SB(sb);
1375        struct genericPartitionMap *gpm;
1376        uint16_t ident;
1377        struct buffer_head *bh;
1378        unsigned int table_len;
1379        int ret;
1380
1381        bh = udf_read_tagged(sb, block, block, &ident);
1382        if (!bh)
1383                return -EAGAIN;
1384        BUG_ON(ident != TAG_IDENT_LVD);
1385        lvd = (struct logicalVolDesc *)bh->b_data;
1386        table_len = le32_to_cpu(lvd->mapTableLength);
1387        if (table_len > sb->s_blocksize - sizeof(*lvd)) {
1388                udf_err(sb, "error loading logical volume descriptor: "
1389                        "Partition table too long (%u > %lu)\n", table_len,
1390                        sb->s_blocksize - sizeof(*lvd));
1391                ret = -EIO;
1392                goto out_bh;
1393        }
1394
1395        ret = udf_sb_alloc_partition_maps(sb, le32_to_cpu(lvd->numPartitionMaps));
1396        if (ret)
1397                goto out_bh;
1398
1399        for (i = 0, offset = 0;
1400             i < sbi->s_partitions && offset < table_len;
1401             i++, offset += gpm->partitionMapLength) {
1402                struct udf_part_map *map = &sbi->s_partmaps[i];
1403                gpm = (struct genericPartitionMap *)
1404                                &(lvd->partitionMaps[offset]);
1405                type = gpm->partitionMapType;
1406                if (type == 1) {
1407                        struct genericPartitionMap1 *gpm1 =
1408                                (struct genericPartitionMap1 *)gpm;
1409                        map->s_partition_type = UDF_TYPE1_MAP15;
1410                        map->s_volumeseqnum = le16_to_cpu(gpm1->volSeqNum);
1411                        map->s_partition_num = le16_to_cpu(gpm1->partitionNum);
1412                        map->s_partition_func = NULL;
1413                } else if (type == 2) {
1414                        struct udfPartitionMap2 *upm2 =
1415                                                (struct udfPartitionMap2 *)gpm;
1416                        if (!strncmp(upm2->partIdent.ident, UDF_ID_VIRTUAL,
1417                                                strlen(UDF_ID_VIRTUAL))) {
1418                                u16 suf =
1419                                        le16_to_cpu(((__le16 *)upm2->partIdent.
1420                                                        identSuffix)[0]);
1421                                if (suf < 0x0200) {
1422                                        map->s_partition_type =
1423                                                        UDF_VIRTUAL_MAP15;
1424                                        map->s_partition_func =
1425                                                        udf_get_pblock_virt15;
1426                                } else {
1427                                        map->s_partition_type =
1428                                                        UDF_VIRTUAL_MAP20;
1429                                        map->s_partition_func =
1430                                                        udf_get_pblock_virt20;
1431                                }
1432                        } else if (!strncmp(upm2->partIdent.ident,
1433                                                UDF_ID_SPARABLE,
1434                                                strlen(UDF_ID_SPARABLE))) {
1435                                ret = udf_load_sparable_map(sb, map,
1436                                        (struct sparablePartitionMap *)gpm);
1437                                if (ret < 0)
1438                                        goto out_bh;
1439                        } else if (!strncmp(upm2->partIdent.ident,
1440                                                UDF_ID_METADATA,
1441                                                strlen(UDF_ID_METADATA))) {
1442                                struct udf_meta_data *mdata =
1443                                        &map->s_type_specific.s_metadata;
1444                                struct metadataPartitionMap *mdm =
1445                                                (struct metadataPartitionMap *)
1446                                                &(lvd->partitionMaps[offset]);
1447                                udf_debug("Parsing Logical vol part %d type %d  id=%s\n",
1448                                          i, type, UDF_ID_METADATA);
1449
1450                                map->s_partition_type = UDF_METADATA_MAP25;
1451                                map->s_partition_func = udf_get_pblock_meta25;
1452
1453                                mdata->s_meta_file_loc   =
1454                                        le32_to_cpu(mdm->metadataFileLoc);
1455                                mdata->s_mirror_file_loc =
1456                                        le32_to_cpu(mdm->metadataMirrorFileLoc);
1457                                mdata->s_bitmap_file_loc =
1458                                        le32_to_cpu(mdm->metadataBitmapFileLoc);
1459                                mdata->s_alloc_unit_size =
1460                                        le32_to_cpu(mdm->allocUnitSize);
1461                                mdata->s_align_unit_size =
1462                                        le16_to_cpu(mdm->alignUnitSize);
1463                                if (mdm->flags & 0x01)
1464                                        mdata->s_flags |= MF_DUPLICATE_MD;
1465
1466                                udf_debug("Metadata Ident suffix=0x%x\n",
1467                                          le16_to_cpu(*(__le16 *)
1468                                                      mdm->partIdent.identSuffix));
1469                                udf_debug("Metadata part num=%d\n",
1470                                          le16_to_cpu(mdm->partitionNum));
1471                                udf_debug("Metadata part alloc unit size=%d\n",
1472                                          le32_to_cpu(mdm->allocUnitSize));
1473                                udf_debug("Metadata file loc=%d\n",
1474                                          le32_to_cpu(mdm->metadataFileLoc));
1475                                udf_debug("Mirror file loc=%d\n",
1476                                          le32_to_cpu(mdm->metadataMirrorFileLoc));
1477                                udf_debug("Bitmap file loc=%d\n",
1478                                          le32_to_cpu(mdm->metadataBitmapFileLoc));
1479                                udf_debug("Flags: %d %d\n",
1480                                          mdata->s_flags, mdm->flags);
1481                        } else {
1482                                udf_debug("Unknown ident: %s\n",
1483                                          upm2->partIdent.ident);
1484                                continue;
1485                        }
1486                        map->s_volumeseqnum = le16_to_cpu(upm2->volSeqNum);
1487                        map->s_partition_num = le16_to_cpu(upm2->partitionNum);
1488                }
1489                udf_debug("Partition (%d:%d) type %d on volume %d\n",
1490                          i, map->s_partition_num, type, map->s_volumeseqnum);
1491        }
1492
1493        if (fileset) {
1494                struct long_ad *la = (struct long_ad *)&(lvd->logicalVolContentsUse[0]);
1495
1496                *fileset = lelb_to_cpu(la->extLocation);
1497                udf_debug("FileSet found in LogicalVolDesc at block=%d, partition=%d\n",
1498                          fileset->logicalBlockNum,
1499                          fileset->partitionReferenceNum);
1500        }
1501        if (lvd->integritySeqExt.extLength)
1502                udf_load_logicalvolint(sb, leea_to_cpu(lvd->integritySeqExt));
1503        ret = 0;
1504out_bh:
1505        brelse(bh);
1506        return ret;
1507}
1508
1509/*
1510 * udf_load_logicalvolint
1511 *
1512 */
1513static void udf_load_logicalvolint(struct super_block *sb, struct kernel_extent_ad loc)
1514{
1515        struct buffer_head *bh = NULL;
1516        uint16_t ident;
1517        struct udf_sb_info *sbi = UDF_SB(sb);
1518        struct logicalVolIntegrityDesc *lvid;
1519
1520        while (loc.extLength > 0 &&
1521               (bh = udf_read_tagged(sb, loc.extLocation,
1522                                     loc.extLocation, &ident)) &&
1523               ident == TAG_IDENT_LVID) {
1524                sbi->s_lvid_bh = bh;
1525                lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1526
1527                if (lvid->nextIntegrityExt.extLength)
1528                        udf_load_logicalvolint(sb,
1529                                leea_to_cpu(lvid->nextIntegrityExt));
1530
1531                if (sbi->s_lvid_bh != bh)
1532                        brelse(bh);
1533                loc.extLength -= sb->s_blocksize;
1534                loc.extLocation++;
1535        }
1536        if (sbi->s_lvid_bh != bh)
1537                brelse(bh);
1538}
1539
1540/*
1541 * Process a main/reserve volume descriptor sequence.
1542 *   @block             First block of first extent of the sequence.
1543 *   @lastblock         Lastblock of first extent of the sequence.
1544 *   @fileset           There we store extent containing root fileset
1545 *
1546 * Returns <0 on error, 0 on success. -EAGAIN is special - try next descriptor
1547 * sequence
1548 */
1549static noinline int udf_process_sequence(
1550                struct super_block *sb,
1551                sector_t block, sector_t lastblock,
1552                struct kernel_lb_addr *fileset)
1553{
1554        struct buffer_head *bh = NULL;
1555        struct udf_vds_record vds[VDS_POS_LENGTH];
1556        struct udf_vds_record *curr;
1557        struct generic_desc *gd;
1558        struct volDescPtr *vdp;
1559        int done = 0;
1560        uint32_t vdsn;
1561        uint16_t ident;
1562        long next_s = 0, next_e = 0;
1563        int ret;
1564
1565        memset(vds, 0, sizeof(struct udf_vds_record) * VDS_POS_LENGTH);
1566
1567        /*
1568         * Read the main descriptor sequence and find which descriptors
1569         * are in it.
1570         */
1571        for (; (!done && block <= lastblock); block++) {
1572
1573                bh = udf_read_tagged(sb, block, block, &ident);
1574                if (!bh) {
1575                        udf_err(sb,
1576                                "Block %llu of volume descriptor sequence is corrupted or we could not read it\n",
1577                                (unsigned long long)block);
1578                        return -EAGAIN;
1579                }
1580
1581                /* Process each descriptor (ISO 13346 3/8.3-8.4) */
1582                gd = (struct generic_desc *)bh->b_data;
1583                vdsn = le32_to_cpu(gd->volDescSeqNum);
1584                switch (ident) {
1585                case TAG_IDENT_PVD: /* ISO 13346 3/10.1 */
1586                        curr = &vds[VDS_POS_PRIMARY_VOL_DESC];
1587                        if (vdsn >= curr->volDescSeqNum) {
1588                                curr->volDescSeqNum = vdsn;
1589                                curr->block = block;
1590                        }
1591                        break;
1592                case TAG_IDENT_VDP: /* ISO 13346 3/10.3 */
1593                        curr = &vds[VDS_POS_VOL_DESC_PTR];
1594                        if (vdsn >= curr->volDescSeqNum) {
1595                                curr->volDescSeqNum = vdsn;
1596                                curr->block = block;
1597
1598                                vdp = (struct volDescPtr *)bh->b_data;
1599                                next_s = le32_to_cpu(
1600                                        vdp->nextVolDescSeqExt.extLocation);
1601                                next_e = le32_to_cpu(
1602                                        vdp->nextVolDescSeqExt.extLength);
1603                                next_e = next_e >> sb->s_blocksize_bits;
1604                                next_e += next_s;
1605                        }
1606                        break;
1607                case TAG_IDENT_IUVD: /* ISO 13346 3/10.4 */
1608                        curr = &vds[VDS_POS_IMP_USE_VOL_DESC];
1609                        if (vdsn >= curr->volDescSeqNum) {
1610                                curr->volDescSeqNum = vdsn;
1611                                curr->block = block;
1612                        }
1613                        break;
1614                case TAG_IDENT_PD: /* ISO 13346 3/10.5 */
1615                        curr = &vds[VDS_POS_PARTITION_DESC];
1616                        if (!curr->block)
1617                                curr->block = block;
1618                        break;
1619                case TAG_IDENT_LVD: /* ISO 13346 3/10.6 */
1620                        curr = &vds[VDS_POS_LOGICAL_VOL_DESC];
1621                        if (vdsn >= curr->volDescSeqNum) {
1622                                curr->volDescSeqNum = vdsn;
1623                                curr->block = block;
1624                        }
1625                        break;
1626                case TAG_IDENT_USD: /* ISO 13346 3/10.8 */
1627                        curr = &vds[VDS_POS_UNALLOC_SPACE_DESC];
1628                        if (vdsn >= curr->volDescSeqNum) {
1629                                curr->volDescSeqNum = vdsn;
1630                                curr->block = block;
1631                        }
1632                        break;
1633                case TAG_IDENT_TD: /* ISO 13346 3/10.9 */
1634                        vds[VDS_POS_TERMINATING_DESC].block = block;
1635                        if (next_e) {
1636                                block = next_s;
1637                                lastblock = next_e;
1638                                next_s = next_e = 0;
1639                        } else
1640                                done = 1;
1641                        break;
1642                }
1643                brelse(bh);
1644        }
1645        /*
1646         * Now read interesting descriptors again and process them
1647         * in a suitable order
1648         */
1649        if (!vds[VDS_POS_PRIMARY_VOL_DESC].block) {
1650                udf_err(sb, "Primary Volume Descriptor not found!\n");
1651                return -EAGAIN;
1652        }
1653        ret = udf_load_pvoldesc(sb, vds[VDS_POS_PRIMARY_VOL_DESC].block);
1654        if (ret < 0)
1655                return ret;
1656
1657        if (vds[VDS_POS_LOGICAL_VOL_DESC].block) {
1658                ret = udf_load_logicalvol(sb,
1659                                          vds[VDS_POS_LOGICAL_VOL_DESC].block,
1660                                          fileset);
1661                if (ret < 0)
1662                        return ret;
1663        }
1664
1665        if (vds[VDS_POS_PARTITION_DESC].block) {
1666                /*
1667                 * We rescan the whole descriptor sequence to find
1668                 * partition descriptor blocks and process them.
1669                 */
1670                for (block = vds[VDS_POS_PARTITION_DESC].block;
1671                     block < vds[VDS_POS_TERMINATING_DESC].block;
1672                     block++) {
1673                        ret = udf_load_partdesc(sb, block);
1674                        if (ret < 0)
1675                                return ret;
1676                }
1677        }
1678
1679        return 0;
1680}
1681
1682/*
1683 * Load Volume Descriptor Sequence described by anchor in bh
1684 *
1685 * Returns <0 on error, 0 on success
1686 */
1687static int udf_load_sequence(struct super_block *sb, struct buffer_head *bh,
1688                             struct kernel_lb_addr *fileset)
1689{
1690        struct anchorVolDescPtr *anchor;
1691        sector_t main_s, main_e, reserve_s, reserve_e;
1692        int ret;
1693
1694        anchor = (struct anchorVolDescPtr *)bh->b_data;
1695
1696        /* Locate the main sequence */
1697        main_s = le32_to_cpu(anchor->mainVolDescSeqExt.extLocation);
1698        main_e = le32_to_cpu(anchor->mainVolDescSeqExt.extLength);
1699        main_e = main_e >> sb->s_blocksize_bits;
1700        main_e += main_s;
1701
1702        /* Locate the reserve sequence */
1703        reserve_s = le32_to_cpu(anchor->reserveVolDescSeqExt.extLocation);
1704        reserve_e = le32_to_cpu(anchor->reserveVolDescSeqExt.extLength);
1705        reserve_e = reserve_e >> sb->s_blocksize_bits;
1706        reserve_e += reserve_s;
1707
1708        /* Process the main & reserve sequences */
1709        /* responsible for finding the PartitionDesc(s) */
1710        ret = udf_process_sequence(sb, main_s, main_e, fileset);
1711        if (ret != -EAGAIN)
1712                return ret;
1713        udf_sb_free_partitions(sb);
1714        ret = udf_process_sequence(sb, reserve_s, reserve_e, fileset);
1715        if (ret < 0) {
1716                udf_sb_free_partitions(sb);
1717                /* No sequence was OK, return -EIO */
1718                if (ret == -EAGAIN)
1719                        ret = -EIO;
1720        }
1721        return ret;
1722}
1723
1724/*
1725 * Check whether there is an anchor block in the given block and
1726 * load Volume Descriptor Sequence if so.
1727 *
1728 * Returns <0 on error, 0 on success, -EAGAIN is special - try next anchor
1729 * block
1730 */
1731static int udf_check_anchor_block(struct super_block *sb, sector_t block,
1732                                  struct kernel_lb_addr *fileset)
1733{
1734        struct buffer_head *bh;
1735        uint16_t ident;
1736        int ret;
1737
1738        if (UDF_QUERY_FLAG(sb, UDF_FLAG_VARCONV) &&
1739            udf_fixed_to_variable(block) >=
1740            sb->s_bdev->bd_inode->i_size >> sb->s_blocksize_bits)
1741                return -EAGAIN;
1742
1743        bh = udf_read_tagged(sb, block, block, &ident);
1744        if (!bh)
1745                return -EAGAIN;
1746        if (ident != TAG_IDENT_AVDP) {
1747                brelse(bh);
1748                return -EAGAIN;
1749        }
1750        ret = udf_load_sequence(sb, bh, fileset);
1751        brelse(bh);
1752        return ret;
1753}
1754
1755/*
1756 * Search for an anchor volume descriptor pointer.
1757 *
1758 * Returns < 0 on error, 0 on success. -EAGAIN is special - try next set
1759 * of anchors.
1760 */
1761static int udf_scan_anchors(struct super_block *sb, sector_t *lastblock,
1762                            struct kernel_lb_addr *fileset)
1763{
1764        sector_t last[6];
1765        int i;
1766        struct udf_sb_info *sbi = UDF_SB(sb);
1767        int last_count = 0;
1768        int ret;
1769
1770        /* First try user provided anchor */
1771        if (sbi->s_anchor) {
1772                ret = udf_check_anchor_block(sb, sbi->s_anchor, fileset);
1773                if (ret != -EAGAIN)
1774                        return ret;
1775        }
1776        /*
1777         * according to spec, anchor is in either:
1778         *     block 256
1779         *     lastblock-256
1780         *     lastblock
1781         *  however, if the disc isn't closed, it could be 512.
1782         */
1783        ret = udf_check_anchor_block(sb, sbi->s_session + 256, fileset);
1784        if (ret != -EAGAIN)
1785                return ret;
1786        /*
1787         * The trouble is which block is the last one. Drives often misreport
1788         * this so we try various possibilities.
1789         */
1790        last[last_count++] = *lastblock;
1791        if (*lastblock >= 1)
1792                last[last_count++] = *lastblock - 1;
1793        last[last_count++] = *lastblock + 1;
1794        if (*lastblock >= 2)
1795                last[last_count++] = *lastblock - 2;
1796        if (*lastblock >= 150)
1797                last[last_count++] = *lastblock - 150;
1798        if (*lastblock >= 152)
1799                last[last_count++] = *lastblock - 152;
1800
1801        for (i = 0; i < last_count; i++) {
1802                if (last[i] >= sb->s_bdev->bd_inode->i_size >>
1803                                sb->s_blocksize_bits)
1804                        continue;
1805                ret = udf_check_anchor_block(sb, last[i], fileset);
1806                if (ret != -EAGAIN) {
1807                        if (!ret)
1808                                *lastblock = last[i];
1809                        return ret;
1810                }
1811                if (last[i] < 256)
1812                        continue;
1813                ret = udf_check_anchor_block(sb, last[i] - 256, fileset);
1814                if (ret != -EAGAIN) {
1815                        if (!ret)
1816                                *lastblock = last[i];
1817                        return ret;
1818                }
1819        }
1820
1821        /* Finally try block 512 in case media is open */
1822        return udf_check_anchor_block(sb, sbi->s_session + 512, fileset);
1823}
1824
1825/*
1826 * Find an anchor volume descriptor and load Volume Descriptor Sequence from
1827 * area specified by it. The function expects sbi->s_lastblock to be the last
1828 * block on the media.
1829 *
1830 * Return <0 on error, 0 if anchor found. -EAGAIN is special meaning anchor
1831 * was not found.
1832 */
1833static int udf_find_anchor(struct super_block *sb,
1834                           struct kernel_lb_addr *fileset)
1835{
1836        struct udf_sb_info *sbi = UDF_SB(sb);
1837        sector_t lastblock = sbi->s_last_block;
1838        int ret;
1839
1840        ret = udf_scan_anchors(sb, &lastblock, fileset);
1841        if (ret != -EAGAIN)
1842                goto out;
1843
1844        /* No anchor found? Try VARCONV conversion of block numbers */
1845        UDF_SET_FLAG(sb, UDF_FLAG_VARCONV);
1846        lastblock = udf_variable_to_fixed(sbi->s_last_block);
1847        /* Firstly, we try to not convert number of the last block */
1848        ret = udf_scan_anchors(sb, &lastblock, fileset);
1849        if (ret != -EAGAIN)
1850                goto out;
1851
1852        lastblock = sbi->s_last_block;
1853        /* Secondly, we try with converted number of the last block */
1854        ret = udf_scan_anchors(sb, &lastblock, fileset);
1855        if (ret < 0) {
1856                /* VARCONV didn't help. Clear it. */
1857                UDF_CLEAR_FLAG(sb, UDF_FLAG_VARCONV);
1858        }
1859out:
1860        if (ret == 0)
1861                sbi->s_last_block = lastblock;
1862        return ret;
1863}
1864
1865/*
1866 * Check Volume Structure Descriptor, find Anchor block and load Volume
1867 * Descriptor Sequence.
1868 *
1869 * Returns < 0 on error, 0 on success. -EAGAIN is special meaning anchor
1870 * block was not found.
1871 */
1872static int udf_load_vrs(struct super_block *sb, struct udf_options *uopt,
1873                        int silent, struct kernel_lb_addr *fileset)
1874{
1875        struct udf_sb_info *sbi = UDF_SB(sb);
1876        loff_t nsr_off;
1877        int ret;
1878
1879        if (!sb_set_blocksize(sb, uopt->blocksize)) {
1880                if (!silent)
1881                        udf_warn(sb, "Bad block size\n");
1882                return -EINVAL;
1883        }
1884        sbi->s_last_block = uopt->lastblock;
1885        if (!uopt->novrs) {
1886                /* Check that it is NSR02 compliant */
1887                nsr_off = udf_check_vsd(sb);
1888                if (!nsr_off) {
1889                        if (!silent)
1890                                udf_warn(sb, "No VRS found\n");
1891                        return 0;
1892                }
1893                if (nsr_off == -1)
1894                        udf_debug("Failed to read byte 32768. Assuming open disc. Skipping validity check\n");
1895                if (!sbi->s_last_block)
1896                        sbi->s_last_block = udf_get_last_block(sb);
1897        } else {
1898                udf_debug("Validity check skipped because of novrs option\n");
1899        }
1900
1901        /* Look for anchor block and load Volume Descriptor Sequence */
1902        sbi->s_anchor = uopt->anchor;
1903        ret = udf_find_anchor(sb, fileset);
1904        if (ret < 0) {
1905                if (!silent && ret == -EAGAIN)
1906                        udf_warn(sb, "No anchor found\n");
1907                return ret;
1908        }
1909        return 0;
1910}
1911
1912static void udf_open_lvid(struct super_block *sb)
1913{
1914        struct udf_sb_info *sbi = UDF_SB(sb);
1915        struct buffer_head *bh = sbi->s_lvid_bh;
1916        struct logicalVolIntegrityDesc *lvid;
1917        struct logicalVolIntegrityDescImpUse *lvidiu;
1918
1919        if (!bh)
1920                return;
1921        lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1922        lvidiu = udf_sb_lvidiu(sb);
1923        if (!lvidiu)
1924                return;
1925
1926        mutex_lock(&sbi->s_alloc_mutex);
1927        lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1928        lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1929        udf_time_to_disk_stamp(&lvid->recordingDateAndTime,
1930                                CURRENT_TIME);
1931        lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_OPEN);
1932
1933        lvid->descTag.descCRC = cpu_to_le16(
1934                crc_itu_t(0, (char *)lvid + sizeof(struct tag),
1935                        le16_to_cpu(lvid->descTag.descCRCLength)));
1936
1937        lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
1938        mark_buffer_dirty(bh);
1939        sbi->s_lvid_dirty = 0;
1940        mutex_unlock(&sbi->s_alloc_mutex);
1941        /* Make opening of filesystem visible on the media immediately */
1942        sync_dirty_buffer(bh);
1943}
1944
1945static void udf_close_lvid(struct super_block *sb)
1946{
1947        struct udf_sb_info *sbi = UDF_SB(sb);
1948        struct buffer_head *bh = sbi->s_lvid_bh;
1949        struct logicalVolIntegrityDesc *lvid;
1950        struct logicalVolIntegrityDescImpUse *lvidiu;
1951
1952        if (!bh)
1953                return;
1954        lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
1955        lvidiu = udf_sb_lvidiu(sb);
1956        if (!lvidiu)
1957                return;
1958
1959        mutex_lock(&sbi->s_alloc_mutex);
1960        lvidiu->impIdent.identSuffix[0] = UDF_OS_CLASS_UNIX;
1961        lvidiu->impIdent.identSuffix[1] = UDF_OS_ID_LINUX;
1962        udf_time_to_disk_stamp(&lvid->recordingDateAndTime, CURRENT_TIME);
1963        if (UDF_MAX_WRITE_VERSION > le16_to_cpu(lvidiu->maxUDFWriteRev))
1964                lvidiu->maxUDFWriteRev = cpu_to_le16(UDF_MAX_WRITE_VERSION);
1965        if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFReadRev))
1966                lvidiu->minUDFReadRev = cpu_to_le16(sbi->s_udfrev);
1967        if (sbi->s_udfrev > le16_to_cpu(lvidiu->minUDFWriteRev))
1968                lvidiu->minUDFWriteRev = cpu_to_le16(sbi->s_udfrev);
1969        lvid->integrityType = cpu_to_le32(LVID_INTEGRITY_TYPE_CLOSE);
1970
1971        lvid->descTag.descCRC = cpu_to_le16(
1972                        crc_itu_t(0, (char *)lvid + sizeof(struct tag),
1973                                le16_to_cpu(lvid->descTag.descCRCLength)));
1974
1975        lvid->descTag.tagChecksum = udf_tag_checksum(&lvid->descTag);
1976        /*
1977         * We set buffer uptodate unconditionally here to avoid spurious
1978         * warnings from mark_buffer_dirty() when previous EIO has marked
1979         * the buffer as !uptodate
1980         */
1981        set_buffer_uptodate(bh);
1982        mark_buffer_dirty(bh);
1983        sbi->s_lvid_dirty = 0;
1984        mutex_unlock(&sbi->s_alloc_mutex);
1985        /* Make closing of filesystem visible on the media immediately */
1986        sync_dirty_buffer(bh);
1987}
1988
1989u64 lvid_get_unique_id(struct super_block *sb)
1990{
1991        struct buffer_head *bh;
1992        struct udf_sb_info *sbi = UDF_SB(sb);
1993        struct logicalVolIntegrityDesc *lvid;
1994        struct logicalVolHeaderDesc *lvhd;
1995        u64 uniqueID;
1996        u64 ret;
1997
1998        bh = sbi->s_lvid_bh;
1999        if (!bh)
2000                return 0;
2001
2002        lvid = (struct logicalVolIntegrityDesc *)bh->b_data;
2003        lvhd = (struct logicalVolHeaderDesc *)lvid->logicalVolContentsUse;
2004
2005        mutex_lock(&sbi->s_alloc_mutex);
2006        ret = uniqueID = le64_to_cpu(lvhd->uniqueID);
2007        if (!(++uniqueID & 0xFFFFFFFF))
2008                uniqueID += 16;
2009        lvhd->uniqueID = cpu_to_le64(uniqueID);
2010        mutex_unlock(&sbi->s_alloc_mutex);
2011        mark_buffer_dirty(bh);
2012
2013        return ret;
2014}
2015
2016static int udf_fill_super(struct super_block *sb, void *options, int silent)
2017{
2018        int ret = -EINVAL;
2019        struct inode *inode = NULL;
2020        struct udf_options uopt;
2021        struct kernel_lb_addr rootdir, fileset;
2022        struct udf_sb_info *sbi;
2023
2024        uopt.flags = (1 << UDF_FLAG_USE_AD_IN_ICB) | (1 << UDF_FLAG_STRICT);
2025        uopt.uid = INVALID_UID;
2026        uopt.gid = INVALID_GID;
2027        uopt.umask = 0;
2028        uopt.fmode = UDF_INVALID_MODE;
2029        uopt.dmode = UDF_INVALID_MODE;
2030
2031        sbi = kzalloc(sizeof(struct udf_sb_info), GFP_KERNEL);
2032        if (!sbi)
2033                return -ENOMEM;
2034
2035        sb->s_fs_info = sbi;
2036
2037        mutex_init(&sbi->s_alloc_mutex);
2038
2039        if (!udf_parse_options((char *)options, &uopt, false))
2040                goto error_out;
2041
2042        if (uopt.flags & (1 << UDF_FLAG_UTF8) &&
2043            uopt.flags & (1 << UDF_FLAG_NLS_MAP)) {
2044                udf_err(sb, "utf8 cannot be combined with iocharset\n");
2045                goto error_out;
2046        }
2047#ifdef CONFIG_UDF_NLS
2048        if ((uopt.flags & (1 << UDF_FLAG_NLS_MAP)) && !uopt.nls_map) {
2049                uopt.nls_map = load_nls_default();
2050                if (!uopt.nls_map)
2051                        uopt.flags &= ~(1 << UDF_FLAG_NLS_MAP);
2052                else
2053                        udf_debug("Using default NLS map\n");
2054        }
2055#endif
2056        if (!(uopt.flags & (1 << UDF_FLAG_NLS_MAP)))
2057                uopt.flags |= (1 << UDF_FLAG_UTF8);
2058
2059        fileset.logicalBlockNum = 0xFFFFFFFF;
2060        fileset.partitionReferenceNum = 0xFFFF;
2061
2062        sbi->s_flags = uopt.flags;
2063        sbi->s_uid = uopt.uid;
2064        sbi->s_gid = uopt.gid;
2065        sbi->s_umask = uopt.umask;
2066        sbi->s_fmode = uopt.fmode;
2067        sbi->s_dmode = uopt.dmode;
2068        sbi->s_nls_map = uopt.nls_map;
2069        rwlock_init(&sbi->s_cred_lock);
2070
2071        if (uopt.session == 0xFFFFFFFF)
2072                sbi->s_session = udf_get_last_session(sb);
2073        else
2074                sbi->s_session = uopt.session;
2075
2076        udf_debug("Multi-session=%d\n", sbi->s_session);
2077
2078        /* Fill in the rest of the superblock */
2079        sb->s_op = &udf_sb_ops;
2080        sb->s_export_op = &udf_export_ops;
2081
2082        sb->s_magic = UDF_SUPER_MAGIC;
2083        sb->s_time_gran = 1000;
2084
2085        if (uopt.flags & (1 << UDF_FLAG_BLOCKSIZE_SET)) {
2086                ret = udf_load_vrs(sb, &uopt, silent, &fileset);
2087        } else {
2088                uopt.blocksize = bdev_logical_block_size(sb->s_bdev);
2089                ret = udf_load_vrs(sb, &uopt, silent, &fileset);
2090                if (ret == -EAGAIN && uopt.blocksize != UDF_DEFAULT_BLOCKSIZE) {
2091                        if (!silent)
2092                                pr_notice("Rescanning with blocksize %d\n",
2093                                          UDF_DEFAULT_BLOCKSIZE);
2094                        brelse(sbi->s_lvid_bh);
2095                        sbi->s_lvid_bh = NULL;
2096                        uopt.blocksize = UDF_DEFAULT_BLOCKSIZE;
2097                        ret = udf_load_vrs(sb, &uopt, silent, &fileset);
2098                }
2099        }
2100        if (ret < 0) {
2101                if (ret == -EAGAIN) {
2102                        udf_warn(sb, "No partition found (1)\n");
2103                        ret = -EINVAL;
2104                }
2105                goto error_out;
2106        }
2107
2108        udf_debug("Lastblock=%d\n", sbi->s_last_block);
2109
2110        if (sbi->s_lvid_bh) {
2111                struct logicalVolIntegrityDescImpUse *lvidiu =
2112                                                        udf_sb_lvidiu(sb);
2113                uint16_t minUDFReadRev;
2114                uint16_t minUDFWriteRev;
2115
2116                if (!lvidiu) {
2117                        ret = -EINVAL;
2118                        goto error_out;
2119                }
2120                minUDFReadRev = le16_to_cpu(lvidiu->minUDFReadRev);
2121                minUDFWriteRev = le16_to_cpu(lvidiu->minUDFWriteRev);
2122                if (minUDFReadRev > UDF_MAX_READ_VERSION) {
2123                        udf_err(sb, "minUDFReadRev=%x (max is %x)\n",
2124                                minUDFReadRev,
2125                                UDF_MAX_READ_VERSION);
2126                        ret = -EINVAL;
2127                        goto error_out;
2128                } else if (minUDFWriteRev > UDF_MAX_WRITE_VERSION &&
2129                           !(sb->s_flags & MS_RDONLY)) {
2130                        ret = -EACCES;
2131                        goto error_out;
2132                }
2133
2134                sbi->s_udfrev = minUDFWriteRev;
2135
2136                if (minUDFReadRev >= UDF_VERS_USE_EXTENDED_FE)
2137                        UDF_SET_FLAG(sb, UDF_FLAG_USE_EXTENDED_FE);
2138                if (minUDFReadRev >= UDF_VERS_USE_STREAMS)
2139                        UDF_SET_FLAG(sb, UDF_FLAG_USE_STREAMS);
2140        }
2141
2142        if (!sbi->s_partitions) {
2143                udf_warn(sb, "No partition found (2)\n");
2144                ret = -EINVAL;
2145                goto error_out;
2146        }
2147
2148        if (sbi->s_partmaps[sbi->s_partition].s_partition_flags &
2149                        UDF_PART_FLAG_READ_ONLY &&
2150            !(sb->s_flags & MS_RDONLY)) {
2151                ret = -EACCES;
2152                goto error_out;
2153        }
2154
2155        if (udf_find_fileset(sb, &fileset, &rootdir)) {
2156                udf_warn(sb, "No fileset found\n");
2157                ret = -EINVAL;
2158                goto error_out;
2159        }
2160
2161        if (!silent) {
2162                struct timestamp ts;
2163                udf_time_to_disk_stamp(&ts, sbi->s_record_time);
2164                udf_info("Mounting volume '%s', timestamp %04u/%02u/%02u %02u:%02u (%x)\n",
2165                         sbi->s_volume_ident,
2166                         le16_to_cpu(ts.year), ts.month, ts.day,
2167                         ts.hour, ts.minute, le16_to_cpu(ts.typeAndTimezone));
2168        }
2169        if (!(sb->s_flags & MS_RDONLY))
2170                udf_open_lvid(sb);
2171
2172        /* Assign the root inode */
2173        /* assign inodes by physical block number */
2174        /* perhaps it's not extensible enough, but for now ... */
2175        inode = udf_iget(sb, &rootdir);
2176        if (!inode) {
2177                udf_err(sb, "Error in udf_iget, block=%d, partition=%d\n",
2178                       rootdir.logicalBlockNum, rootdir.partitionReferenceNum);
2179                ret = -EIO;
2180                goto error_out;
2181        }
2182
2183        /* Allocate a dentry for the root inode */
2184        sb->s_root = d_make_root(inode);
2185        if (!sb->s_root) {
2186                udf_err(sb, "Couldn't allocate root dentry\n");
2187                ret = -ENOMEM;
2188                goto error_out;
2189        }
2190        sb->s_maxbytes = MAX_LFS_FILESIZE;
2191        sb->s_max_links = UDF_MAX_LINKS;
2192        return 0;
2193
2194error_out:
2195        if (sbi->s_vat_inode)
2196                iput(sbi->s_vat_inode);
2197#ifdef CONFIG_UDF_NLS
2198        if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
2199                unload_nls(sbi->s_nls_map);
2200#endif
2201        if (!(sb->s_flags & MS_RDONLY))
2202                udf_close_lvid(sb);
2203        brelse(sbi->s_lvid_bh);
2204        udf_sb_free_partitions(sb);
2205        kfree(sbi);
2206        sb->s_fs_info = NULL;
2207
2208        return ret;
2209}
2210
2211void _udf_err(struct super_block *sb, const char *function,
2212              const char *fmt, ...)
2213{
2214        struct va_format vaf;
2215        va_list args;
2216
2217        va_start(args, fmt);
2218
2219        vaf.fmt = fmt;
2220        vaf.va = &args;
2221
2222        pr_err("error (device %s): %s: %pV", sb->s_id, function, &vaf);
2223
2224        va_end(args);
2225}
2226
2227void _udf_warn(struct super_block *sb, const char *function,
2228               const char *fmt, ...)
2229{
2230        struct va_format vaf;
2231        va_list args;
2232
2233        va_start(args, fmt);
2234
2235        vaf.fmt = fmt;
2236        vaf.va = &args;
2237
2238        pr_warn("warning (device %s): %s: %pV", sb->s_id, function, &vaf);
2239
2240        va_end(args);
2241}
2242
2243static void udf_put_super(struct super_block *sb)
2244{
2245        struct udf_sb_info *sbi;
2246
2247        sbi = UDF_SB(sb);
2248
2249        if (sbi->s_vat_inode)
2250                iput(sbi->s_vat_inode);
2251#ifdef CONFIG_UDF_NLS
2252        if (UDF_QUERY_FLAG(sb, UDF_FLAG_NLS_MAP))
2253                unload_nls(sbi->s_nls_map);
2254#endif
2255        if (!(sb->s_flags & MS_RDONLY))
2256                udf_close_lvid(sb);
2257        brelse(sbi->s_lvid_bh);
2258        udf_sb_free_partitions(sb);
2259        kfree(sb->s_fs_info);
2260        sb->s_fs_info = NULL;
2261}
2262
2263static int udf_sync_fs(struct super_block *sb, int wait)
2264{
2265        struct udf_sb_info *sbi = UDF_SB(sb);
2266
2267        mutex_lock(&sbi->s_alloc_mutex);
2268        if (sbi->s_lvid_dirty) {
2269                /*
2270                 * Blockdevice will be synced later so we don't have to submit
2271                 * the buffer for IO
2272                 */
2273                mark_buffer_dirty(sbi->s_lvid_bh);
2274                sbi->s_lvid_dirty = 0;
2275        }
2276        mutex_unlock(&sbi->s_alloc_mutex);
2277
2278        return 0;
2279}
2280
2281static int udf_statfs(struct dentry *dentry, struct kstatfs *buf)
2282{
2283        struct super_block *sb = dentry->d_sb;
2284        struct udf_sb_info *sbi = UDF_SB(sb);
2285        struct logicalVolIntegrityDescImpUse *lvidiu;
2286        u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
2287
2288        lvidiu = udf_sb_lvidiu(sb);
2289        buf->f_type = UDF_SUPER_MAGIC;
2290        buf->f_bsize = sb->s_blocksize;
2291        buf->f_blocks = sbi->s_partmaps[sbi->s_partition].s_partition_len;
2292        buf->f_bfree = udf_count_free(sb);
2293        buf->f_bavail = buf->f_bfree;
2294        buf->f_files = (lvidiu != NULL ? (le32_to_cpu(lvidiu->numFiles) +
2295                                          le32_to_cpu(lvidiu->numDirs)) : 0)
2296                        + buf->f_bfree;
2297        buf->f_ffree = buf->f_bfree;
2298        buf->f_namelen = UDF_NAME_LEN - 2;
2299        buf->f_fsid.val[0] = (u32)id;
2300        buf->f_fsid.val[1] = (u32)(id >> 32);
2301
2302        return 0;
2303}
2304
2305static unsigned int udf_count_free_bitmap(struct super_block *sb,
2306                                          struct udf_bitmap *bitmap)
2307{
2308        struct buffer_head *bh = NULL;
2309        unsigned int accum = 0;
2310        int index;
2311        int block = 0, newblock;
2312        struct kernel_lb_addr loc;
2313        uint32_t bytes;
2314        uint8_t *ptr;
2315        uint16_t ident;
2316        struct spaceBitmapDesc *bm;
2317
2318        loc.logicalBlockNum = bitmap->s_extPosition;
2319        loc.partitionReferenceNum = UDF_SB(sb)->s_partition;
2320        bh = udf_read_ptagged(sb, &loc, 0, &ident);
2321
2322        if (!bh) {
2323                udf_err(sb, "udf_count_free failed\n");
2324                goto out;
2325        } else if (ident != TAG_IDENT_SBD) {
2326                brelse(bh);
2327                udf_err(sb, "udf_count_free failed\n");
2328                goto out;
2329        }
2330
2331        bm = (struct spaceBitmapDesc *)bh->b_data;
2332        bytes = le32_to_cpu(bm->numOfBytes);
2333        index = sizeof(struct spaceBitmapDesc); /* offset in first block only */
2334        ptr = (uint8_t *)bh->b_data;
2335
2336        while (bytes > 0) {
2337                u32 cur_bytes = min_t(u32, bytes, sb->s_blocksize - index);
2338                accum += bitmap_weight((const unsigned long *)(ptr + index),
2339                                        cur_bytes * 8);
2340                bytes -= cur_bytes;
2341                if (bytes) {
2342                        brelse(bh);
2343                        newblock = udf_get_lb_pblock(sb, &loc, ++block);
2344                        bh = udf_tread(sb, newblock);
2345                        if (!bh) {
2346                                udf_debug("read failed\n");
2347                                goto out;
2348                        }
2349                        index = 0;
2350                        ptr = (uint8_t *)bh->b_data;
2351                }
2352        }
2353        brelse(bh);
2354out:
2355        return accum;
2356}
2357
2358static unsigned int udf_count_free_table(struct super_block *sb,
2359                                         struct inode *table)
2360{
2361        unsigned int accum = 0;
2362        uint32_t elen;
2363        struct kernel_lb_addr eloc;
2364        int8_t etype;
2365        struct extent_position epos;
2366
2367        mutex_lock(&UDF_SB(sb)->s_alloc_mutex);
2368        epos.block = UDF_I(table)->i_location;
2369        epos.offset = sizeof(struct unallocSpaceEntry);
2370        epos.bh = NULL;
2371
2372        while ((etype = udf_next_aext(table, &epos, &eloc, &elen, 1)) != -1)
2373                accum += (elen >> table->i_sb->s_blocksize_bits);
2374
2375        brelse(epos.bh);
2376        mutex_unlock(&UDF_SB(sb)->s_alloc_mutex);
2377
2378        return accum;
2379}
2380
2381static unsigned int udf_count_free(struct super_block *sb)
2382{
2383        unsigned int accum = 0;
2384        struct udf_sb_info *sbi;
2385        struct udf_part_map *map;
2386
2387        sbi = UDF_SB(sb);
2388        if (sbi->s_lvid_bh) {
2389                struct logicalVolIntegrityDesc *lvid =
2390                        (struct logicalVolIntegrityDesc *)
2391                        sbi->s_lvid_bh->b_data;
2392                if (le32_to_cpu(lvid->numOfPartitions) > sbi->s_partition) {
2393                        accum = le32_to_cpu(
2394                                        lvid->freeSpaceTable[sbi->s_partition]);
2395                        if (accum == 0xFFFFFFFF)
2396                                accum = 0;
2397                }
2398        }
2399
2400        if (accum)
2401                return accum;
2402
2403        map = &sbi->s_partmaps[sbi->s_partition];
2404        if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_BITMAP) {
2405                accum += udf_count_free_bitmap(sb,
2406                                               map->s_uspace.s_bitmap);
2407        }
2408        if (map->s_partition_flags & UDF_PART_FLAG_FREED_BITMAP) {
2409                accum += udf_count_free_bitmap(sb,
2410                                               map->s_fspace.s_bitmap);
2411        }
2412        if (accum)
2413                return accum;
2414
2415        if (map->s_partition_flags & UDF_PART_FLAG_UNALLOC_TABLE) {
2416                accum += udf_count_free_table(sb,
2417                                              map->s_uspace.s_table);
2418        }
2419        if (map->s_partition_flags & UDF_PART_FLAG_FREED_TABLE) {
2420                accum += udf_count_free_table(sb,
2421                                              map->s_fspace.s_table);
2422        }
2423
2424        return accum;
2425}
2426