--- vanilla-2.4.1/fs/isofs/namei.c Sat Dec 30 01:13:46 2000 +++ cisofs/fs/isofs/namei.c Mon Feb 19 18:42:05 2001 @@ -1,9 +1,9 @@ /* * linux/fs/isofs/namei.c * - * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. - * * (C) 1991 Linus Torvalds - minix filesystem + * (C) 1992 Eric Youngdale - Modified for ISO 9660 filesystem. + * (C) 2001 zhaoway - Transparent *.cramed uncompressing */ #include @@ -57,7 +57,8 @@ */ static unsigned long isofs_find_entry(struct inode *dir, struct dentry *dentry, - char * tmpname, struct iso_directory_record * tmpde) + char *tmpname, struct iso_directory_record *tmpde, + unsigned char *i_compr) { unsigned long inode_number; unsigned long bufsize = ISOFS_BUFFER_SIZE(dir); @@ -74,7 +75,7 @@ while (f_pos < dir->i_size) { struct iso_directory_record * de; - int de_len, match, i, dlen; + int de_len, match, dlen; char *dpnt; if (!bh) { @@ -116,16 +117,26 @@ de = tmpde; } - dlen = de->name_len[0]; - dpnt = de->name; - if (dir->i_sb->u.isofs_sb.s_rock && - ((i = get_rock_ridge_filename(de, tmpname, dir)))) { - dlen = i; /* possibly -1 */ + (dlen = get_rock_ridge_filename(de, tmpname, dir))) { /* may be -1 */ +#ifdef CONFIG_CISOFS + /* Drop trailing '.cramed' */ + if (dlen > 7 && (! strncmp(&tmpname[dlen - 7], ".cramed", 7))) { + dlen -= 7; + tmpname[dlen] = '\0'; + } +#endif dpnt = tmpname; #ifdef CONFIG_JOLIET } else if (dir->i_sb->u.isofs_sb.s_joliet_level) { dlen = get_joliet_filename(de, tmpname, dir); +# ifdef CONFIG_CISOFS + /* Drop trailing '.cramed' */ + if (dlen > 7 && (! strncmp(&tmpname[dlen - 7], ".cramed", 7))) { + dlen -= 7; + tmpname[dlen] = '\0'; + } +# endif dpnt = tmpname; #endif } else if (dir->i_sb->u.isofs_sb.s_mapping == 'a') { @@ -134,6 +145,9 @@ } else if (dir->i_sb->u.isofs_sb.s_mapping == 'n') { dlen = isofs_name_translate(de, tmpname, dir); dpnt = tmpname; + } else { + dlen = de->name_len[0]; + dpnt = de->name; } /* @@ -160,6 +174,7 @@ unsigned long ino; struct inode *inode; struct page *page; + unsigned char i_compr = 0; dentry->d_op = dir->i_sb->s_root->d_op; @@ -168,7 +183,7 @@ return ERR_PTR(-ENOMEM); ino = isofs_find_entry(dir, dentry, page_address(page), - 1024 + page_address(page)); + 1024 + page_address(page), &i_compr); __free_page(page); inode = NULL; @@ -177,6 +192,9 @@ if (!inode) return ERR_PTR(-EACCES); } +#ifdef CONFIG_CISOFS + inode->u.isofs_i.i_compr = i_compr; +#endif d_add(dentry, inode); return NULL; }