[Wine] wine/RosettaStone breakage from recent kernel commit

walt w41ter at gmail.com
Mon Jun 29 12:23:40 CDT 2009


Hi,

I've been running the foreign language training program The Rosetta Stone(TRS)
on wine for months now, but a recent commit to the linux kernel has caused TRS
to be unable to read the DVD drive, where the program's data files are kept.

Strangely, winefile can still read the data DVD, but TRS cannot, and I'm
stumped.

Below is the guilty kernel commit (rather long, sorry).  Can anyone tell
why this would break TRS but not winefile?

Many thanks.

=============================================================

commit 5404ac8e4418ab3d254950ee4f9bcafc1da20b4a
Author: Jan Kara <jack at suse.cz>
Date:   Wed Jun 17 16:26:27 2009 -0700

    isofs: cleanup mount option processing

    Remove unused variables from isofs_sb_info (used to be some mount
    options), unify variables for option to use 0/1 (some options used
    'y'/'n'), use bit fields for option flags in superblock.

    Signed-off-by: Jan Kara <jack at suse.cz>
    Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

diff --git a/fs/isofs/dir.c b/fs/isofs/dir.c
index 2f0dc5a..8ba5441 100644
--- a/fs/isofs/dir.c
+++ b/fs/isofs/dir.c
@@ -195,9 +195,8 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
                 * Do not report hidden files if so instructed, or associated
                 * files unless instructed to do so
                 */
-               if ((sbi->s_hide == 'y' &&
-                               (de->flags[-sbi->s_high_sierra] & 1)) ||
-                               (sbi->s_showassoc =='n' &&
+               if ((sbi->s_hide && (de->flags[-sbi->s_high_sierra] & 1)) ||
+                   (!sbi->s_showassoc &&
                                (de->flags[-sbi->s_high_sierra] & 4))) {
                        filp->f_pos += de_len;
                        continue;
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c
index 0f4f9ca..58a7963 100644
--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -141,24 +141,24 @@ static const struct dentry_operations isofs_dentry_ops[] = {
 };

 struct iso9660_options{
-       char map;
-       char rock;
+       unsigned int rock:1;
+       unsigned int cruft:1;
+       unsigned int hide:1;
+       unsigned int showassoc:1;
+       unsigned int nocompress:1;
+       unsigned int overriderockperm:1;
+       unsigned int uid_set:1;
+       unsigned int gid_set:1;
+       unsigned int utf8:1;
+       unsigned char map;
        char joliet;
-       char cruft;
-       char hide;
-       char showassoc;
-       char nocompress;
-       char overriderockperm;
        unsigned char check;
        unsigned int blocksize;
        mode_t fmode;
        mode_t dmode;
-       char uid_set;
-       char gid_set;
        gid_t gid;
        uid_t uid;
        char *iocharset;
-       unsigned char utf8;
        /* LVE */
        s32 session;
        s32 sbsector;
@@ -363,11 +363,11 @@ static int parse_options(char *options, struct iso9660_options *popt)
        int option;

        popt->map = 'n';
-       popt->rock = 'y';
-       popt->joliet = 'y';
-       popt->cruft = 'n';
-       popt->hide = 'n';
-       popt->showassoc = 'n';
+       popt->rock = 1;
+       popt->joliet = 1;
+       popt->cruft = 0;
+       popt->hide = 0;
+       popt->showassoc = 0;
        popt->check = 'u';              /* unset */
        popt->nocompress = 0;
        popt->blocksize = 1024;
@@ -395,20 +395,20 @@ static int parse_options(char *options, struct iso9660_options *popt)
                token = match_token(p, tokens, args);
                switch (token) {
                case Opt_norock:
-                       popt->rock = 'n';
+                       popt->rock = 0;
                        break;
                case Opt_nojoliet:
-                       popt->joliet = 'n';
+                       popt->joliet = 0;
                        break;
                case Opt_hide:
-                       popt->hide = 'y';
+                       popt->hide = 1;
                        break;
                case Opt_unhide:
                case Opt_showassoc:
-                       popt->showassoc = 'y';
+                       popt->showassoc = 1;
                        break;
                case Opt_cruft:
-                       popt->cruft = 'y';
+                       popt->cruft = 1;
                        break;
                case Opt_utf8:
                        popt->utf8 = 1;
@@ -657,7 +657,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
                                        goto out_freebh;

                                sbi->s_high_sierra = 1;
-                               opt.rock = 'n';
+                               opt.rock = 0;
                                h_pri = (struct hs_primary_descriptor *)vdp;
                                goto root_found;
                        }
@@ -680,7 +680,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)

 root_found:

-       if (joliet_level && (pri == NULL || opt.rock == 'n')) {
+       if (joliet_level && (pri == NULL || !opt.rock)) {
                /* This is the case of Joliet with the norock mount flag.
                 * A disc with both Joliet and Rock Ridge is handled later
                 */
@@ -809,7 +809,7 @@ root_found:
        s->s_op = &isofs_sops;
        s->s_export_op = &isofs_export_ops;
        sbi->s_mapping = opt.map;
-       sbi->s_rock = (opt.rock == 'y' ? 2 : 0);
+       sbi->s_rock = (opt.rock ? 2 : 0);
        sbi->s_rock_offset = -1; /* initial offset, will guess until SP is found*/
        sbi->s_cruft = opt.cruft;
        sbi->s_hide = opt.hide;
@@ -1315,7 +1315,7 @@ static int isofs_read_inode(struct inode *inode)
         * this CDROM was mounted with the cruft option.
         */

-       if (sbi->s_cruft == 'y')
+       if (sbi->s_cruft)
                inode->i_size &= 0x00ffffff;

        if (de->interleave[0]) {
diff --git a/fs/isofs/isofs.h b/fs/isofs/isofs.h
index e2fc970..7d33de8 100644
--- a/fs/isofs/isofs.h
+++ b/fs/isofs/isofs.h
@@ -35,24 +35,20 @@ struct isofs_sb_info {
        unsigned long s_log_zone_size;
        unsigned long s_max_size;

-       unsigned char s_high_sierra; /* A simple flag */
-       unsigned char s_mapping;
        int           s_rock_offset; /* offset of SUSP fields within SU area */
-       unsigned char s_rock;
        unsigned char s_joliet_level;
-       unsigned char s_utf8;
-       unsigned char s_cruft; /* Broken disks with high
-                                 byte of length containing
-                                 junk */
-       unsigned char s_unhide;
-       unsigned char s_nosuid;
-       unsigned char s_nodev;
-       unsigned char s_nocompress;
-       unsigned char s_hide;
-       unsigned char s_showassoc;
-       unsigned char s_overriderockperm;
-       unsigned char s_uid_set;
-       unsigned char s_gid_set;
+       unsigned char s_mapping;
+       unsigned int  s_high_sierra:1;
+       unsigned int  s_rock:2;
+       unsigned int  s_utf8:1;
+       unsigned int  s_cruft:1; /* Broken disks with high byte of length
+                                 * containing junk */
+       unsigned int  s_nocompress:1;
+       unsigned int  s_hide:1;
+       unsigned int  s_showassoc:1;
+       unsigned int  s_overriderockperm:1;
+       unsigned int  s_uid_set:1;
+       unsigned int  s_gid_set:1;

        mode_t s_fmode;
        mode_t s_dmode;
diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c
index 8299889..eaa8313 100644
--- a/fs/isofs/namei.c
+++ b/fs/isofs/namei.c
@@ -142,9 +142,9 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
                 */
                match = 0;
                if (dlen > 0 &&
-                       (sbi->s_hide =='n' ||
+                       (!sbi->s_hide ||
                                (!(de->flags[-sbi->s_high_sierra] & 1))) &&
-                       (sbi->s_showassoc =='y' ||
+                       (sbi->s_showassoc ||
                                (!(de->flags[-sbi->s_high_sierra] & 4)))) {
                        match = (isofs_cmp(dentry, dpnt, dlen) == 0);
                }




More information about the wine-users mailing list