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