linux/fs/isofs/inode.c
<<
>>
Prefs
   1/*
   2 *  linux/fs/isofs/inode.c
   3 *
   4 *  (C) 1991  Linus Torvalds - minix filesystem
   5 *      1992, 1993, 1994  Eric Youngdale Modified for ISO 9660 filesystem.
   6 *      1994  Eberhard Mönkeberg - multi session handling.
   7 *      1995  Mark Dobie - allow mounting of some weird VideoCDs and PhotoCDs.
   8 *      1997  Gordon Chaffee - Joliet CDs
   9 *      1998  Eric Lammerts - ISO 9660 Level 3
  10 *      2004  Paul Serice - Inode Support pushed out from 4GB to 128GB
  11 *      2004  Paul Serice - NFS Export Operations
  12 */
  13
  14#include <linux/init.h>
  15#include <linux/module.h>
  16
  17#include <linux/slab.h>
  18#include <linux/nls.h>
  19#include <linux/ctype.h>
  20#include <linux/smp_lock.h>
  21#include <linux/statfs.h>
  22#include <linux/cdrom.h>
  23#include <linux/parser.h>
  24
  25#include "isofs.h"
  26#include "zisofs.h"
  27
  28#define BEQUIET
  29
  30static int isofs_hashi(struct dentry *parent, struct qstr *qstr);
  31static int isofs_hash(struct dentry *parent, struct qstr *qstr);
  32static int isofs_dentry_cmpi(struct dentry *dentry, struct qstr *a, struct qstr *b);
  33static int isofs_dentry_cmp(struct dentry *dentry, struct qstr *a, struct qstr *b);
  34
  35#ifdef CONFIG_JOLIET
  36static int isofs_hashi_ms(struct dentry *parent, struct qstr *qstr);
  37static int isofs_hash_ms(struct dentry *parent, struct qstr *qstr);
  38static int isofs_dentry_cmpi_ms(struct dentry *dentry, struct qstr *a, struct qstr *b);
  39static int isofs_dentry_cmp_ms(struct dentry *dentry, struct qstr *a, struct qstr *b);
  40#endif
  41
  42static void isofs_put_super(struct super_block *sb)
  43{
  44        struct isofs_sb_info *sbi = ISOFS_SB(sb);
  45#ifdef CONFIG_JOLIET
  46        if (sbi->s_nls_iocharset) {
  47                unload_nls(sbi->s_nls_iocharset);
  48                sbi->s_nls_iocharset = NULL;
  49        }
  50#endif
  51
  52        kfree(sbi);
  53        sb->s_fs_info = NULL;
  54        return;
  55}
  56
  57static int isofs_read_inode(struct inode *);
  58static int isofs_statfs (struct dentry *, struct kstatfs *);
  59
  60static struct kmem_cache *isofs_inode_cachep;
  61
  62static struct inode *isofs_alloc_inode(struct super_block *sb)
  63{
  64        struct iso_inode_info *ei;
  65        ei = kmem_cache_alloc(isofs_inode_cachep, GFP_KERNEL);
  66        if (!ei)
  67                return NULL;
  68        return &ei->vfs_inode;
  69}
  70
  71static void isofs_destroy_inode(struct inode *inode)
  72{
  73        kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
  74}
  75
  76static void init_once(void *foo)
  77{
  78        struct iso_inode_info *ei = foo;
  79
  80        inode_init_once(&ei->vfs_inode);
  81}
  82
  83static int init_inodecache(void)
  84{
  85        isofs_inode_cachep = kmem_cache_create("isofs_inode_cache",
  86                                        sizeof(struct iso_inode_info),
  87                                        0, (SLAB_RECLAIM_ACCOUNT|
  88                                        SLAB_MEM_SPREAD),
  89                                        init_once);
  90        if (isofs_inode_cachep == NULL)
  91                return -ENOMEM;
  92        return 0;
  93}
  94
  95static void destroy_inodecache(void)
  96{
  97        kmem_cache_destroy(isofs_inode_cachep);
  98}
  99
 100static int isofs_remount(struct super_block *sb, int *flags, char *data)
 101{
 102        /* we probably want a lot more here */
 103        *flags |= MS_RDONLY;
 104        return 0;
 105}
 106
 107static const struct super_operations isofs_sops = {
 108        .alloc_inode    = isofs_alloc_inode,
 109        .destroy_inode  = isofs_destroy_inode,
 110        .put_super      = isofs_put_super,
 111        .statfs         = isofs_statfs,
 112        .remount_fs     = isofs_remount,
 113        .show_options   = generic_show_options,
 114};
 115
 116
 117static struct dentry_operations isofs_dentry_ops[] = {
 118        {
 119                .d_hash         = isofs_hash,
 120                .d_compare      = isofs_dentry_cmp,
 121        },
 122        {
 123                .d_hash         = isofs_hashi,
 124                .d_compare      = isofs_dentry_cmpi,
 125        },
 126#ifdef CONFIG_JOLIET
 127        {
 128                .d_hash         = isofs_hash_ms,
 129                .d_compare      = isofs_dentry_cmp_ms,
 130        },
 131        {
 132                .d_hash         = isofs_hashi_ms,
 133                .d_compare      = isofs_dentry_cmpi_ms,
 134        },
 135#endif
 136};
 137
 138struct iso9660_options{
 139        char map;
 140        char rock;
 141        char joliet;
 142        char cruft;
 143        char hide;
 144        char showassoc;
 145        char nocompress;
 146        unsigned char check;
 147        unsigned int blocksize;
 148        mode_t fmode;
 149        mode_t dmode;
 150        gid_t gid;
 151        uid_t uid;
 152        char *iocharset;
 153        unsigned char utf8;
 154        /* LVE */
 155        s32 session;
 156        s32 sbsector;
 157};
 158
 159/*
 160 * Compute the hash for the isofs name corresponding to the dentry.
 161 */
 162static int
 163isofs_hash_common(struct dentry *dentry, struct qstr *qstr, int ms)
 164{
 165        const char *name;
 166        int len;
 167
 168        len = qstr->len;
 169        name = qstr->name;
 170        if (ms) {
 171                while (len && name[len-1] == '.')
 172                        len--;
 173        }
 174
 175        qstr->hash = full_name_hash(name, len);
 176
 177        return 0;
 178}
 179
 180/*
 181 * Compute the hash for the isofs name corresponding to the dentry.
 182 */
 183static int
 184isofs_hashi_common(struct dentry *dentry, struct qstr *qstr, int ms)
 185{
 186        const char *name;
 187        int len;
 188        char c;
 189        unsigned long hash;
 190
 191        len = qstr->len;
 192        name = qstr->name;
 193        if (ms) {
 194                while (len && name[len-1] == '.')
 195                        len--;
 196        }
 197
 198        hash = init_name_hash();
 199        while (len--) {
 200                c = tolower(*name++);
 201                hash = partial_name_hash(c, hash);
 202        }
 203        qstr->hash = end_name_hash(hash);
 204
 205        return 0;
 206}
 207
 208/*
 209 * Case insensitive compare of two isofs names.
 210 */
 211static int isofs_dentry_cmpi_common(struct dentry *dentry, struct qstr *a,
 212                                struct qstr *b, int ms)
 213{
 214        int alen, blen;
 215
 216        /* A filename cannot end in '.' or we treat it like it has none */
 217        alen = a->len;
 218        blen = b->len;
 219        if (ms) {
 220                while (alen && a->name[alen-1] == '.')
 221                        alen--;
 222                while (blen && b->name[blen-1] == '.')
 223                        blen--;
 224        }
 225        if (alen == blen) {
 226                if (strnicmp(a->name, b->name, alen) == 0)
 227                        return 0;
 228        }
 229        return 1;
 230}
 231
 232/*
 233 * Case sensitive compare of two isofs names.
 234 */
 235static int isofs_dentry_cmp_common(struct dentry *dentry, struct qstr *a,
 236                                        struct qstr *b, int ms)
 237{
 238        int alen, blen;
 239
 240        /* A filename cannot end in '.' or we treat it like it has none */
 241        alen = a->len;
 242        blen = b->len;
 243        if (ms) {
 244                while (alen && a->name[alen-1] == '.')
 245                        alen--;
 246                while (blen && b->name[blen-1] == '.')
 247                        blen--;
 248        }
 249        if (alen == blen) {
 250                if (strncmp(a->name, b->name, alen) == 0)
 251                        return 0;
 252        }
 253        return 1;
 254}
 255
 256static int
 257isofs_hash(struct dentry *dentry, struct qstr *qstr)
 258{
 259        return isofs_hash_common(dentry, qstr, 0);
 260}
 261
 262static int
 263isofs_hashi(struct dentry *dentry, struct qstr *qstr)
 264{
 265        return isofs_hashi_common(dentry, qstr, 0);
 266}
 267
 268static int
 269isofs_dentry_cmp(struct dentry *dentry,struct qstr *a,struct qstr *b)
 270{
 271        return isofs_dentry_cmp_common(dentry, a, b, 0);
 272}
 273
 274static int
 275isofs_dentry_cmpi(struct dentry *dentry,struct qstr *a,struct qstr *b)
 276{
 277        return isofs_dentry_cmpi_common(dentry, a, b, 0);
 278}
 279
 280#ifdef CONFIG_JOLIET
 281static int
 282isofs_hash_ms(struct dentry *dentry, struct qstr *qstr)
 283{
 284        return isofs_hash_common(dentry, qstr, 1);
 285}
 286
 287static int
 288isofs_hashi_ms(struct dentry *dentry, struct qstr *qstr)
 289{
 290        return isofs_hashi_common(dentry, qstr, 1);
 291}
 292
 293static int
 294isofs_dentry_cmp_ms(struct dentry *dentry,struct qstr *a,struct qstr *b)
 295{
 296        return isofs_dentry_cmp_common(dentry, a, b, 1);
 297}
 298
 299static int
 300isofs_dentry_cmpi_ms(struct dentry *dentry,struct qstr *a,struct qstr *b)
 301{
 302        return isofs_dentry_cmpi_common(dentry, a, b, 1);
 303}
 304#endif
 305
 306enum {
 307        Opt_block, Opt_check_r, Opt_check_s, Opt_cruft, Opt_gid, Opt_ignore,
 308        Opt_iocharset, Opt_map_a, Opt_map_n, Opt_map_o, Opt_mode, Opt_nojoliet,
 309        Opt_norock, Opt_sb, Opt_session, Opt_uid, Opt_unhide, Opt_utf8, Opt_err,
 310        Opt_nocompress, Opt_hide, Opt_showassoc, Opt_dmode,
 311};
 312
 313static const match_table_t tokens = {
 314        {Opt_norock, "norock"},
 315        {Opt_nojoliet, "nojoliet"},
 316        {Opt_unhide, "unhide"},
 317        {Opt_hide, "hide"},
 318        {Opt_showassoc, "showassoc"},
 319        {Opt_cruft, "cruft"},
 320        {Opt_utf8, "utf8"},
 321        {Opt_iocharset, "iocharset=%s"},
 322        {Opt_map_a, "map=acorn"},
 323        {Opt_map_a, "map=a"},
 324        {Opt_map_n, "map=normal"},
 325        {Opt_map_n, "map=n"},
 326        {Opt_map_o, "map=off"},
 327        {Opt_map_o, "map=o"},
 328        {Opt_session, "session=%u"},
 329        {Opt_sb, "sbsector=%u"},
 330        {Opt_check_r, "check=relaxed"},
 331        {Opt_check_r, "check=r"},
 332        {Opt_check_s, "check=strict"},
 333        {Opt_check_s, "check=s"},
 334        {Opt_uid, "uid=%u"},
 335        {Opt_gid, "gid=%u"},
 336        {Opt_mode, "mode=%u"},
 337        {Opt_dmode, "dmode=%u"},
 338        {Opt_block, "block=%u"},
 339        {Opt_ignore, "conv=binary"},
 340        {Opt_ignore, "conv=b"},
 341        {Opt_ignore, "conv=text"},
 342        {Opt_ignore, "conv=t"},
 343        {Opt_ignore, "conv=mtext"},
 344        {Opt_ignore, "conv=m"},
 345        {Opt_ignore, "conv=auto"},
 346        {Opt_ignore, "conv=a"},
 347        {Opt_nocompress, "nocompress"},
 348        {Opt_err, NULL}
 349};
 350
 351static int parse_options(char *options, struct iso9660_options *popt)
 352{
 353        char *p;
 354        int option;
 355
 356        popt->map = 'n';
 357        popt->rock = 'y';
 358        popt->joliet = 'y';
 359        popt->cruft = 'n';
 360        popt->hide = 'n';
 361        popt->showassoc = 'n';
 362        popt->check = 'u';              /* unset */
 363        popt->nocompress = 0;
 364        popt->blocksize = 1024;
 365        popt->fmode = popt->dmode = S_IRUGO | S_IXUGO; /*
 366                                         * r-x for all.  The disc could
 367                                         * be shared with DOS machines so
 368                                         * virtually anything could be
 369                                         * a valid executable.
 370                                         */
 371        popt->gid = 0;
 372        popt->uid = 0;
 373        popt->iocharset = NULL;
 374        popt->utf8 = 0;
 375        popt->session=-1;
 376        popt->sbsector=-1;
 377        if (!options)
 378                return 1;
 379
 380        while ((p = strsep(&options, ",")) != NULL) {
 381                int token;
 382                substring_t args[MAX_OPT_ARGS];
 383                unsigned n;
 384
 385                if (!*p)
 386                        continue;
 387
 388                token = match_token(p, tokens, args);
 389                switch (token) {
 390                case Opt_norock:
 391                        popt->rock = 'n';
 392                        break;
 393                case Opt_nojoliet:
 394                        popt->joliet = 'n';
 395                        break;
 396                case Opt_hide:
 397                        popt->hide = 'y';
 398                        break;
 399                case Opt_unhide:
 400                case Opt_showassoc:
 401                        popt->showassoc = 'y';
 402                        break;
 403                case Opt_cruft:
 404                        popt->cruft = 'y';
 405                        break;
 406                case Opt_utf8:
 407                        popt->utf8 = 1;
 408                        break;
 409#ifdef CONFIG_JOLIET
 410                case Opt_iocharset:
 411                        popt->iocharset = match_strdup(&args[0]);
 412                        break;
 413#endif
 414                case Opt_map_a:
 415                        popt->map = 'a';
 416                        break;
 417                case Opt_map_o:
 418                        popt->map = 'o';
 419                        break;
 420                case Opt_map_n:
 421                        popt->map = 'n';
 422                        break;
 423                case Opt_session:
 424                        if (match_int(&args[0], &option))
 425                                return 0;
 426                        n = option;
 427                        if (n > 99)
 428                                return 0;
 429                        popt->session = n + 1;
 430                        break;
 431                case Opt_sb:
 432                        if (match_int(&args[0], &option))
 433                                return 0;
 434                        popt->sbsector = option;
 435                        break;
 436                case Opt_check_r:
 437                        popt->check = 'r';
 438                        break;
 439                case Opt_check_s:
 440                        popt->check = 's';
 441                        break;
 442                case Opt_ignore:
 443                        break;
 444                case Opt_uid:
 445                        if (match_int(&args[0], &option))
 446                                return 0;
 447                        popt->uid = option;
 448                        break;
 449                case Opt_gid:
 450                        if (match_int(&args[0], &option))
 451                                return 0;
 452                        popt->gid = option;
 453                        break;
 454                case Opt_mode:
 455                        if (match_int(&args[0], &option))
 456                                return 0;
 457                        popt->fmode = option;
 458                        break;
 459                case Opt_dmode:
 460                        if (match_int(&args[0], &option))
 461                                return 0;
 462                        popt->dmode = option;
 463                        break;
 464                case Opt_block:
 465                        if (match_int(&args[0], &option))
 466                                return 0;
 467                        n = option;
 468                        if (n != 512 && n != 1024 && n != 2048)
 469                                return 0;
 470                        popt->blocksize = n;
 471                        break;
 472                case Opt_nocompress:
 473                        popt->nocompress = 1;
 474                        break;
 475                default:
 476                        return 0;
 477                }
 478        }
 479        return 1;
 480}
 481
 482/*
 483 * look if the driver can tell the multi session redirection value
 484 *
 485 * don't change this if you don't know what you do, please!
 486 * Multisession is legal only with XA disks.
 487 * A non-XA disk with more than one volume descriptor may do it right, but
 488 * usually is written in a nowhere standardized "multi-partition" manner.
 489 * Multisession uses absolute addressing (solely the first frame of the whole
 490 * track is #0), multi-partition uses relative addressing (each first frame of
 491 * each track is #0), and a track is not a session.
 492 *
 493 * A broken CDwriter software or drive firmware does not set new standards,
 494 * at least not if conflicting with the existing ones.
 495 *
 496 * emoenke@gwdg.de
 497 */
 498#define WE_OBEY_THE_WRITTEN_STANDARDS 1
 499
 500static unsigned int isofs_get_last_session(struct super_block *sb, s32 session)
 501{
 502        struct cdrom_multisession ms_info;
 503        unsigned int vol_desc_start;
 504        struct block_device *bdev = sb->s_bdev;
 505        int i;
 506
 507        vol_desc_start=0;
 508        ms_info.addr_format=CDROM_LBA;
 509        if(session >= 0 && session <= 99) {
 510                struct cdrom_tocentry Te;
 511                Te.cdte_track=session;
 512                Te.cdte_format=CDROM_LBA;
 513                i = ioctl_by_bdev(bdev, CDROMREADTOCENTRY, (unsigned long) &Te);
 514                if (!i) {
 515                        printk(KERN_DEBUG "ISOFS: Session %d start %d type %d\n",
 516                                session, Te.cdte_addr.lba,
 517                                Te.cdte_ctrl&CDROM_DATA_TRACK);
 518                        if ((Te.cdte_ctrl&CDROM_DATA_TRACK) == 4)
 519                                return Te.cdte_addr.lba;
 520                }
 521
 522                printk(KERN_ERR "ISOFS: Invalid session number or type of track\n");
 523        }
 524        i = ioctl_by_bdev(bdev, CDROMMULTISESSION, (unsigned long) &ms_info);
 525        if (session > 0)
 526                printk(KERN_ERR "ISOFS: Invalid session number\n");
 527#if 0
 528        printk(KERN_DEBUG "isofs.inode: CDROMMULTISESSION: rc=%d\n",i);
 529        if (i==0) {
 530                printk(KERN_DEBUG "isofs.inode: XA disk: %s\n",ms_info.xa_flag?"yes":"no");
 531                printk(KERN_DEBUG "isofs.inode: vol_desc_start = %d\n", ms_info.addr.lba);
 532        }
 533#endif
 534        if (i==0)
 535#if WE_OBEY_THE_WRITTEN_STANDARDS
 536                if (ms_info.xa_flag) /* necessary for a valid ms_info.addr */
 537#endif
 538                        vol_desc_start=ms_info.addr.lba;
 539        return vol_desc_start;
 540}
 541
 542/*
 543 * Initialize the superblock and read the root inode.
 544 *
 545 * Note: a check_disk_change() has been done immediately prior
 546 * to this call, so we don't need to check again.
 547 */
 548static int isofs_fill_super(struct super_block *s, void *data, int silent)
 549{
 550        struct buffer_head *bh = NULL, *pri_bh = NULL;
 551        struct hs_primary_descriptor *h_pri = NULL;
 552        struct iso_primary_descriptor *pri = NULL;
 553        struct iso_supplementary_descriptor *sec = NULL;
 554        struct iso_directory_record *rootp;
 555        struct inode *inode;
 556        struct iso9660_options opt;
 557        struct isofs_sb_info *sbi;
 558        unsigned long first_data_zone;
 559        int joliet_level = 0;
 560        int iso_blknum, block;
 561        int orig_zonesize;
 562        int table, error = -EINVAL;
 563        unsigned int vol_desc_start;
 564
 565        save_mount_options(s, data);
 566
 567        sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
 568        if (!sbi)
 569                return -ENOMEM;
 570        s->s_fs_info = sbi;
 571
 572        if (!parse_options((char *)data, &opt))
 573                goto out_freesbi;
 574
 575        /*
 576         * First of all, get the hardware blocksize for this device.
 577         * If we don't know what it is, or the hardware blocksize is
 578         * larger than the blocksize the user specified, then use
 579         * that value.
 580         */
 581        /*
 582         * What if bugger tells us to go beyond page size?
 583         */
 584        opt.blocksize = sb_min_blocksize(s, opt.blocksize);
 585
 586        sbi->s_high_sierra = 0; /* default is iso9660 */
 587
 588        vol_desc_start = (opt.sbsector != -1) ?
 589                opt.sbsector : isofs_get_last_session(s,opt.session);
 590
 591        for (iso_blknum = vol_desc_start+16;
 592                iso_blknum < vol_desc_start+100; iso_blknum++) {
 593                struct hs_volume_descriptor *hdp;
 594                struct iso_volume_descriptor  *vdp;
 595
 596                block = iso_blknum << (ISOFS_BLOCK_BITS - s->s_blocksize_bits);
 597                if (!(bh = sb_bread(s, block)))
 598                        goto out_no_read;
 599
 600                vdp = (struct iso_volume_descriptor *)bh->b_data;
 601                hdp = (struct hs_volume_descriptor *)bh->b_data;
 602
 603                /*
 604                 * Due to the overlapping physical location of the descriptors,
 605                 * ISO CDs can match hdp->id==HS_STANDARD_ID as well. To ensure
 606                 * proper identification in this case, we first check for ISO.
 607                 */
 608                if (strncmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) == 0) {
 609                        if (isonum_711(vdp->type) == ISO_VD_END)
 610                                break;
 611                        if (isonum_711(vdp->type) == ISO_VD_PRIMARY) {
 612                                if (pri == NULL) {
 613                                        pri = (struct iso_primary_descriptor *)vdp;
 614                                        /* Save the buffer in case we need it ... */
 615                                        pri_bh = bh;
 616                                        bh = NULL;
 617                                }
 618                        }
 619#ifdef CONFIG_JOLIET
 620                        else if (isonum_711(vdp->type) == ISO_VD_SUPPLEMENTARY) {
 621                                sec = (struct iso_supplementary_descriptor *)vdp;
 622                                if (sec->escape[0] == 0x25 && sec->escape[1] == 0x2f) {
 623                                        if (opt.joliet == 'y') {
 624                                                if (sec->escape[2] == 0x40)
 625                                                        joliet_level = 1;
 626                                                else if (sec->escape[2] == 0x43)
 627                                                        joliet_level = 2;
 628                                                else if (sec->escape[2] == 0x45)
 629                                                        joliet_level = 3;
 630
 631                                                printk(KERN_DEBUG "ISO 9660 Extensions: "
 632                                                        "Microsoft Joliet Level %d\n",
 633                                                        joliet_level);
 634                                        }
 635                                        goto root_found;
 636                                } else {
 637                                /* Unknown supplementary volume descriptor */
 638                                sec = NULL;
 639                                }
 640                        }
 641#endif
 642                } else {
 643                        if (strncmp (hdp->id, HS_STANDARD_ID, sizeof hdp->id) == 0) {
 644                                if (isonum_711(hdp->type) != ISO_VD_PRIMARY)
 645                                        goto out_freebh;
 646
 647                                sbi->s_high_sierra = 1;
 648                                opt.rock = 'n';
 649                                h_pri = (struct hs_primary_descriptor *)vdp;
 650                                goto root_found;
 651                        }
 652                }
 653
 654                /* Just skip any volume descriptors we don't recognize */
 655
 656                brelse(bh);
 657                bh = NULL;
 658        }
 659        /*
 660         * If we fall through, either no volume descriptor was found,
 661         * or else we passed a primary descriptor looking for others.
 662         */
 663        if (!pri)
 664                goto out_unknown_format;
 665        brelse(bh);
 666        bh = pri_bh;
 667        pri_bh = NULL;
 668
 669root_found:
 670
 671        if (joliet_level && (pri == NULL || opt.rock == 'n')) {
 672                /* This is the case of Joliet with the norock mount flag.
 673                 * A disc with both Joliet and Rock Ridge is handled later
 674                 */
 675                pri = (struct iso_primary_descriptor *) sec;
 676        }
 677
 678        if(sbi->s_high_sierra){
 679                rootp = (struct iso_directory_record *) h_pri->root_directory_record;
 680                sbi->s_nzones = isonum_733(h_pri->volume_space_size);
 681                sbi->s_log_zone_size = isonum_723(h_pri->logical_block_size);
 682                sbi->s_max_size = isonum_733(h_pri->volume_space_size);
 683        } else {
 684                if (!pri)
 685                        goto out_freebh;
 686                rootp = (struct iso_directory_record *) pri->root_directory_record;
 687                sbi->s_nzones = isonum_733(pri->volume_space_size);
 688                sbi->s_log_zone_size = isonum_723(pri->logical_block_size);
 689                sbi->s_max_size = isonum_733(pri->volume_space_size);
 690        }
 691
 692        sbi->s_ninodes = 0; /* No way to figure this out easily */
 693
 694        orig_zonesize = sbi->s_log_zone_size;
 695        /*
 696         * If the zone size is smaller than the hardware sector size,
 697         * this is a fatal error.  This would occur if the disc drive
 698         * had sectors that were 2048 bytes, but the filesystem had
 699         * blocks that were 512 bytes (which should only very rarely
 700         * happen.)
 701         */
 702        if (orig_zonesize < opt.blocksize)
 703                goto out_bad_size;
 704
 705        /* RDE: convert log zone size to bit shift */
 706        switch (sbi->s_log_zone_size) {
 707        case  512: sbi->s_log_zone_size =  9; break;
 708        case 1024: sbi->s_log_zone_size = 10; break;
 709        case 2048: sbi->s_log_zone_size = 11; break;
 710
 711        default:
 712                goto out_bad_zone_size;
 713        }
 714
 715        s->s_magic = ISOFS_SUPER_MAGIC;
 716        s->s_maxbytes = 0xffffffff; /* We can handle files up to 4 GB */
 717
 718        /*
 719         * The CDROM is read-only, has no nodes (devices) on it, and since
 720         * all of the files appear to be owned by root, we really do not want
 721         * to allow suid.  (suid or devices will not show up unless we have
 722         * Rock Ridge extensions)
 723         */
 724
 725        s->s_flags |= MS_RDONLY /* | MS_NODEV | MS_NOSUID */;
 726
 727        /* Set this for reference. Its not currently used except on write
 728           which we don't have .. */
 729
 730        first_data_zone = isonum_733(rootp->extent) +
 731                          isonum_711(rootp->ext_attr_length);
 732        sbi->s_firstdatazone = first_data_zone;
 733#ifndef BEQUIET
 734        printk(KERN_DEBUG "ISOFS: Max size:%ld   Log zone size:%ld\n",
 735                sbi->s_max_size, 1UL << sbi->s_log_zone_size);
 736        printk(KERN_DEBUG "ISOFS: First datazone:%ld\n", sbi->s_firstdatazone);
 737        if(sbi->s_high_sierra)
 738                printk(KERN_DEBUG "ISOFS: Disc in High Sierra format.\n");
 739#endif
 740
 741        /*
 742         * If the Joliet level is set, we _may_ decide to use the
 743         * secondary descriptor, but can't be sure until after we
 744         * read the root inode. But before reading the root inode
 745         * we may need to change the device blocksize, and would
 746         * rather release the old buffer first. So, we cache the
 747         * first_data_zone value from the secondary descriptor.
 748         */
 749        if (joliet_level) {
 750                pri = (struct iso_primary_descriptor *) sec;
 751                rootp = (struct iso_directory_record *)
 752                        pri->root_directory_record;
 753                first_data_zone = isonum_733(rootp->extent) +
 754                                isonum_711(rootp->ext_attr_length);
 755        }
 756
 757        /*
 758         * We're all done using the volume descriptor, and may need
 759         * to change the device blocksize, so release the buffer now.
 760         */
 761        brelse(pri_bh);
 762        brelse(bh);
 763
 764        /*
 765         * Force the blocksize to 512 for 512 byte sectors.  The file
 766         * read primitives really get it wrong in a bad way if we don't
 767         * do this.
 768         *
 769         * Note - we should never be setting the blocksize to something
 770         * less than the hardware sector size for the device.  If we
 771         * do, we would end up having to read larger buffers and split
 772         * out portions to satisfy requests.
 773         *
 774         * Note2- the idea here is that we want to deal with the optimal
 775         * zonesize in the filesystem.  If we have it set to something less,
 776         * then we have horrible problems with trying to piece together
 777         * bits of adjacent blocks in order to properly read directory
 778         * entries.  By forcing the blocksize in this way, we ensure
 779         * that we will never be required to do this.
 780         */
 781        sb_set_blocksize(s, orig_zonesize);
 782
 783        sbi->s_nls_iocharset = NULL;
 784
 785#ifdef CONFIG_JOLIET
 786        if (joliet_level && opt.utf8 == 0) {
 787                char *p = opt.iocharset ? opt.iocharset : CONFIG_NLS_DEFAULT;
 788                sbi->s_nls_iocharset = load_nls(p);
 789                if (! sbi->s_nls_iocharset) {
 790                        /* Fail only if explicit charset specified */
 791                        if (opt.iocharset)
 792                                goto out_freesbi;
 793                        sbi->s_nls_iocharset = load_nls_default();
 794                }
 795        }
 796#endif
 797        s->s_op = &isofs_sops;
 798        s->s_export_op = &isofs_export_ops;
 799        sbi->s_mapping = opt.map;
 800        sbi->s_rock = (opt.rock == 'y' ? 2 : 0);
 801        sbi->s_rock_offset = -1; /* initial offset, will guess until SP is found*/
 802        sbi->s_cruft = opt.cruft;
 803        sbi->s_hide = opt.hide;
 804        sbi->s_showassoc = opt.showassoc;
 805        sbi->s_uid = opt.uid;
 806        sbi->s_gid = opt.gid;
 807        sbi->s_utf8 = opt.utf8;
 808        sbi->s_nocompress = opt.nocompress;
 809        /*
 810         * It would be incredibly stupid to allow people to mark every file
 811         * on the disk as suid, so we merely allow them to set the default
 812         * permissions.
 813         */
 814        sbi->s_fmode = opt.fmode & 0777;
 815        sbi->s_dmode = opt.dmode & 0777;
 816
 817        /*
 818         * Read the root inode, which _may_ result in changing
 819         * the s_rock flag. Once we have the final s_rock value,
 820         * we then decide whether to use the Joliet descriptor.
 821         */
 822        inode = isofs_iget(s, sbi->s_firstdatazone, 0);
 823        if (IS_ERR(inode))
 824                goto out_no_root;
 825
 826        /*
 827         * If this disk has both Rock Ridge and Joliet on it, then we
 828         * want to use Rock Ridge by default.  This can be overridden
 829         * by using the norock mount option.  There is still one other
 830         * possibility that is not taken into account: a Rock Ridge
 831         * CD with Unicode names.  Until someone sees such a beast, it
 832         * will not be supported.
 833         */
 834        if (sbi->s_rock == 1) {
 835                joliet_level = 0;
 836        } else if (joliet_level) {
 837                sbi->s_rock = 0;
 838                if (sbi->s_firstdatazone != first_data_zone) {
 839                        sbi->s_firstdatazone = first_data_zone;
 840                        printk(KERN_DEBUG
 841                                "ISOFS: changing to secondary root\n");
 842                        iput(inode);
 843                        inode = isofs_iget(s, sbi->s_firstdatazone, 0);
 844                        if (IS_ERR(inode))
 845                                goto out_no_root;
 846                }
 847        }
 848
 849        if (opt.check == 'u') {
 850                /* Only Joliet is case insensitive by default */
 851                if (joliet_level)
 852                        opt.check = 'r';
 853                else
 854                        opt.check = 's';
 855        }
 856        sbi->s_joliet_level = joliet_level;
 857
 858        /* check the root inode */
 859        if (!inode->i_op)
 860                goto out_bad_root;
 861
 862        /* Make sure the root inode is a directory */
 863        if (!S_ISDIR(inode->i_mode)) {
 864                printk(KERN_WARNING
 865                        "isofs_fill_super: root inode is not a directory. "
 866                        "Corrupted media?\n");
 867                goto out_iput;
 868        }
 869
 870        /* get the root dentry */
 871        s->s_root = d_alloc_root(inode);
 872        if (!(s->s_root))
 873                goto out_no_root;
 874
 875        table = 0;
 876        if (joliet_level)
 877                table += 2;
 878        if (opt.check == 'r')
 879                table++;
 880        s->s_root->d_op = &isofs_dentry_ops[table];
 881
 882        kfree(opt.iocharset);
 883
 884        return 0;
 885
 886        /*
 887         * Display error messages and free resources.
 888         */
 889out_bad_root:
 890        printk(KERN_WARNING "%s: root inode not initialized\n", __func__);
 891out_iput:
 892        iput(inode);
 893        goto out_no_inode;
 894out_no_root:
 895        error = PTR_ERR(inode);
 896        if (error != -ENOMEM)
 897                printk(KERN_WARNING "%s: get root inode failed\n", __func__);
 898out_no_inode:
 899#ifdef CONFIG_JOLIET
 900        if (sbi->s_nls_iocharset)
 901                unload_nls(sbi->s_nls_iocharset);
 902#endif
 903        goto out_freesbi;
 904out_no_read:
 905        printk(KERN_WARNING "%s: bread failed, dev=%s, iso_blknum=%d, block=%d\n",
 906                __func__, s->s_id, iso_blknum, block);
 907        goto out_freesbi;
 908out_bad_zone_size:
 909        printk(KERN_WARNING "ISOFS: Bad logical zone size %ld\n",
 910                sbi->s_log_zone_size);
 911        goto out_freebh;
 912out_bad_size:
 913        printk(KERN_WARNING "ISOFS: Logical zone size(%d) < hardware blocksize(%u)\n",
 914                orig_zonesize, opt.blocksize);
 915        goto out_freebh;
 916out_unknown_format:
 917        if (!silent)
 918                printk(KERN_WARNING "ISOFS: Unable to identify CD-ROM format.\n");
 919
 920out_freebh:
 921        brelse(bh);
 922out_freesbi:
 923        kfree(opt.iocharset);
 924        kfree(sbi);
 925        s->s_fs_info = NULL;
 926        return error;
 927}
 928
 929static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf)
 930{
 931        struct super_block *sb = dentry->d_sb;
 932
 933        buf->f_type = ISOFS_SUPER_MAGIC;
 934        buf->f_bsize = sb->s_blocksize;
 935        buf->f_blocks = (ISOFS_SB(sb)->s_nzones
 936                << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits));
 937        buf->f_bfree = 0;
 938        buf->f_bavail = 0;
 939        buf->f_files = ISOFS_SB(sb)->s_ninodes;
 940        buf->f_ffree = 0;
 941        buf->f_namelen = NAME_MAX;
 942        return 0;
 943}
 944
 945/*
 946 * Get a set of blocks; filling in buffer_heads if already allocated
 947 * or getblk() if they are not.  Returns the number of blocks inserted
 948 * (-ve == error.)
 949 */
 950int isofs_get_blocks(struct inode *inode, sector_t iblock_s,
 951                     struct buffer_head **bh, unsigned long nblocks)
 952{
 953        unsigned long b_off;
 954        unsigned offset, sect_size;
 955        unsigned int firstext;
 956        unsigned long nextblk, nextoff;
 957        long iblock = (long)iblock_s;
 958        int section, rv, error;
 959        struct iso_inode_info *ei = ISOFS_I(inode);
 960
 961        lock_kernel();
 962
 963        error = -EIO;
 964        rv = 0;
 965        if (iblock < 0 || iblock != iblock_s) {
 966                printk(KERN_DEBUG "%s: block number too large\n", __func__);
 967                goto abort;
 968        }
 969
 970        b_off = iblock;
 971
 972        offset = 0;
 973        firstext = ei->i_first_extent;
 974        sect_size = ei->i_section_size >> ISOFS_BUFFER_BITS(inode);
 975        nextblk = ei->i_next_section_block;
 976        nextoff = ei->i_next_section_offset;
 977        section = 0;
 978
 979        while (nblocks) {
 980                /* If we are *way* beyond the end of the file, print a message.
 981                 * Access beyond the end of the file up to the next page boundary
 982                 * is normal, however because of the way the page cache works.
 983                 * In this case, we just return 0 so that we can properly fill
 984                 * the page with useless information without generating any
 985                 * I/O errors.
 986                 */
 987                if (b_off > ((inode->i_size + PAGE_CACHE_SIZE - 1) >> ISOFS_BUFFER_BITS(inode))) {
 988                        printk(KERN_DEBUG "%s: block >= EOF (%ld, %ld)\n",
 989                                __func__, iblock, (unsigned long) inode->i_size);
 990                        goto abort;
 991                }
 992
 993                /* On the last section, nextblk == 0, section size is likely to
 994                 * exceed sect_size by a partial block, and access beyond the
 995                 * end of the file will reach beyond the section size, too.
 996                 */
 997                while (nextblk && (b_off >= (offset + sect_size))) {
 998                        struct inode *ninode;
 999
1000                        offset += sect_size;
1001                        ninode = isofs_iget(inode->i_sb, nextblk, nextoff);
1002                        if (IS_ERR(ninode)) {
1003                                error = PTR_ERR(ninode);
1004                                goto abort;
1005                        }
1006                        firstext  = ISOFS_I(ninode)->i_first_extent;
1007                        sect_size = ISOFS_I(ninode)->i_section_size >> ISOFS_BUFFER_BITS(ninode);
1008                        nextblk   = ISOFS_I(ninode)->i_next_section_block;
1009                        nextoff   = ISOFS_I(ninode)->i_next_section_offset;
1010                        iput(ninode);
1011
1012                        if (++section > 100) {
1013                                printk(KERN_DEBUG "%s: More than 100 file sections ?!?"
1014                                        " aborting...\n", __func__);
1015                                printk(KERN_DEBUG "%s: block=%ld firstext=%u sect_size=%u "
1016                                        "nextblk=%lu nextoff=%lu\n", __func__,
1017                                        iblock, firstext, (unsigned) sect_size,
1018                                        nextblk, nextoff);
1019                                goto abort;
1020                        }
1021                }
1022
1023                if (*bh) {
1024                        map_bh(*bh, inode->i_sb, firstext + b_off - offset);
1025                } else {
1026                        *bh = sb_getblk(inode->i_sb, firstext+b_off-offset);
1027                        if (!*bh)
1028                                goto abort;
1029                }
1030                bh++;   /* Next buffer head */
1031                b_off++;        /* Next buffer offset */
1032                nblocks--;
1033                rv++;
1034        }
1035
1036        error = 0;
1037abort:
1038        unlock_kernel();
1039        return rv != 0 ? rv : error;
1040}
1041
1042/*
1043 * Used by the standard interfaces.
1044 */
1045static int isofs_get_block(struct inode *inode, sector_t iblock,
1046                    struct buffer_head *bh_result, int create)
1047{
1048        int ret;
1049
1050        if (create) {
1051                printk(KERN_DEBUG "%s: Kernel tries to allocate a block\n", __func__);
1052                return -EROFS;
1053        }
1054
1055        ret = isofs_get_blocks(inode, iblock, &bh_result, 1);
1056        return ret < 0 ? ret : 0;
1057}
1058
1059static int isofs_bmap(struct inode *inode, sector_t block)
1060{
1061        struct buffer_head dummy;
1062        int error;
1063
1064        dummy.b_state = 0;
1065        dummy.b_blocknr = -1000;
1066        error = isofs_get_block(inode, block, &dummy, 0);
1067        if (!error)
1068                return dummy.b_blocknr;
1069        return 0;
1070}
1071
1072struct buffer_head *isofs_bread(struct inode *inode, sector_t block)
1073{
1074        sector_t blknr = isofs_bmap(inode, block);
1075        if (!blknr)
1076                return NULL;
1077        return sb_bread(inode->i_sb, blknr);
1078}
1079
1080static int isofs_readpage(struct file *file, struct page *page)
1081{
1082        return block_read_full_page(page,isofs_get_block);
1083}
1084
1085static sector_t _isofs_bmap(struct address_space *mapping, sector_t block)
1086{
1087        return generic_block_bmap(mapping,block,isofs_get_block);
1088}
1089
1090static const struct address_space_operations isofs_aops = {
1091        .readpage = isofs_readpage,
1092        .sync_page = block_sync_page,
1093        .bmap = _isofs_bmap
1094};
1095
1096static inline void test_and_set_uid(uid_t *p, uid_t value)
1097{
1098        if (value)
1099                *p = value;
1100}
1101
1102static inline void test_and_set_gid(gid_t *p, gid_t value)
1103{
1104        if (value)
1105                *p = value;
1106}
1107
1108static int isofs_read_level3_size(struct inode *inode)
1109{
1110        unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
1111        int high_sierra = ISOFS_SB(inode->i_sb)->s_high_sierra;
1112        struct buffer_head *bh = NULL;
1113        unsigned long block, offset, block_saved, offset_saved;
1114        int i = 0;
1115        int more_entries = 0;
1116        struct iso_directory_record *tmpde = NULL;
1117        struct iso_inode_info *ei = ISOFS_I(inode);
1118
1119        inode->i_size = 0;
1120
1121        /* The first 16 blocks are reserved as the System Area.  Thus,
1122         * no inodes can appear in block 0.  We use this to flag that
1123         * this is the last section. */
1124        ei->i_next_section_block = 0;
1125        ei->i_next_section_offset = 0;
1126
1127        block = ei->i_iget5_block;
1128        offset = ei->i_iget5_offset;
1129
1130        do {
1131                struct iso_directory_record *de;
1132                unsigned int de_len;
1133
1134                if (!bh) {
1135                        bh = sb_bread(inode->i_sb, block);
1136                        if (!bh)
1137                                goto out_noread;
1138                }
1139                de = (struct iso_directory_record *) (bh->b_data + offset);
1140                de_len = *(unsigned char *) de;
1141
1142                if (de_len == 0) {
1143                        brelse(bh);
1144                        bh = NULL;
1145                        ++block;
1146                        offset = 0;
1147                        continue;
1148                }
1149
1150                block_saved = block;
1151                offset_saved = offset;
1152                offset += de_len;
1153
1154                /* Make sure we have a full directory entry */
1155                if (offset >= bufsize) {
1156                        int slop = bufsize - offset + de_len;
1157                        if (!tmpde) {
1158                                tmpde = kmalloc(256, GFP_KERNEL);
1159                                if (!tmpde)
1160                                        goto out_nomem;
1161                        }
1162                        memcpy(tmpde, de, slop);
1163                        offset &= bufsize - 1;
1164                        block++;
1165                        brelse(bh);
1166                        bh = NULL;
1167                        if (offset) {
1168                                bh = sb_bread(inode->i_sb, block);
1169                                if (!bh)
1170                                        goto out_noread;
1171                                memcpy((void *)tmpde+slop, bh->b_data, offset);
1172                        }
1173                        de = tmpde;
1174                }
1175
1176                inode->i_size += isonum_733(de->size);
1177                if (i == 1) {
1178                        ei->i_next_section_block = block_saved;
1179                        ei->i_next_section_offset = offset_saved;
1180                }
1181
1182                more_entries = de->flags[-high_sierra] & 0x80;
1183
1184                i++;
1185                if (i > 100)
1186                        goto out_toomany;
1187        } while (more_entries);
1188out:
1189        kfree(tmpde);
1190        if (bh)
1191                brelse(bh);
1192        return 0;
1193
1194out_nomem:
1195        if (bh)
1196                brelse(bh);
1197        return -ENOMEM;
1198
1199out_noread:
1200        printk(KERN_INFO "ISOFS: unable to read i-node block %lu\n", block);
1201        kfree(tmpde);
1202        return -EIO;
1203
1204out_toomany:
1205        printk(KERN_INFO "%s: More than 100 file sections ?!?, aborting...\n"
1206                "isofs_read_level3_size: inode=%lu\n",
1207                __func__, inode->i_ino);
1208        goto out;
1209}
1210
1211static int isofs_read_inode(struct inode *inode)
1212{
1213        struct super_block *sb = inode->i_sb;
1214        struct isofs_sb_info *sbi = ISOFS_SB(sb);
1215        unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
1216        unsigned long block;
1217        int high_sierra = sbi->s_high_sierra;
1218        struct buffer_head *bh = NULL;
1219        struct iso_directory_record *de;
1220        struct iso_directory_record *tmpde = NULL;
1221        unsigned int de_len;
1222        unsigned long offset;
1223        struct iso_inode_info *ei = ISOFS_I(inode);
1224        int ret = -EIO;
1225
1226        block = ei->i_iget5_block;
1227        bh = sb_bread(inode->i_sb, block);
1228        if (!bh)
1229                goto out_badread;
1230
1231        offset = ei->i_iget5_offset;
1232
1233        de = (struct iso_directory_record *) (bh->b_data + offset);
1234        de_len = *(unsigned char *) de;
1235
1236        if (offset + de_len > bufsize) {
1237                int frag1 = bufsize - offset;
1238
1239                tmpde = kmalloc(de_len, GFP_KERNEL);
1240                if (tmpde == NULL) {
1241                        printk(KERN_INFO "%s: out of memory\n", __func__);
1242                        ret = -ENOMEM;
1243                        goto fail;
1244                }
1245                memcpy(tmpde, bh->b_data + offset, frag1);
1246                brelse(bh);
1247                bh = sb_bread(inode->i_sb, ++block);
1248                if (!bh)
1249                        goto out_badread;
1250                memcpy((char *)tmpde+frag1, bh->b_data, de_len - frag1);
1251                de = tmpde;
1252        }
1253
1254        inode->i_ino = isofs_get_ino(ei->i_iget5_block,
1255                                        ei->i_iget5_offset,
1256                                        ISOFS_BUFFER_BITS(inode));
1257
1258        /* Assume it is a normal-format file unless told otherwise */
1259        ei->i_file_format = isofs_file_normal;
1260
1261        if (de->flags[-high_sierra] & 2) {
1262                inode->i_mode = sbi->s_dmode | S_IFDIR;
1263                inode->i_nlink = 1;     /*
1264                                         * Set to 1.  We know there are 2, but
1265                                         * the find utility tries to optimize
1266                                         * if it is 2, and it screws up.  It is
1267                                         * easier to give 1 which tells find to
1268                                         * do it the hard way.
1269                                         */
1270        } else {
1271                /* Everybody gets to read the file. */
1272                inode->i_mode = sbi->s_fmode | S_IFREG;
1273                inode->i_nlink = 1;
1274        }
1275        inode->i_uid = sbi->s_uid;
1276        inode->i_gid = sbi->s_gid;
1277        inode->i_blocks = 0;
1278
1279        ei->i_format_parm[0] = 0;
1280        ei->i_format_parm[1] = 0;
1281        ei->i_format_parm[2] = 0;
1282
1283        ei->i_section_size = isonum_733(de->size);
1284        if (de->flags[-high_sierra] & 0x80) {
1285                ret = isofs_read_level3_size(inode);
1286                if (ret < 0)
1287                        goto fail;
1288                ret = -EIO;
1289        } else {
1290                ei->i_next_section_block = 0;
1291                ei->i_next_section_offset = 0;
1292                inode->i_size = isonum_733(de->size);
1293        }
1294
1295        /*
1296         * Some dipshit decided to store some other bit of information
1297         * in the high byte of the file length.  Truncate size in case
1298         * this CDROM was mounted with the cruft option.
1299         */
1300
1301        if (sbi->s_cruft == 'y')
1302                inode->i_size &= 0x00ffffff;
1303
1304        if (de->interleave[0]) {
1305                printk(KERN_DEBUG "ISOFS: Interleaved files not (yet) supported.\n");
1306                inode->i_size = 0;
1307        }
1308
1309        /* I have no idea what file_unit_size is used for, so
1310           we will flag it for now */
1311        if (de->file_unit_size[0] != 0) {
1312                printk(KERN_DEBUG "ISOFS: File unit size != 0 for ISO file (%ld).\n",
1313                        inode->i_ino);
1314        }
1315
1316        /* I have no idea what other flag bits are used for, so
1317           we will flag it for now */
1318#ifdef DEBUG
1319        if((de->flags[-high_sierra] & ~2)!= 0){
1320                printk(KERN_DEBUG "ISOFS: Unusual flag settings for ISO file "
1321                                "(%ld %x).\n",
1322                        inode->i_ino, de->flags[-high_sierra]);
1323        }
1324#endif
1325
1326        inode->i_mtime.tv_sec =
1327        inode->i_atime.tv_sec =
1328        inode->i_ctime.tv_sec = iso_date(de->date, high_sierra);
1329        inode->i_mtime.tv_nsec =
1330        inode->i_atime.tv_nsec =
1331        inode->i_ctime.tv_nsec = 0;
1332
1333        ei->i_first_extent = (isonum_733(de->extent) +
1334                        isonum_711(de->ext_attr_length));
1335
1336        /* Set the number of blocks for stat() - should be done before RR */
1337        inode->i_blocks = (inode->i_size + 511) >> 9;
1338
1339        /*
1340         * Now test for possible Rock Ridge extensions which will override
1341         * some of these numbers in the inode structure.
1342         */
1343
1344        if (!high_sierra) {
1345                parse_rock_ridge_inode(de, inode);
1346                /* if we want uid/gid set, override the rock ridge setting */
1347                test_and_set_uid(&inode->i_uid, sbi->s_uid);
1348                test_and_set_gid(&inode->i_gid, sbi->s_gid);
1349        }
1350
1351        /* Install the inode operations vector */
1352        if (S_ISREG(inode->i_mode)) {
1353                inode->i_fop = &generic_ro_fops;
1354                switch (ei->i_file_format) {
1355#ifdef CONFIG_ZISOFS
1356                case isofs_file_compressed:
1357                        inode->i_data.a_ops = &zisofs_aops;
1358                        break;
1359#endif
1360                default:
1361                        inode->i_data.a_ops = &isofs_aops;
1362                        break;
1363                }
1364        } else if (S_ISDIR(inode->i_mode)) {
1365                inode->i_op = &isofs_dir_inode_operations;
1366                inode->i_fop = &isofs_dir_operations;
1367        } else if (S_ISLNK(inode->i_mode)) {
1368                inode->i_op = &page_symlink_inode_operations;
1369                inode->i_data.a_ops = &isofs_symlink_aops;
1370        } else
1371                /* XXX - parse_rock_ridge_inode() had already set i_rdev. */
1372                init_special_inode(inode, inode->i_mode, inode->i_rdev);
1373
1374        ret = 0;
1375out:
1376        kfree(tmpde);
1377        if (bh)
1378                brelse(bh);
1379        return ret;
1380
1381out_badread:
1382        printk(KERN_WARNING "ISOFS: unable to read i-node block\n");
1383fail:
1384        goto out;
1385}
1386
1387struct isofs_iget5_callback_data {
1388        unsigned long block;
1389        unsigned long offset;
1390};
1391
1392static int isofs_iget5_test(struct inode *ino, void *data)
1393{
1394        struct iso_inode_info *i = ISOFS_I(ino);
1395        struct isofs_iget5_callback_data *d =
1396                (struct isofs_iget5_callback_data*)data;
1397        return (i->i_iget5_block == d->block)
1398                && (i->i_iget5_offset == d->offset);
1399}
1400
1401static int isofs_iget5_set(struct inode *ino, void *data)
1402{
1403        struct iso_inode_info *i = ISOFS_I(ino);
1404        struct isofs_iget5_callback_data *d =
1405                (struct isofs_iget5_callback_data*)data;
1406        i->i_iget5_block = d->block;
1407        i->i_iget5_offset = d->offset;
1408        return 0;
1409}
1410
1411/* Store, in the inode's containing structure, the block and block
1412 * offset that point to the underlying meta-data for the inode.  The
1413 * code below is otherwise similar to the iget() code in
1414 * include/linux/fs.h */
1415struct inode *isofs_iget(struct super_block *sb,
1416                         unsigned long block,
1417                         unsigned long offset)
1418{
1419        unsigned long hashval;
1420        struct inode *inode;
1421        struct isofs_iget5_callback_data data;
1422        long ret;
1423
1424        if (offset >= 1ul << sb->s_blocksize_bits)
1425                return ERR_PTR(-EINVAL);
1426
1427        data.block = block;
1428        data.offset = offset;
1429
1430        hashval = (block << sb->s_blocksize_bits) | offset;
1431
1432        inode = iget5_locked(sb, hashval, &isofs_iget5_test,
1433                                &isofs_iget5_set, &data);
1434
1435        if (!inode)
1436                return ERR_PTR(-ENOMEM);
1437
1438        if (inode->i_state & I_NEW) {
1439                ret = isofs_read_inode(inode);
1440                if (ret < 0) {
1441                        iget_failed(inode);
1442                        inode = ERR_PTR(ret);
1443                } else {
1444                        unlock_new_inode(inode);
1445                }
1446        }
1447
1448        return inode;
1449}
1450
1451static int isofs_get_sb(struct file_system_type *fs_type,
1452        int flags, const char *dev_name, void *data, struct vfsmount *mnt)
1453{
1454        return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super,
1455                                mnt);
1456}
1457
1458static struct file_system_type iso9660_fs_type = {
1459        .owner          = THIS_MODULE,
1460        .name           = "iso9660",
1461        .get_sb         = isofs_get_sb,
1462        .kill_sb        = kill_block_super,
1463        .fs_flags       = FS_REQUIRES_DEV,
1464};
1465
1466static int __init init_iso9660_fs(void)
1467{
1468        int err = init_inodecache();
1469        if (err)
1470                goto out;
1471#ifdef CONFIG_ZISOFS
1472        err = zisofs_init();
1473        if (err)
1474                goto out1;
1475#endif
1476        err = register_filesystem(&iso9660_fs_type);
1477        if (err)
1478                goto out2;
1479        return 0;
1480out2:
1481#ifdef CONFIG_ZISOFS
1482        zisofs_cleanup();
1483out1:
1484#endif
1485        destroy_inodecache();
1486out:
1487        return err;
1488}
1489
1490static void __exit exit_iso9660_fs(void)
1491{
1492        unregister_filesystem(&iso9660_fs_type);
1493#ifdef CONFIG_ZISOFS
1494        zisofs_cleanup();
1495#endif
1496        destroy_inodecache();
1497}
1498
1499module_init(init_iso9660_fs)
1500module_exit(exit_iso9660_fs)
1501MODULE_LICENSE("GPL");
1502/* Actual filesystem name is iso9660, as requested in filesystems.c */
1503MODULE_ALIAS("iso9660");
1504
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.