Commit 7d42ccf3 authored by Brian Gerst's avatar Brian Gerst Committed by Linus Torvalds

[PATCH] struct super_block cleanup - isofs

Seperates isofs_sb_info from struct super_block.
parent b286bd16
...@@ -110,14 +110,13 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -110,14 +110,13 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
struct buffer_head *bh = NULL; struct buffer_head *bh = NULL;
int len; int len;
int map; int map;
int high_sierra;
int first_de = 1; int first_de = 1;
char *p = NULL; /* Quiet GCC */ char *p = NULL; /* Quiet GCC */
struct iso_directory_record *de; struct iso_directory_record *de;
struct isofs_sb_info *sbi = ISOFS_SB(inode->i_sb);
offset = filp->f_pos & (bufsize - 1); offset = filp->f_pos & (bufsize - 1);
block = filp->f_pos >> bufbits; block = filp->f_pos >> bufbits;
high_sierra = inode->i_sb->u.isofs_sb.s_high_sierra;
while (filp->f_pos < inode->i_size) { while (filp->f_pos < inode->i_size) {
int de_len; int de_len;
...@@ -166,7 +165,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -166,7 +165,7 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
de = tmpde; de = tmpde;
} }
if (de->flags[-high_sierra] & 0x80) { if (de->flags[-sbi->s_high_sierra] & 0x80) {
first_de = 0; first_de = 0;
filp->f_pos += de_len; filp->f_pos += de_len;
continue; continue;
...@@ -194,16 +193,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -194,16 +193,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
/* Handle everything else. Do name translation if there /* Handle everything else. Do name translation if there
is no Rock Ridge NM field. */ is no Rock Ridge NM field. */
if (inode->i_sb->u.isofs_sb.s_unhide == 'n') { if (sbi->s_unhide == 'n') {
/* Do not report hidden or associated files */ /* Do not report hidden or associated files */
if (de->flags[-high_sierra] & 5) { if (de->flags[-sbi->s_high_sierra] & 5) {
filp->f_pos += de_len; filp->f_pos += de_len;
continue; continue;
} }
} }
map = 1; map = 1;
if (inode->i_sb->u.isofs_sb.s_rock) { if (sbi->s_rock) {
len = get_rock_ridge_filename(de, tmpname, inode); len = get_rock_ridge_filename(de, tmpname, inode);
if (len != 0) { /* may be -1 */ if (len != 0) { /* may be -1 */
p = tmpname; p = tmpname;
...@@ -212,16 +211,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp, ...@@ -212,16 +211,16 @@ static int do_isofs_readdir(struct inode *inode, struct file *filp,
} }
if (map) { if (map) {
#ifdef CONFIG_JOLIET #ifdef CONFIG_JOLIET
if (inode->i_sb->u.isofs_sb.s_joliet_level) { if (sbi->s_joliet_level) {
len = get_joliet_filename(de, tmpname, inode); len = get_joliet_filename(de, tmpname, inode);
p = tmpname; p = tmpname;
} else } else
#endif #endif
if (inode->i_sb->u.isofs_sb.s_mapping == 'a') { if (sbi->s_mapping == 'a') {
len = get_acorn_filename(de, tmpname, inode); len = get_acorn_filename(de, tmpname, inode);
p = tmpname; p = tmpname;
} else } else
if (inode->i_sb->u.isofs_sb.s_mapping == 'n') { if (sbi->s_mapping == 'n') {
len = isofs_name_translate(de, tmpname, inode); len = isofs_name_translate(de, tmpname, inode);
p = tmpname; p = tmpname;
} else { } else {
......
...@@ -60,10 +60,11 @@ static int isofs_dentry_cmp_ms(struct dentry *dentry, struct qstr *a, struct qst ...@@ -60,10 +60,11 @@ static int isofs_dentry_cmp_ms(struct dentry *dentry, struct qstr *a, struct qst
static void isofs_put_super(struct super_block *sb) static void isofs_put_super(struct super_block *sb)
{ {
struct isofs_sb_info *sbi = ISOFS_SB(sb);
#ifdef CONFIG_JOLIET #ifdef CONFIG_JOLIET
if (sb->u.isofs_sb.s_nls_iocharset) { if (sbi->s_nls_iocharset) {
unload_nls(sb->u.isofs_sb.s_nls_iocharset); unload_nls(sbi->s_nls_iocharset);
sb->u.isofs_sb.s_nls_iocharset = NULL; sbi->s_nls_iocharset = NULL;
} }
#endif #endif
...@@ -72,6 +73,8 @@ static void isofs_put_super(struct super_block *sb) ...@@ -72,6 +73,8 @@ static void isofs_put_super(struct super_block *sb)
check_malloc, check_bread); check_malloc, check_bread);
#endif #endif
kfree(sbi);
sb->u.generic_sbp = NULL;
return; return;
} }
...@@ -518,7 +521,6 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -518,7 +521,6 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
struct iso_supplementary_descriptor *sec = NULL; struct iso_supplementary_descriptor *sec = NULL;
struct iso_directory_record * rootp; struct iso_directory_record * rootp;
int joliet_level = 0; int joliet_level = 0;
int high_sierra;
int iso_blknum, block; int iso_blknum, block;
int orig_zonesize; int orig_zonesize;
int table; int table;
...@@ -526,9 +528,16 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -526,9 +528,16 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
unsigned long first_data_zone; unsigned long first_data_zone;
struct inode * inode; struct inode * inode;
struct iso9660_options opt; struct iso9660_options opt;
struct isofs_sb_info * sbi;
sbi = kmalloc(sizeof(struct isofs_sb_info), GFP_KERNEL);
if (!sbi)
return -ENOMEM;
s->u.generic_sbp = sbi;
memset(sbi, 0, sizeof(struct isofs_sb_info));
if (!parse_options((char *) data, &opt)) if (!parse_options((char *) data, &opt))
goto out_unlock; goto out_freesbi;
#if 0 #if 0
printk("map = %c\n", opt.map); printk("map = %c\n", opt.map);
...@@ -554,7 +563,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -554,7 +563,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
*/ */
opt.blocksize = sb_min_blocksize(s, opt.blocksize); opt.blocksize = sb_min_blocksize(s, opt.blocksize);
s->u.isofs_sb.s_high_sierra = high_sierra = 0; /* default is iso9660 */ sbi->s_high_sierra = 0; /* default is iso9660 */
vol_desc_start = (opt.sbsector != -1) ? vol_desc_start = (opt.sbsector != -1) ?
opt.sbsector : isofs_get_last_session(s,opt.session); opt.sbsector : isofs_get_last_session(s,opt.session);
...@@ -614,8 +623,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -614,8 +623,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
if (isonum_711 (hdp->type) != ISO_VD_PRIMARY) if (isonum_711 (hdp->type) != ISO_VD_PRIMARY)
goto out_freebh; goto out_freebh;
s->u.isofs_sb.s_high_sierra = 1; sbi->s_high_sierra = 1;
high_sierra = 1;
opt.rock = 'n'; opt.rock = 'n';
h_pri = (struct hs_primary_descriptor *)vdp; h_pri = (struct hs_primary_descriptor *)vdp;
goto root_found; goto root_found;
...@@ -646,29 +654,29 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -646,29 +654,29 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
pri = (struct iso_primary_descriptor *) sec; pri = (struct iso_primary_descriptor *) sec;
} }
if(high_sierra){ if(sbi->s_high_sierra){
rootp = (struct iso_directory_record *) h_pri->root_directory_record; rootp = (struct iso_directory_record *) h_pri->root_directory_record;
#ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS #ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS
if (isonum_723 (h_pri->volume_set_size) != 1) if (isonum_723 (h_pri->volume_set_size) != 1)
goto out_no_support; goto out_no_support;
#endif /* IGNORE_WRONG_MULTI_VOLUME_SPECS */ #endif /* IGNORE_WRONG_MULTI_VOLUME_SPECS */
s->u.isofs_sb.s_nzones = isonum_733 (h_pri->volume_space_size); sbi->s_nzones = isonum_733 (h_pri->volume_space_size);
s->u.isofs_sb.s_log_zone_size = isonum_723 (h_pri->logical_block_size); sbi->s_log_zone_size = isonum_723 (h_pri->logical_block_size);
s->u.isofs_sb.s_max_size = isonum_733(h_pri->volume_space_size); sbi->s_max_size = isonum_733(h_pri->volume_space_size);
} else { } else {
rootp = (struct iso_directory_record *) pri->root_directory_record; rootp = (struct iso_directory_record *) pri->root_directory_record;
#ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS #ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS
if (isonum_723 (pri->volume_set_size) != 1) if (isonum_723 (pri->volume_set_size) != 1)
goto out_no_support; goto out_no_support;
#endif /* IGNORE_WRONG_MULTI_VOLUME_SPECS */ #endif /* IGNORE_WRONG_MULTI_VOLUME_SPECS */
s->u.isofs_sb.s_nzones = isonum_733 (pri->volume_space_size); sbi->s_nzones = isonum_733 (pri->volume_space_size);
s->u.isofs_sb.s_log_zone_size = isonum_723 (pri->logical_block_size); sbi->s_log_zone_size = isonum_723 (pri->logical_block_size);
s->u.isofs_sb.s_max_size = isonum_733(pri->volume_space_size); sbi->s_max_size = isonum_733(pri->volume_space_size);
} }
s->u.isofs_sb.s_ninodes = 0; /* No way to figure this out easily */ sbi->s_ninodes = 0; /* No way to figure this out easily */
orig_zonesize = s -> u.isofs_sb.s_log_zone_size; orig_zonesize = sbi->s_log_zone_size;
/* /*
* If the zone size is smaller than the hardware sector size, * If the zone size is smaller than the hardware sector size,
* this is a fatal error. This would occur if the disc drive * this is a fatal error. This would occur if the disc drive
...@@ -680,10 +688,10 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -680,10 +688,10 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
goto out_bad_size; goto out_bad_size;
/* RDE: convert log zone size to bit shift */ /* RDE: convert log zone size to bit shift */
switch (s -> u.isofs_sb.s_log_zone_size) switch (sbi->s_log_zone_size)
{ case 512: s -> u.isofs_sb.s_log_zone_size = 9; break; { case 512: sbi->s_log_zone_size = 9; break;
case 1024: s -> u.isofs_sb.s_log_zone_size = 10; break; case 1024: sbi->s_log_zone_size = 10; break;
case 2048: s -> u.isofs_sb.s_log_zone_size = 11; break; case 2048: sbi->s_log_zone_size = 11; break;
default: default:
goto out_bad_zone_size; goto out_bad_zone_size;
...@@ -705,16 +713,16 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -705,16 +713,16 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
first_data_zone = ((isonum_733 (rootp->extent) + first_data_zone = ((isonum_733 (rootp->extent) +
isonum_711 (rootp->ext_attr_length)) isonum_711 (rootp->ext_attr_length))
<< s -> u.isofs_sb.s_log_zone_size); << sbi->s_log_zone_size);
s->u.isofs_sb.s_firstdatazone = first_data_zone; sbi->s_firstdatazone = first_data_zone;
#ifndef BEQUIET #ifndef BEQUIET
printk(KERN_DEBUG "Max size:%ld Log zone size:%ld\n", printk(KERN_DEBUG "Max size:%ld Log zone size:%ld\n",
s->u.isofs_sb.s_max_size, sbi->s_max_size,
1UL << s->u.isofs_sb.s_log_zone_size); 1UL << sbi->s_log_zone_size);
printk(KERN_DEBUG "First datazone:%ld Root inode number:%ld\n", printk(KERN_DEBUG "First datazone:%ld Root inode number:%ld\n",
s->u.isofs_sb.s_firstdatazone >> s -> u.isofs_sb.s_log_zone_size, sbi->s_firstdatazone >> sbi->s_log_zone_size,
s->u.isofs_sb.s_firstdatazone); sbi->s_firstdatazone);
if(high_sierra) if(sbi->s_high_sierra)
printk(KERN_DEBUG "Disc in High Sierra format.\n"); printk(KERN_DEBUG "Disc in High Sierra format.\n");
#endif #endif
...@@ -732,7 +740,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -732,7 +740,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
pri->root_directory_record; pri->root_directory_record;
first_data_zone = ((isonum_733 (rootp->extent) + first_data_zone = ((isonum_733 (rootp->extent) +
isonum_711 (rootp->ext_attr_length)) isonum_711 (rootp->ext_attr_length))
<< s -> u.isofs_sb.s_log_zone_size); << sbi->s_log_zone_size);
} }
/* /*
...@@ -761,43 +769,43 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -761,43 +769,43 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
*/ */
sb_set_blocksize(s, orig_zonesize); sb_set_blocksize(s, orig_zonesize);
s->u.isofs_sb.s_nls_iocharset = NULL; sbi->s_nls_iocharset = NULL;
#ifdef CONFIG_JOLIET #ifdef CONFIG_JOLIET
if (joliet_level && opt.utf8 == 0) { if (joliet_level && opt.utf8 == 0) {
char * p = opt.iocharset ? opt.iocharset : "iso8859-1"; char * p = opt.iocharset ? opt.iocharset : "iso8859-1";
s->u.isofs_sb.s_nls_iocharset = load_nls(p); sbi->s_nls_iocharset = load_nls(p);
if (! s->u.isofs_sb.s_nls_iocharset) { if (! sbi->s_nls_iocharset) {
/* Fail only if explicit charset specified */ /* Fail only if explicit charset specified */
if (opt.iocharset) if (opt.iocharset)
goto out_unlock; goto out_freesbi;
s->u.isofs_sb.s_nls_iocharset = load_nls_default(); sbi->s_nls_iocharset = load_nls_default();
} }
} }
#endif #endif
s->s_op = &isofs_sops; s->s_op = &isofs_sops;
s->u.isofs_sb.s_mapping = opt.map; sbi->s_mapping = opt.map;
s->u.isofs_sb.s_rock = (opt.rock == 'y' ? 2 : 0); sbi->s_rock = (opt.rock == 'y' ? 2 : 0);
s->u.isofs_sb.s_rock_offset = -1; /* initial offset, will guess until SP is found*/ sbi->s_rock_offset = -1; /* initial offset, will guess until SP is found*/
s->u.isofs_sb.s_cruft = opt.cruft; sbi->s_cruft = opt.cruft;
s->u.isofs_sb.s_unhide = opt.unhide; sbi->s_unhide = opt.unhide;
s->u.isofs_sb.s_uid = opt.uid; sbi->s_uid = opt.uid;
s->u.isofs_sb.s_gid = opt.gid; sbi->s_gid = opt.gid;
s->u.isofs_sb.s_utf8 = opt.utf8; sbi->s_utf8 = opt.utf8;
s->u.isofs_sb.s_nocompress = opt.nocompress; sbi->s_nocompress = opt.nocompress;
/* /*
* It would be incredibly stupid to allow people to mark every file * It would be incredibly stupid to allow people to mark every file
* on the disk as suid, so we merely allow them to set the default * on the disk as suid, so we merely allow them to set the default
* permissions. * permissions.
*/ */
s->u.isofs_sb.s_mode = opt.mode & 0777; sbi->s_mode = opt.mode & 0777;
/* /*
* Read the root inode, which _may_ result in changing * Read the root inode, which _may_ result in changing
* the s_rock flag. Once we have the final s_rock value, * the s_rock flag. Once we have the final s_rock value,
* we then decide whether to use the Joliet descriptor. * we then decide whether to use the Joliet descriptor.
*/ */
inode = iget(s, s->u.isofs_sb.s_firstdatazone); inode = iget(s, sbi->s_firstdatazone);
/* /*
* If this disk has both Rock Ridge and Joliet on it, then we * If this disk has both Rock Ridge and Joliet on it, then we
...@@ -807,16 +815,16 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -807,16 +815,16 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
* CD with Unicode names. Until someone sees such a beast, it * CD with Unicode names. Until someone sees such a beast, it
* will not be supported. * will not be supported.
*/ */
if (s->u.isofs_sb.s_rock == 1) { if (sbi->s_rock == 1) {
joliet_level = 0; joliet_level = 0;
} else if (joliet_level) { } else if (joliet_level) {
s->u.isofs_sb.s_rock = 0; sbi->s_rock = 0;
if (s->u.isofs_sb.s_firstdatazone != first_data_zone) { if (sbi->s_firstdatazone != first_data_zone) {
s->u.isofs_sb.s_firstdatazone = first_data_zone; sbi->s_firstdatazone = first_data_zone;
printk(KERN_DEBUG printk(KERN_DEBUG
"ISOFS: changing to secondary root\n"); "ISOFS: changing to secondary root\n");
iput(inode); iput(inode);
inode = iget(s, s->u.isofs_sb.s_firstdatazone); inode = iget(s, sbi->s_firstdatazone);
} }
} }
...@@ -825,7 +833,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -825,7 +833,7 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
if (joliet_level) opt.check = 'r'; if (joliet_level) opt.check = 'r';
else opt.check = 's'; else opt.check = 's';
} }
s->u.isofs_sb.s_joliet_level = joliet_level; sbi->s_joliet_level = joliet_level;
/* check the root inode */ /* check the root inode */
if (!inode) if (!inode)
...@@ -855,18 +863,18 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -855,18 +863,18 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
out_iput: out_iput:
iput(inode); iput(inode);
#ifdef CONFIG_JOLIET #ifdef CONFIG_JOLIET
if (s->u.isofs_sb.s_nls_iocharset) if (sbi->s_nls_iocharset)
unload_nls(s->u.isofs_sb.s_nls_iocharset); unload_nls(sbi->s_nls_iocharset);
#endif #endif
goto out_unlock; goto out_freesbi;
out_no_read: out_no_read:
printk(KERN_WARNING "isofs_fill_super: " printk(KERN_WARNING "isofs_fill_super: "
"bread failed, dev=%s, iso_blknum=%d, block=%d\n", "bread failed, dev=%s, iso_blknum=%d, block=%d\n",
s->s_id, iso_blknum, block); s->s_id, iso_blknum, block);
goto out_unlock; goto out_freesbi;
out_bad_zone_size: out_bad_zone_size:
printk(KERN_WARNING "Bad logical zone size %ld\n", printk(KERN_WARNING "Bad logical zone size %ld\n",
s->u.isofs_sb.s_log_zone_size); sbi->s_log_zone_size);
goto out_freebh; goto out_freebh;
out_bad_size: out_bad_size:
printk(KERN_WARNING "Logical zone size(%d) < hardware blocksize(%u)\n", printk(KERN_WARNING "Logical zone size(%d) < hardware blocksize(%u)\n",
...@@ -883,7 +891,9 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent) ...@@ -883,7 +891,9 @@ static int isofs_fill_super(struct super_block *s, void *data, int silent)
out_freebh: out_freebh:
brelse(bh); brelse(bh);
out_unlock: out_freesbi:
kfree(sbi);
s->u.generic_sbp = NULL;
return -EINVAL; return -EINVAL;
} }
...@@ -891,11 +901,11 @@ static int isofs_statfs (struct super_block *sb, struct statfs *buf) ...@@ -891,11 +901,11 @@ static int isofs_statfs (struct super_block *sb, struct statfs *buf)
{ {
buf->f_type = ISOFS_SUPER_MAGIC; buf->f_type = ISOFS_SUPER_MAGIC;
buf->f_bsize = sb->s_blocksize; buf->f_bsize = sb->s_blocksize;
buf->f_blocks = (sb->u.isofs_sb.s_nzones buf->f_blocks = (ISOFS_SB(sb)->s_nzones
<< (sb->u.isofs_sb.s_log_zone_size - sb->s_blocksize_bits)); << (ISOFS_SB(sb)->s_log_zone_size - sb->s_blocksize_bits));
buf->f_bfree = 0; buf->f_bfree = 0;
buf->f_bavail = 0; buf->f_bavail = 0;
buf->f_files = sb->u.isofs_sb.s_ninodes; buf->f_files = ISOFS_SB(sb)->s_ninodes;
buf->f_ffree = 0; buf->f_ffree = 0;
buf->f_namelen = NAME_MAX; buf->f_namelen = NAME_MAX;
return 0; return 0;
...@@ -1058,7 +1068,7 @@ static int isofs_read_level3_size(struct inode * inode) ...@@ -1058,7 +1068,7 @@ static int isofs_read_level3_size(struct inode * inode)
{ {
unsigned long f_pos = inode->i_ino; unsigned long f_pos = inode->i_ino;
unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
int high_sierra = inode->i_sb->u.isofs_sb.s_high_sierra; int high_sierra = ISOFS_SB(inode->i_sb)->s_high_sierra;
struct buffer_head * bh = NULL; struct buffer_head * bh = NULL;
unsigned long block, offset; unsigned long block, offset;
int i = 0; int i = 0;
...@@ -1157,9 +1167,10 @@ static int isofs_read_level3_size(struct inode * inode) ...@@ -1157,9 +1167,10 @@ static int isofs_read_level3_size(struct inode * inode)
static void isofs_read_inode(struct inode * inode) static void isofs_read_inode(struct inode * inode)
{ {
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct isofs_sb_info *sbi = ISOFS_SB(sb);
unsigned long bufsize = ISOFS_BUFFER_SIZE(inode); unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
int block = inode->i_ino >> ISOFS_BUFFER_BITS(inode); int block = inode->i_ino >> ISOFS_BUFFER_BITS(inode);
int high_sierra = sb->u.isofs_sb.s_high_sierra; int high_sierra = sbi->s_high_sierra;
struct buffer_head * bh = NULL; struct buffer_head * bh = NULL;
struct iso_directory_record * de; struct iso_directory_record * de;
struct iso_directory_record * tmpde = NULL; struct iso_directory_record * tmpde = NULL;
...@@ -1205,7 +1216,7 @@ static void isofs_read_inode(struct inode * inode) ...@@ -1205,7 +1216,7 @@ static void isofs_read_inode(struct inode * inode)
do it the hard way. */ do it the hard way. */
} else { } else {
/* Everybody gets to read the file. */ /* Everybody gets to read the file. */
inode->i_mode = inode->i_sb->u.isofs_sb.s_mode; inode->i_mode = sbi->s_mode;
inode->i_nlink = 1; inode->i_nlink = 1;
inode->i_mode |= S_IFREG; inode->i_mode |= S_IFREG;
/* If there are no periods in the name, /* If there are no periods in the name,
...@@ -1217,8 +1228,8 @@ static void isofs_read_inode(struct inode * inode) ...@@ -1217,8 +1228,8 @@ static void isofs_read_inode(struct inode * inode)
if(i == de->name_len[0] || de->name[i] == ';') if(i == de->name_len[0] || de->name[i] == ';')
inode->i_mode |= S_IXUGO; /* execute permission */ inode->i_mode |= S_IXUGO; /* execute permission */
} }
inode->i_uid = inode->i_sb->u.isofs_sb.s_uid; inode->i_uid = sbi->s_uid;
inode->i_gid = inode->i_sb->u.isofs_sb.s_gid; inode->i_gid = sbi->s_gid;
inode->i_blocks = inode->i_blksize = 0; inode->i_blocks = inode->i_blksize = 0;
ei->i_format_parm[0] = 0; ei->i_format_parm[0] = 0;
...@@ -1241,10 +1252,10 @@ static void isofs_read_inode(struct inode * inode) ...@@ -1241,10 +1252,10 @@ static void isofs_read_inode(struct inode * inode)
* legal. Do not prevent to use DVD's schilling@fokus.gmd.de * legal. Do not prevent to use DVD's schilling@fokus.gmd.de
*/ */
if ((inode->i_size < 0 || inode->i_size > 0x7FFFFFFE) && if ((inode->i_size < 0 || inode->i_size > 0x7FFFFFFE) &&
inode->i_sb->u.isofs_sb.s_cruft == 'n') { sbi->s_cruft == 'n') {
printk(KERN_WARNING "Warning: defective CD-ROM. " printk(KERN_WARNING "Warning: defective CD-ROM. "
"Enabling \"cruft\" mount option.\n"); "Enabling \"cruft\" mount option.\n");
inode->i_sb->u.isofs_sb.s_cruft = 'y'; sbi->s_cruft = 'y';
} }
/* /*
...@@ -1254,7 +1265,7 @@ static void isofs_read_inode(struct inode * inode) ...@@ -1254,7 +1265,7 @@ static void isofs_read_inode(struct inode * inode)
* on the CDROM. * on the CDROM.
*/ */
if (inode->i_sb->u.isofs_sb.s_cruft == 'y' && if (sbi->s_cruft == 'y' &&
inode->i_size & 0xff000000) { inode->i_size & 0xff000000) {
inode->i_size &= 0x00ffffff; inode->i_size &= 0x00ffffff;
} }
...@@ -1298,8 +1309,8 @@ static void isofs_read_inode(struct inode * inode) ...@@ -1298,8 +1309,8 @@ static void isofs_read_inode(struct inode * inode)
if (!high_sierra) { if (!high_sierra) {
parse_rock_ridge_inode(de, inode); parse_rock_ridge_inode(de, inode);
/* if we want uid/gid set, override the rock ridge setting */ /* if we want uid/gid set, override the rock ridge setting */
test_and_set_uid(&inode->i_uid, inode->i_sb->u.isofs_sb.s_uid); test_and_set_uid(&inode->i_uid, sbi->s_uid);
test_and_set_gid(&inode->i_gid, inode->i_sb->u.isofs_sb.s_gid); test_and_set_gid(&inode->i_gid, sbi->s_gid);
} }
/* get the volume sequence number */ /* get the volume sequence number */
...@@ -1311,17 +1322,17 @@ static void isofs_read_inode(struct inode * inode) ...@@ -1311,17 +1322,17 @@ static void isofs_read_inode(struct inode * inode)
* of which is limiting the file size to 16Mb. Thus we silently allow * of which is limiting the file size to 16Mb. Thus we silently allow
* volume numbers of 0 to go through without complaining. * volume numbers of 0 to go through without complaining.
*/ */
if (inode->i_sb->u.isofs_sb.s_cruft == 'n' && if (sbi->s_cruft == 'n' &&
(volume_seq_no != 0) && (volume_seq_no != 1)) { (volume_seq_no != 0) && (volume_seq_no != 1)) {
printk(KERN_WARNING "Warning: defective CD-ROM " printk(KERN_WARNING "Warning: defective CD-ROM "
"(volume sequence number %d). " "(volume sequence number %d). "
"Enabling \"cruft\" mount option.\n", volume_seq_no); "Enabling \"cruft\" mount option.\n", volume_seq_no);
inode->i_sb->u.isofs_sb.s_cruft = 'y'; sbi->s_cruft = 'y';
} }
/* Install the inode operations vector */ /* Install the inode operations vector */
#ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS #ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS
if (inode->i_sb->u.isofs_sb.s_cruft != 'y' && if (sbi->s_cruft != 'y' &&
(volume_seq_no != 0) && (volume_seq_no != 1)) { (volume_seq_no != 0) && (volume_seq_no != 1)) {
printk(KERN_WARNING "Multi-volume CD somehow got mounted.\n"); printk(KERN_WARNING "Multi-volume CD somehow got mounted.\n");
} else } else
......
...@@ -77,8 +77,8 @@ get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, st ...@@ -77,8 +77,8 @@ get_joliet_filename(struct iso_directory_record * de, unsigned char *outname, st
struct nls_table *nls; struct nls_table *nls;
unsigned char len = 0; unsigned char len = 0;
utf8 = inode->i_sb->u.isofs_sb.s_utf8; utf8 = ISOFS_SB(inode->i_sb)->s_utf8;
nls = inode->i_sb->u.isofs_sb.s_nls_iocharset; nls = ISOFS_SB(inode->i_sb)->s_nls_iocharset;
if (utf8) { if (utf8) {
len = wcsntombs_be(outname, de->name, len = wcsntombs_be(outname, de->name,
......
...@@ -65,6 +65,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, ...@@ -65,6 +65,7 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
unsigned char bufbits = ISOFS_BUFFER_BITS(dir); unsigned char bufbits = ISOFS_BUFFER_BITS(dir);
unsigned int block, f_pos, offset; unsigned int block, f_pos, offset;
struct buffer_head * bh = NULL; struct buffer_head * bh = NULL;
struct isofs_sb_info *sbi = ISOFS_SB(dir->i_sb);
if (!ISOFS_I(dir)->i_first_extent) if (!ISOFS_I(dir)->i_first_extent)
return 0; return 0;
...@@ -120,19 +121,19 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, ...@@ -120,19 +121,19 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
dlen = de->name_len[0]; dlen = de->name_len[0];
dpnt = de->name; dpnt = de->name;
if (dir->i_sb->u.isofs_sb.s_rock && if (sbi->s_rock &&
((i = get_rock_ridge_filename(de, tmpname, dir)))) { ((i = get_rock_ridge_filename(de, tmpname, dir)))) {
dlen = i; /* possibly -1 */ dlen = i; /* possibly -1 */
dpnt = tmpname; dpnt = tmpname;
#ifdef CONFIG_JOLIET #ifdef CONFIG_JOLIET
} else if (dir->i_sb->u.isofs_sb.s_joliet_level) { } else if (sbi->s_joliet_level) {
dlen = get_joliet_filename(de, tmpname, dir); dlen = get_joliet_filename(de, tmpname, dir);
dpnt = tmpname; dpnt = tmpname;
#endif #endif
} else if (dir->i_sb->u.isofs_sb.s_mapping == 'a') { } else if (sbi->s_mapping == 'a') {
dlen = get_acorn_filename(de, tmpname, dir); dlen = get_acorn_filename(de, tmpname, dir);
dpnt = tmpname; dpnt = tmpname;
} else if (dir->i_sb->u.isofs_sb.s_mapping == 'n') { } else if (sbi->s_mapping == 'n') {
dlen = isofs_name_translate(de, tmpname, dir); dlen = isofs_name_translate(de, tmpname, dir);
dpnt = tmpname; dpnt = tmpname;
} }
...@@ -142,8 +143,8 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry, ...@@ -142,8 +143,8 @@ isofs_find_entry(struct inode *dir, struct dentry *dentry,
*/ */
match = 0; match = 0;
if (dlen > 0 && if (dlen > 0 &&
(!(de->flags[-dir->i_sb->u.isofs_sb.s_high_sierra] & 5) (!(de->flags[-sbi->s_high_sierra] & 5)
|| dir->i_sb->u.isofs_sb.s_unhide == 'y')) || sbi->s_unhide == 'y'))
{ {
match = (isofs_cmp(dentry,dpnt,dlen) == 0); match = (isofs_cmp(dentry,dpnt,dlen) == 0);
} }
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
#define CHECK_SP(FAIL) \ #define CHECK_SP(FAIL) \
if(rr->u.SP.magic[0] != 0xbe) FAIL; \ if(rr->u.SP.magic[0] != 0xbe) FAIL; \
if(rr->u.SP.magic[1] != 0xef) FAIL; \ if(rr->u.SP.magic[1] != 0xef) FAIL; \
inode->i_sb->u.isofs_sb.s_rock_offset=rr->u.SP.skip; ISOFS_SB(inode->i_sb)->s_rock_offset=rr->u.SP.skip;
/* We define a series of macros because each function must do exactly the /* We define a series of macros because each function must do exactly the
same thing in certain places. We use the macros to ensure that everything same thing in certain places. We use the macros to ensure that everything
is done correctly */ is done correctly */
...@@ -51,10 +51,10 @@ ...@@ -51,10 +51,10 @@
if(LEN & 1) LEN++; \ if(LEN & 1) LEN++; \
CHR = ((unsigned char *) DE) + LEN; \ CHR = ((unsigned char *) DE) + LEN; \
LEN = *((unsigned char *) DE) - LEN; \ LEN = *((unsigned char *) DE) - LEN; \
if (inode->i_sb->u.isofs_sb.s_rock_offset!=-1) \ if (ISOFS_SB(inode->i_sb)->s_rock_offset!=-1) \
{ \ { \
LEN-=inode->i_sb->u.isofs_sb.s_rock_offset; \ LEN-=ISOFS_SB(inode->i_sb)->s_rock_offset; \
CHR+=inode->i_sb->u.isofs_sb.s_rock_offset; \ CHR+=ISOFS_SB(inode->i_sb)->s_rock_offset; \
if (LEN<0) LEN=0; \ if (LEN<0) LEN=0; \
} \ } \
} }
...@@ -102,7 +102,7 @@ int find_rock_ridge_relocation(struct iso_directory_record * de, ...@@ -102,7 +102,7 @@ int find_rock_ridge_relocation(struct iso_directory_record * de,
/* Return value if we do not find appropriate record. */ /* Return value if we do not find appropriate record. */
retval = isonum_733 (de->extent); retval = isonum_733 (de->extent);
if (!inode->i_sb->u.isofs_sb.s_rock) return retval; if (!ISOFS_SB(inode->i_sb)->s_rock) return retval;
SETUP_ROCK_RIDGE(de, chr, len); SETUP_ROCK_RIDGE(de, chr, len);
repeat: repeat:
...@@ -162,7 +162,7 @@ int get_rock_ridge_filename(struct iso_directory_record * de, ...@@ -162,7 +162,7 @@ int get_rock_ridge_filename(struct iso_directory_record * de,
CONTINUE_DECLS; CONTINUE_DECLS;
int retnamlen = 0, truncate=0; int retnamlen = 0, truncate=0;
if (!inode->i_sb->u.isofs_sb.s_rock) return 0; if (!ISOFS_SB(inode->i_sb)->s_rock) return 0;
*retname = 0; *retname = 0;
SETUP_ROCK_RIDGE(de, chr, len); SETUP_ROCK_RIDGE(de, chr, len);
...@@ -234,7 +234,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -234,7 +234,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
int symlink_len = 0; int symlink_len = 0;
CONTINUE_DECLS; CONTINUE_DECLS;
if (!inode->i_sb->u.isofs_sb.s_rock) return 0; if (!ISOFS_SB(inode->i_sb)->s_rock) return 0;
SETUP_ROCK_RIDGE(de, chr, len); SETUP_ROCK_RIDGE(de, chr, len);
if (regard_xa) if (regard_xa)
...@@ -272,7 +272,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -272,7 +272,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
CHECK_CE; CHECK_CE;
break; break;
case SIG('E','R'): case SIG('E','R'):
inode->i_sb->u.isofs_sb.s_rock = 1; ISOFS_SB(inode->i_sb)->s_rock = 1;
printk(KERN_DEBUG "ISO 9660 Extensions: "); printk(KERN_DEBUG "ISO 9660 Extensions: ");
{ int p; { int p;
for(p=0;p<rr->u.ER.len_id;p++) printk("%c",rr->u.ER.data[p]); for(p=0;p<rr->u.ER.len_id;p++) printk("%c",rr->u.ER.data[p]);
...@@ -368,7 +368,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -368,7 +368,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
ISOFS_I(inode)->i_first_extent = isonum_733(rr->u.CL.location); ISOFS_I(inode)->i_first_extent = isonum_733(rr->u.CL.location);
reloc = iget(inode->i_sb, reloc = iget(inode->i_sb,
(ISOFS_I(inode)->i_first_extent << (ISOFS_I(inode)->i_first_extent <<
inode -> i_sb -> u.isofs_sb.s_log_zone_size)); ISOFS_SB(inode->i_sb)->s_log_zone_size));
if (!reloc) if (!reloc)
goto out; goto out;
inode->i_mode = reloc->i_mode; inode->i_mode = reloc->i_mode;
...@@ -385,7 +385,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de, ...@@ -385,7 +385,7 @@ int parse_rock_ridge_inode_internal(struct iso_directory_record * de,
break; break;
#ifdef CONFIG_ZISOFS #ifdef CONFIG_ZISOFS
case SIG('Z','F'): case SIG('Z','F'):
if ( !inode->i_sb->u.isofs_sb.s_nocompress ) { if ( !ISOFS_SB(inode->i_sb)->s_nocompress ) {
int algo; int algo;
algo = isonum_721(rr->u.ZF.algorithm); algo = isonum_721(rr->u.ZF.algorithm);
if ( algo == SIG('p','z') ) { if ( algo == SIG('p','z') ) {
...@@ -478,8 +478,8 @@ int parse_rock_ridge_inode(struct iso_directory_record * de, ...@@ -478,8 +478,8 @@ int parse_rock_ridge_inode(struct iso_directory_record * de,
int result=parse_rock_ridge_inode_internal(de,inode,0); int result=parse_rock_ridge_inode_internal(de,inode,0);
/* if rockridge flag was reset and we didn't look for attributes /* if rockridge flag was reset and we didn't look for attributes
* behind eventual XA attributes, have a look there */ * behind eventual XA attributes, have a look there */
if ((inode->i_sb->u.isofs_sb.s_rock_offset==-1) if ((ISOFS_SB(inode->i_sb)->s_rock_offset==-1)
&&(inode->i_sb->u.isofs_sb.s_rock==2)) &&(ISOFS_SB(inode->i_sb)->s_rock==2))
{ {
result=parse_rock_ridge_inode_internal(de,inode,14); result=parse_rock_ridge_inode_internal(de,inode,14);
}; };
...@@ -506,7 +506,7 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page) ...@@ -506,7 +506,7 @@ static int rock_ridge_symlink_readpage(struct file *file, struct page *page)
unsigned char *chr; unsigned char *chr;
struct rock_ridge *rr; struct rock_ridge *rr;
if (!inode->i_sb->u.isofs_sb.s_rock) if (!ISOFS_SB(inode->i_sb)->s_rock)
panic ("Cannot have symlink with high sierra variant of iso filesystem\n"); panic ("Cannot have symlink with high sierra variant of iso filesystem\n");
block = inode->i_ino >> bufbits; block = inode->i_ino >> bufbits;
......
...@@ -648,7 +648,6 @@ struct quota_mount_options ...@@ -648,7 +648,6 @@ struct quota_mount_options
#include <linux/ext3_fs_sb.h> #include <linux/ext3_fs_sb.h>
#include <linux/hpfs_fs_sb.h> #include <linux/hpfs_fs_sb.h>
#include <linux/ntfs_fs_sb.h> #include <linux/ntfs_fs_sb.h>
#include <linux/iso_fs_sb.h>
#include <linux/sysv_fs_sb.h> #include <linux/sysv_fs_sb.h>
#include <linux/affs_fs_sb.h> #include <linux/affs_fs_sb.h>
#include <linux/ufs_fs_sb.h> #include <linux/ufs_fs_sb.h>
...@@ -697,7 +696,6 @@ struct super_block { ...@@ -697,7 +696,6 @@ struct super_block {
struct ext3_sb_info ext3_sb; struct ext3_sb_info ext3_sb;
struct hpfs_sb_info hpfs_sb; struct hpfs_sb_info hpfs_sb;
struct ntfs_sb_info ntfs_sb; struct ntfs_sb_info ntfs_sb;
struct isofs_sb_info isofs_sb;
struct sysv_sb_info sysv_sb; struct sysv_sb_info sysv_sb;
struct affs_sb_info affs_sb; struct affs_sb_info affs_sb;
struct ufs_sb_info ufs_sb; struct ufs_sb_info ufs_sb;
......
...@@ -160,7 +160,6 @@ struct iso_directory_record { ...@@ -160,7 +160,6 @@ struct iso_directory_record {
#define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize) #define ISOFS_BUFFER_SIZE(INODE) ((INODE)->i_sb->s_blocksize)
#define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits) #define ISOFS_BUFFER_BITS(INODE) ((INODE)->i_sb->s_blocksize_bits)
#define ISOFS_ZONE_BITS(INODE) ((INODE)->i_sb->u.isofs_sb.s_log_zone_size)
#define ISOFS_SUPER_MAGIC 0x9660 #define ISOFS_SUPER_MAGIC 0x9660
...@@ -171,6 +170,12 @@ struct iso_directory_record { ...@@ -171,6 +170,12 @@ struct iso_directory_record {
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <asm/unaligned.h> #include <asm/unaligned.h>
#include <linux/iso_fs_i.h> #include <linux/iso_fs_i.h>
#include <linux/iso_fs_sb.h>
static inline struct isofs_sb_info *ISOFS_SB(struct super_block *sb)
{
return sb->u.generic_sbp;
}
static inline struct iso_inode_info *ISOFS_I(struct inode *inode) static inline struct iso_inode_info *ISOFS_I(struct inode *inode)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment