diff options
Diffstat (limited to 'fs/efs')
| -rw-r--r-- | fs/efs/Kconfig | 4 | ||||
| -rw-r--r-- | fs/efs/dir.c | 89 | ||||
| -rw-r--r-- | fs/efs/efs.h | 8 | ||||
| -rw-r--r-- | fs/efs/file.c | 14 | ||||
| -rw-r--r-- | fs/efs/inode.c | 51 | ||||
| -rw-r--r-- | fs/efs/namei.c | 18 | ||||
| -rw-r--r-- | fs/efs/super.c | 101 | 
7 files changed, 139 insertions, 146 deletions
diff --git a/fs/efs/Kconfig b/fs/efs/Kconfig index 6ebfc1c207a..d020e3c30fe 100644 --- a/fs/efs/Kconfig +++ b/fs/efs/Kconfig @@ -1,6 +1,6 @@  config EFS_FS -	tristate "EFS file system support (read only) (EXPERIMENTAL)" -	depends on BLOCK && EXPERIMENTAL +	tristate "EFS file system support (read only)" +	depends on BLOCK  	help  	  EFS is an older file system used for non-ISO9660 CD-ROMs and hard  	  disk partitions by SGI's IRIX operating system (IRIX 6.0 and newer diff --git a/fs/efs/dir.c b/fs/efs/dir.c index 7ee6f7e3a60..ce63b24f7c3 100644 --- a/fs/efs/dir.c +++ b/fs/efs/dir.c @@ -7,104 +7,97 @@  #include <linux/buffer_head.h>  #include "efs.h" -static int efs_readdir(struct file *, void *, filldir_t); +static int efs_readdir(struct file *, struct dir_context *);  const struct file_operations efs_dir_operations = {  	.llseek		= generic_file_llseek,  	.read		= generic_read_dir, -	.readdir	= efs_readdir, +	.iterate	= efs_readdir,  };  const struct inode_operations efs_dir_inode_operations = {  	.lookup		= efs_lookup,  }; -static int efs_readdir(struct file *filp, void *dirent, filldir_t filldir) { -	struct inode *inode = filp->f_path.dentry->d_inode; -	struct buffer_head *bh; - -	struct efs_dir		*dirblock; -	struct efs_dentry	*dirslot; -	efs_ino_t		inodenum; +static int efs_readdir(struct file *file, struct dir_context *ctx) +{ +	struct inode *inode = file_inode(file);  	efs_block_t		block; -	int			slot, namelen; -	char			*nameptr; +	int			slot;  	if (inode->i_size & (EFS_DIRBSIZE-1)) -		printk(KERN_WARNING "EFS: WARNING: readdir(): directory size not a multiple of EFS_DIRBSIZE\n"); +		pr_warn("%s(): directory size not a multiple of EFS_DIRBSIZE\n", +			__func__);  	/* work out where this entry can be found */ -	block = filp->f_pos >> EFS_DIRBSIZE_BITS; +	block = ctx->pos >> EFS_DIRBSIZE_BITS;  	/* each block contains at most 256 slots */ -	slot  = filp->f_pos & 0xff; +	slot  = ctx->pos & 0xff;  	/* look at all blocks */  	while (block < inode->i_blocks) { +		struct efs_dir		*dirblock; +		struct buffer_head *bh; +  		/* read the dir block */  		bh = sb_bread(inode->i_sb, efs_bmap(inode, block));  		if (!bh) { -			printk(KERN_ERR "EFS: readdir(): failed to read dir block %d\n", block); +			pr_err("%s(): failed to read dir block %d\n", +			       __func__, block);  			break;  		}  		dirblock = (struct efs_dir *) bh->b_data;   		if (be16_to_cpu(dirblock->magic) != EFS_DIRBLK_MAGIC) { -			printk(KERN_ERR "EFS: readdir(): invalid directory block\n"); +			pr_err("%s(): invalid directory block\n", __func__);  			brelse(bh);  			break;  		} -		while (slot < dirblock->slots) { -			if (dirblock->space[slot] == 0) { -				slot++; +		for (; slot < dirblock->slots; slot++) { +			struct efs_dentry *dirslot; +			efs_ino_t inodenum; +			const char *nameptr; +			int namelen; + +			if (dirblock->space[slot] == 0)  				continue; -			}  			dirslot  = (struct efs_dentry *) (((char *) bh->b_data) + EFS_SLOTAT(dirblock, slot));  			inodenum = be32_to_cpu(dirslot->inode);  			namelen  = dirslot->namelen;  			nameptr  = dirslot->name; +			pr_debug("%s(): block %d slot %d/%d: inode %u, name \"%s\", namelen %u\n", +				 __func__, block, slot, dirblock->slots-1, +				 inodenum, nameptr, namelen); +			if (!namelen) +				continue; +			/* found the next entry */ +			ctx->pos = (block << EFS_DIRBSIZE_BITS) | slot; -#ifdef DEBUG -			printk(KERN_DEBUG "EFS: readdir(): block %d slot %d/%d: inode %u, name \"%s\", namelen %u\n", block, slot, dirblock->slots-1, inodenum, nameptr, namelen); -#endif -			if (namelen > 0) { -				/* found the next entry */ -				filp->f_pos = (block << EFS_DIRBSIZE_BITS) | slot; - -				/* copy filename and data in dirslot */ -				filldir(dirent, nameptr, namelen, filp->f_pos, inodenum, DT_UNKNOWN); - -				/* sanity check */ -				if (nameptr - (char *) dirblock + namelen > EFS_DIRBSIZE) { -					printk(KERN_WARNING "EFS: directory entry %d exceeds directory block\n", slot); -					slot++; -					continue; -				} - -				/* store position of next slot */ -				if (++slot == dirblock->slots) { -					slot = 0; -					block++; -				} +			/* sanity check */ +			if (nameptr - (char *) dirblock + namelen > EFS_DIRBSIZE) { +				pr_warn("directory entry %d exceeds directory block\n", +					slot); +				continue; +			} + +			/* copy filename and data in dirslot */ +			if (!dir_emit(ctx, nameptr, namelen, inodenum, DT_UNKNOWN)) {  				brelse(bh); -				filp->f_pos = (block << EFS_DIRBSIZE_BITS) | slot; -				goto out; +				return 0;  			} -			slot++;  		}  		brelse(bh);  		slot = 0;  		block++;  	} - -	filp->f_pos = (block << EFS_DIRBSIZE_BITS) | slot; -out: +	ctx->pos = (block << EFS_DIRBSIZE_BITS) | slot;  	return 0;  } diff --git a/fs/efs/efs.h b/fs/efs/efs.h index d8305b582ab..5bbf9612140 100644 --- a/fs/efs/efs.h +++ b/fs/efs/efs.h @@ -7,6 +7,12 @@  #ifndef _EFS_EFS_H_  #define _EFS_EFS_H_ +#ifdef pr_fmt +#undef pr_fmt +#endif + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +  #include <linux/fs.h>  #include <asm/uaccess.h> @@ -129,7 +135,7 @@ extern struct inode *efs_iget(struct super_block *, unsigned long);  extern efs_block_t efs_map_block(struct inode *, efs_block_t);  extern int efs_get_block(struct inode *, sector_t, struct buffer_head *, int); -extern struct dentry *efs_lookup(struct inode *, struct dentry *, struct nameidata *); +extern struct dentry *efs_lookup(struct inode *, struct dentry *, unsigned int);  extern struct dentry *efs_fh_to_dentry(struct super_block *sb, struct fid *fid,  		int fh_len, int fh_type);  extern struct dentry *efs_fh_to_parent(struct super_block *sb, struct fid *fid, diff --git a/fs/efs/file.c b/fs/efs/file.c index 1ccb364ffa6..a37dcee4686 100644 --- a/fs/efs/file.c +++ b/fs/efs/file.c @@ -22,10 +22,8 @@ int efs_get_block(struct inode *inode, sector_t iblock,  		/*  		 * i have no idea why this happens as often as it does  		 */ -		printk(KERN_WARNING "EFS: bmap(): block %d >= %ld (filesize %ld)\n", -			block, -			inode->i_blocks, -			inode->i_size); +		pr_warn("%s(): block %d >= %ld (filesize %ld)\n", +			__func__, block, inode->i_blocks, inode->i_size);  #endif  		return 0;  	} @@ -38,7 +36,7 @@ int efs_get_block(struct inode *inode, sector_t iblock,  int efs_bmap(struct inode *inode, efs_block_t block) {  	if (block < 0) { -		printk(KERN_WARNING "EFS: bmap(): block < 0\n"); +		pr_warn("%s(): block < 0\n", __func__);  		return 0;  	} @@ -48,10 +46,8 @@ int efs_bmap(struct inode *inode, efs_block_t block) {  		/*  		 * i have no idea why this happens as often as it does  		 */ -		printk(KERN_WARNING "EFS: bmap(): block %d >= %ld (filesize %ld)\n", -			block, -			inode->i_blocks, -			inode->i_size); +		pr_warn("%s(): block %d >= %ld (filesize %ld)\n", +			__func__, block, inode->i_blocks, inode->i_size);  #endif  		return 0;  	} diff --git a/fs/efs/inode.c b/fs/efs/inode.c index a8e7797b947..079d20306ee 100644 --- a/fs/efs/inode.c +++ b/fs/efs/inode.c @@ -23,7 +23,6 @@ static sector_t _efs_bmap(struct address_space *mapping, sector_t block)  }  static const struct address_space_operations efs_aops = {  	.readpage = efs_readpage, -	.sync_page = block_sync_page,  	.bmap = _efs_bmap  }; @@ -58,7 +57,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino)  	struct inode *inode;  	inode = iget_locked(super, ino); -	if (IS_ERR(inode)) +	if (!inode)  		return ERR_PTR(-ENOMEM);  	if (!(inode->i_state & I_NEW))  		return inode; @@ -90,16 +89,16 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino)  	bh = sb_bread(inode->i_sb, block);  	if (!bh) { -		printk(KERN_WARNING "EFS: bread() failed at block %d\n", block); +		pr_warn("%s() failed at block %d\n", __func__, block);  		goto read_inode_error;  	}  	efs_inode = (struct efs_dinode *) (bh->b_data + offset);  	inode->i_mode  = be16_to_cpu(efs_inode->di_mode); -	inode->i_nlink = be16_to_cpu(efs_inode->di_nlink); -	inode->i_uid   = (uid_t)be16_to_cpu(efs_inode->di_uid); -	inode->i_gid   = (gid_t)be16_to_cpu(efs_inode->di_gid); +	set_nlink(inode, be16_to_cpu(efs_inode->di_nlink)); +	i_uid_write(inode, (uid_t)be16_to_cpu(efs_inode->di_uid)); +	i_gid_write(inode, (gid_t)be16_to_cpu(efs_inode->di_gid));  	inode->i_size  = be32_to_cpu(efs_inode->di_size);  	inode->i_atime.tv_sec = be32_to_cpu(efs_inode->di_atime);  	inode->i_mtime.tv_sec = be32_to_cpu(efs_inode->di_mtime); @@ -131,19 +130,16 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino)  	for(i = 0; i < EFS_DIRECTEXTENTS; i++) {  		extent_copy(&(efs_inode->di_u.di_extents[i]), &(in->extents[i]));  		if (i < in->numextents && in->extents[i].cooked.ex_magic != 0) { -			printk(KERN_WARNING "EFS: extent %d has bad magic number in inode %lu\n", i, inode->i_ino); +			pr_warn("extent %d has bad magic number in inode %lu\n", +				i, inode->i_ino);  			brelse(bh);  			goto read_inode_error;  		}  	}  	brelse(bh); -    -#ifdef DEBUG -	printk(KERN_DEBUG "EFS: efs_iget(): inode %lu, extents %d, mode %o\n", -		inode->i_ino, in->numextents, inode->i_mode); -#endif - +	pr_debug("efs_iget(): inode %lu, extents %d, mode %o\n", +		 inode->i_ino, in->numextents, inode->i_mode);  	switch (inode->i_mode & S_IFMT) {  		case S_IFDIR:   			inode->i_op = &efs_dir_inode_operations;  @@ -163,7 +159,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino)  			init_special_inode(inode, inode->i_mode, device);  			break;  		default: -			printk(KERN_WARNING "EFS: unsupported inode mode %o\n", inode->i_mode); +			pr_warn("unsupported inode mode %o\n", inode->i_mode);  			goto read_inode_error;  			break;  	} @@ -172,7 +168,7 @@ struct inode *efs_iget(struct super_block *super, unsigned long ino)  	return inode;  read_inode_error: -	printk(KERN_WARNING "EFS: failed to read inode %lu\n", inode->i_ino); +	pr_warn("failed to read inode %lu\n", inode->i_ino);  	iget_failed(inode);  	return ERR_PTR(-EIO);  } @@ -217,7 +213,7 @@ efs_block_t efs_map_block(struct inode *inode, efs_block_t block) {  		/* if we only have one extent then nothing can be found */  		if (in->numextents == 1) { -			printk(KERN_ERR "EFS: map_block() failed to map (1 extent)\n"); +			pr_err("%s() failed to map (1 extent)\n", __func__);  			return 0;  		} @@ -235,13 +231,12 @@ efs_block_t efs_map_block(struct inode *inode, efs_block_t block) {  			}  		} -		printk(KERN_ERR "EFS: map_block() failed to map block %u (dir)\n", block); +		pr_err("%s() failed to map block %u (dir)\n", __func__, block);  		return 0;  	} -#ifdef DEBUG -	printk(KERN_DEBUG "EFS: map_block(): indirect search for logical block %u\n", block); -#endif +	pr_debug("%s(): indirect search for logical block %u\n", +		 __func__, block);  	direxts = in->extents[0].cooked.ex_offset;  	indexts = in->numextents; @@ -263,7 +258,8 @@ efs_block_t efs_map_block(struct inode *inode, efs_block_t block) {  		if (dirext == direxts) {  			/* should never happen */ -			printk(KERN_ERR "EFS: couldn't find direct extent for indirect extent %d (block %u)\n", cur, block); +			pr_err("couldn't find direct extent for indirect extent %d (block %u)\n", +			       cur, block);  			if (bh) brelse(bh);  			return 0;  		} @@ -280,12 +276,12 @@ efs_block_t efs_map_block(struct inode *inode, efs_block_t block) {  			bh = sb_bread(inode->i_sb, iblock);  			if (!bh) { -				printk(KERN_ERR "EFS: bread() failed at block %d\n", iblock); +				pr_err("%s() failed at block %d\n", +				       __func__, iblock);  				return 0;  			} -#ifdef DEBUG -			printk(KERN_DEBUG "EFS: map_block(): read indirect extent block %d\n", iblock); -#endif +			pr_debug("%s(): read indirect extent block %d\n", +				 __func__, iblock);  			first = 0;  			lastblock = iblock;  		} @@ -295,7 +291,8 @@ efs_block_t efs_map_block(struct inode *inode, efs_block_t block) {  		extent_copy(&(exts[ioffset]), &ext);  		if (ext.cooked.ex_magic != 0) { -			printk(KERN_ERR "EFS: extent %d has bad magic number in block %d\n", cur, iblock); +			pr_err("extent %d has bad magic number in block %d\n", +			       cur, iblock);  			if (bh) brelse(bh);  			return 0;  		} @@ -307,7 +304,7 @@ efs_block_t efs_map_block(struct inode *inode, efs_block_t block) {  		}  	}  	if (bh) brelse(bh); -	printk(KERN_ERR "EFS: map_block() failed to map block %u (indir)\n", block); +	pr_err("%s() failed to map block %u (indir)\n", __func__, block);  	return 0;  }   diff --git a/fs/efs/namei.c b/fs/efs/namei.c index 1511bf9e5f8..356c044e2cd 100644 --- a/fs/efs/namei.c +++ b/fs/efs/namei.c @@ -23,20 +23,22 @@ static efs_ino_t efs_find_entry(struct inode *inode, const char *name, int len)  	efs_block_t		block;  	if (inode->i_size & (EFS_DIRBSIZE-1)) -		printk(KERN_WARNING "EFS: WARNING: find_entry(): directory size not a multiple of EFS_DIRBSIZE\n"); +		pr_warn("%s(): directory size not a multiple of EFS_DIRBSIZE\n", +			__func__);  	for(block = 0; block < inode->i_blocks; block++) {  		bh = sb_bread(inode->i_sb, efs_bmap(inode, block));  		if (!bh) { -			printk(KERN_ERR "EFS: find_entry(): failed to read dir block %d\n", block); +			pr_err("%s(): failed to read dir block %d\n", +			       __func__, block);  			return 0;  		}  		dirblock = (struct efs_dir *) bh->b_data;  		if (be16_to_cpu(dirblock->magic) != EFS_DIRBLK_MAGIC) { -			printk(KERN_ERR "EFS: find_entry(): invalid directory block\n"); +			pr_err("%s(): invalid directory block\n", __func__);  			brelse(bh);  			return(0);  		} @@ -58,16 +60,14 @@ static efs_ino_t efs_find_entry(struct inode *inode, const char *name, int len)  	return(0);  } -struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) { +struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) +{  	efs_ino_t inodenum; -	struct inode * inode = NULL; +	struct inode *inode = NULL;  	inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len); -	if (inodenum) { +	if (inodenum)  		inode = efs_iget(dir->i_sb, inodenum); -		if (IS_ERR(inode)) -			return ERR_CAST(inode); -	}  	return d_splice_alias(inode, dentry);  } diff --git a/fs/efs/super.c b/fs/efs/super.c index 5073a07652c..7fca462ea4e 100644 --- a/fs/efs/super.c +++ b/fs/efs/super.c @@ -26,13 +26,21 @@ static struct dentry *efs_mount(struct file_system_type *fs_type,  	return mount_bdev(fs_type, flags, dev_name, data, efs_fill_super);  } +static void efs_kill_sb(struct super_block *s) +{ +	struct efs_sb_info *sbi = SUPER_INFO(s); +	kill_block_super(s); +	kfree(sbi); +} +  static struct file_system_type efs_fs_type = {  	.owner		= THIS_MODULE,  	.name		= "efs",  	.mount		= efs_mount, -	.kill_sb	= kill_block_super, +	.kill_sb	= efs_kill_sb,  	.fs_flags	= FS_REQUIRES_DEV,  }; +MODULE_ALIAS_FS("efs");  static struct pt_types sgi_pt_types[] = {  	{0x00,		"SGI vh"}, @@ -65,11 +73,17 @@ static struct inode *efs_alloc_inode(struct super_block *sb)  	return &ei->vfs_inode;  } -static void efs_destroy_inode(struct inode *inode) +static void efs_i_callback(struct rcu_head *head)  { +	struct inode *inode = container_of(head, struct inode, i_rcu);  	kmem_cache_free(efs_inode_cachep, INODE_INFO(inode));  } +static void efs_destroy_inode(struct inode *inode) +{ +	call_rcu(&inode->i_rcu, efs_i_callback); +} +  static void init_once(void *foo)  {  	struct efs_inode_info *ei = (struct efs_inode_info *) foo; @@ -77,7 +91,7 @@ static void init_once(void *foo)  	inode_init_once(&ei->vfs_inode);  } -static int init_inodecache(void) +static int __init init_inodecache(void)  {  	efs_inode_cachep = kmem_cache_create("efs_inode_cache",  				sizeof(struct efs_inode_info), @@ -90,17 +104,17 @@ static int init_inodecache(void)  static void destroy_inodecache(void)  { +	/* +	 * Make sure all delayed rcu free inodes are flushed before we +	 * destroy cache. +	 */ +	rcu_barrier();  	kmem_cache_destroy(efs_inode_cachep);  } -static void efs_put_super(struct super_block *s) -{ -	kfree(s->s_fs_info); -	s->s_fs_info = NULL; -} -  static int efs_remount(struct super_block *sb, int *flags, char *data)  { +	sync_filesystem(sb);  	*flags |= MS_RDONLY;  	return 0;  } @@ -108,7 +122,6 @@ static int efs_remount(struct super_block *sb, int *flags, char *data)  static const struct super_operations efs_superblock_operations = {  	.alloc_inode	= efs_alloc_inode,  	.destroy_inode	= efs_destroy_inode, -	.put_super	= efs_put_super,  	.statfs		= efs_statfs,  	.remount_fs	= efs_remount,  }; @@ -121,7 +134,7 @@ static const struct export_operations efs_export_ops = {  static int __init init_efs_fs(void) {  	int err; -	printk("EFS: "EFS_VERSION" - http://aeschi.ch.eu.org/efs/\n"); +	pr_info(EFS_VERSION" - http://aeschi.ch.eu.org/efs/\n");  	err = init_inodecache();  	if (err)  		goto out1; @@ -166,12 +179,12 @@ static efs_block_t efs_validate_vh(struct volume_header *vh) {  		csum += be32_to_cpu(cs);  	}  	if (csum) { -		printk(KERN_INFO "EFS: SGI disklabel: checksum bad, label corrupted\n"); +		pr_warn("SGI disklabel: checksum bad, label corrupted\n");  		return 0;  	}  #ifdef DEBUG -	printk(KERN_DEBUG "EFS: bf: \"%16s\"\n", vh->vh_bootfile); +	pr_debug("bf: \"%16s\"\n", vh->vh_bootfile);  	for(i = 0; i < NVDIR; i++) {  		int	j; @@ -183,9 +196,8 @@ static efs_block_t efs_validate_vh(struct volume_header *vh) {  		name[j] = (char) 0;  		if (name[0]) { -			printk(KERN_DEBUG "EFS: vh: %8s block: 0x%08x size: 0x%08x\n", -				name, -				(int) be32_to_cpu(vh->vh_vd[i].vd_lbn), +			pr_debug("vh: %8s block: 0x%08x size: 0x%08x\n", +				name, (int) be32_to_cpu(vh->vh_vd[i].vd_lbn),  				(int) be32_to_cpu(vh->vh_vd[i].vd_nbytes));  		}  	} @@ -198,12 +210,11 @@ static efs_block_t efs_validate_vh(struct volume_header *vh) {  		}  #ifdef DEBUG  		if (be32_to_cpu(vh->vh_pt[i].pt_nblks)) { -			printk(KERN_DEBUG "EFS: pt %2d: start: %08d size: %08d type: 0x%02x (%s)\n", -				i, -				(int) be32_to_cpu(vh->vh_pt[i].pt_firstlbn), -				(int) be32_to_cpu(vh->vh_pt[i].pt_nblks), -				pt_type, -				(pt_entry->pt_name) ? pt_entry->pt_name : "unknown"); +			pr_debug("pt %2d: start: %08d size: %08d type: 0x%02x (%s)\n", +				 i, (int)be32_to_cpu(vh->vh_pt[i].pt_firstlbn), +				 (int)be32_to_cpu(vh->vh_pt[i].pt_nblks), +				 pt_type, (pt_entry->pt_name) ? +				 pt_entry->pt_name : "unknown");  		}  #endif  		if (IS_EFS(pt_type)) { @@ -213,11 +224,10 @@ static efs_block_t efs_validate_vh(struct volume_header *vh) {  	}  	if (slice == -1) { -		printk(KERN_NOTICE "EFS: partition table contained no EFS partitions\n"); +		pr_notice("partition table contained no EFS partitions\n");  #ifdef DEBUG  	} else { -		printk(KERN_INFO "EFS: using slice %d (type %s, offset 0x%x)\n", -			slice, +		pr_info("using slice %d (type %s, offset 0x%x)\n", slice,  			(pt_entry->pt_name) ? pt_entry->pt_name : "unknown",  			sblock);  #endif @@ -247,7 +257,6 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)  	struct efs_sb_info *sb;  	struct buffer_head *bh;  	struct inode *root; -	int ret = -EINVAL;   	sb = kzalloc(sizeof(struct efs_sb_info), GFP_KERNEL);  	if (!sb) @@ -256,17 +265,17 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)  	s->s_magic		= EFS_SUPER_MAGIC;  	if (!sb_set_blocksize(s, EFS_BLOCKSIZE)) { -		printk(KERN_ERR "EFS: device does not support %d byte blocks\n", +		pr_err("device does not support %d byte blocks\n",  			EFS_BLOCKSIZE); -		goto out_no_fs_ul; +		return -EINVAL;  	}  	/* read the vh (volume header) block */  	bh = sb_bread(s, 0);  	if (!bh) { -		printk(KERN_ERR "EFS: cannot read volume header\n"); -		goto out_no_fs_ul; +		pr_err("cannot read volume header\n"); +		return -EINVAL;  	}  	/* @@ -278,27 +287,28 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)  	brelse(bh);  	if (sb->fs_start == -1) { -		goto out_no_fs_ul; +		return -EINVAL;  	}  	bh = sb_bread(s, sb->fs_start + EFS_SUPER);  	if (!bh) { -		printk(KERN_ERR "EFS: cannot read superblock\n"); -		goto out_no_fs_ul; +		pr_err("cannot read superblock\n"); +		return -EINVAL;  	}  	if (efs_validate_super(sb, (struct efs_super *) bh->b_data)) {  #ifdef DEBUG -		printk(KERN_WARNING "EFS: invalid superblock at block %u\n", sb->fs_start + EFS_SUPER); +		pr_warn("invalid superblock at block %u\n", +			sb->fs_start + EFS_SUPER);  #endif  		brelse(bh); -		goto out_no_fs_ul; +		return -EINVAL;  	}  	brelse(bh);  	if (!(s->s_flags & MS_RDONLY)) {  #ifdef DEBUG -		printk(KERN_INFO "EFS: forcing read-only mode\n"); +		pr_info("forcing read-only mode\n");  #endif  		s->s_flags |= MS_RDONLY;  	} @@ -306,26 +316,17 @@ static int efs_fill_super(struct super_block *s, void *d, int silent)  	s->s_export_op = &efs_export_ops;  	root = efs_iget(s, EFS_ROOTINODE);  	if (IS_ERR(root)) { -		printk(KERN_ERR "EFS: get root inode failed\n"); -		ret = PTR_ERR(root); -		goto out_no_fs; +		pr_err("get root inode failed\n"); +		return PTR_ERR(root);  	} -	s->s_root = d_alloc_root(root); +	s->s_root = d_make_root(root);  	if (!(s->s_root)) { -		printk(KERN_ERR "EFS: get root dentry failed\n"); -		iput(root); -		ret = -ENOMEM; -		goto out_no_fs; +		pr_err("get root dentry failed\n"); +		return -ENOMEM;  	}  	return 0; - -out_no_fs_ul: -out_no_fs: -	s->s_fs_info = NULL; -	kfree(sb); -	return ret;  }  static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) {  | 
