[PATCH 06/10] AXFS: axfs_super.c
Sven Wegener
sven.wegener at stealer.net
Thu Aug 21 05:04:38 EDT 2008
On Wed, 20 Aug 2008, Jared Hulbert wrote:
> The many different devices AXFS can mount to and the various
> dual device mounting schemes are supported here.
>
> Signed-off-by: Jared Hulbert <jaredeh at gmail.com>
> ---
> diff --git a/fs/axfs/axfs_super.c b/fs/axfs/axfs_super.c
> new file mode 100644
> index 0000000..5efab38
> --- /dev/null
> +++ b/fs/axfs/axfs_super.c
> @@ -0,0 +1,864 @@
> +/*
> + * Advanced XIP File System for Linux - AXFS
> + * Readonly, compressed, and XIP filesystem for Linux systems big and small
> + *
> + * Copyright(c) 2008 Numonyx
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms and conditions of the GNU General Public License,
> + * version 2, as published by the Free Software Foundation.
> + *
> + * Authors:
> + * Eric Anderson
> + * Jared Hulbert <jaredeh at gmail.com>
> + * Sujaya Srinivasan
> + * Justin Treon
> + *
> + * More info and current contacts at http://axfs.sourceforge.net
> + *
> + * axfs_super.c -
> + * Contains the core code used to mount the fs.
> + *
> + */
> +
> +#include <linux/axfs.h>
> +#include <linux/fs.h>
> +#include <linux/vmalloc.h>
> +#include <linux/parser.h>
> +#include <linux/statfs.h>
> +#include <linux/module.h>
> +#include <linux/mount.h>
> +#include <linux/mtd/mtd.h>
> +
> +/******************** Function Declarations ****************************/
> +static struct super_operations axfs_sops;
> +static struct axfs_super *axfs_get_sbi(void);
> +static void axfs_put_sbi(struct axfs_super *);
If you reorder the code slightly you can avoid these static forward
declarations.
> +/***************** functions in other axfs files ***************************/
> +int axfs_get_sb_bdev(struct file_system_type *, int, const char *,
> + struct axfs_super *, struct vfsmount *, int *);
> +void axfs_kill_block_super(struct super_block *);
> +int axfs_copy_block(struct super_block *, void *, u64, u64);
> +int axfs_is_dev_bdev(char *);
> +int axfs_map_mtd(struct super_block *);
> +void axfs_unmap_mtd(struct super_block *);
> +int axfs_copy_mtd(struct super_block *, void *, u64, u64);
> +int axfs_get_sb_mtd(struct file_system_type *, int, const char *,
> + struct axfs_super *, struct vfsmount *, int *);
> +int axfs_is_dev_mtd(char *, int *);
> +void axfs_kill_mtd_super(struct super_block *);
> +struct inode *axfs_create_vfs_inode(struct super_block *, int);
> +int axfs_get_uml_address(char *, unsigned long *, unsigned long *);
> +int axfs_init_profiling(struct axfs_super *);
> +int axfs_shutdown_profiling(struct axfs_super *);
> +void axfs_profiling_add(struct axfs_super *, unsigned long, unsigned int);
> +struct inode *axfs_create_vfs_inode(struct super_block *, int);
> +/******************************************************************************/
These should probably be in axfs.h.
> +static int axfs_fill_region_descriptors(struct super_block *sb,
> + struct axfs_super_onmedia *sbo)
> +{
> + struct axfs_super *sbi = AXFS_SB(sb);
> + struct axfs_region_desc_onmedia *out;
> +
> + out = kmalloc(sizeof(*out), GFP_KERNEL);
> + if (!out)
> + return -ENOMEM;
> + memset(out, 0, sizeof(*out));
kzalloc()
> +
> + axfs_fill_region_desc(sb, out, sbo->strings, &sbi->strings);
> + axfs_fill_region_desc(sb, out, sbo->xip, &sbi->xip);
> + axfs_fill_region_desc(sb, out, sbo->compressed, &sbi->compressed);
> + axfs_fill_region_desc(sb, out, sbo->byte_aligned, &sbi->byte_aligned);
> + axfs_fill_region_desc(sb, out, sbo->node_type, &sbi->node_type);
> + axfs_fill_region_desc(sb, out, sbo->node_index, &sbi->node_index);
> + axfs_fill_region_desc(sb, out, sbo->cnode_offset, &sbi->cnode_offset);
> + axfs_fill_region_desc(sb, out, sbo->cnode_index, &sbi->cnode_index);
> + axfs_fill_region_desc(sb, out, sbo->banode_offset, &sbi->banode_offset);
> + axfs_fill_region_desc(sb, out, sbo->cblock_offset, &sbi->cblock_offset);
> + axfs_fill_region_desc(sb, out, sbo->inode_file_size,
> + &sbi->inode_file_size);
> + axfs_fill_region_desc(sb, out, sbo->inode_name_offset,
> + &sbi->inode_name_offset);
> + axfs_fill_region_desc(sb, out, sbo->inode_num_entries,
> + &sbi->inode_num_entries);
> + axfs_fill_region_desc(sb, out, sbo->inode_mode_index,
> + &sbi->inode_mode_index);
> + axfs_fill_region_desc(sb, out, sbo->inode_array_index,
> + &sbi->inode_array_index);
> + axfs_fill_region_desc(sb, out, sbo->modes, &sbi->modes);
> + axfs_fill_region_desc(sb, out, sbo->uids, &sbi->uids);
> + axfs_fill_region_desc(sb, out, sbo->gids, &sbi->gids);
> +
> + kfree(out);
> +
> + return 0;
> +}
> +int axfs_set_compression_type(struct axfs_super *sbi)
static
And this function actually doesn't set anything, check might be a better
name.
> +{
> + if (sbi->compression_type != ZLIB)
> + return -EINVAL;
> +
> + return 0;
> +}
> +/* Read the last four bytes of the volume and make sure the AXFS magic is
> + present. */
> +int axfs_verify_eofs_magic(struct super_block *sb)
> +{
> + struct axfs_super *sbi = AXFS_SB(sb);
> + u32 buf = 0;
> + int err;
> + u32 fsoffset = sbi->size - sizeof(u32);
> + int len = sizeof(u32);
> +
> + err = axfs_copy_metadata(sb, &buf, fsoffset, len);
sizeof(buf) instead of an additional variable named len.
> +
> + if (err)
> + return -EINVAL;
> +
> + if (be32_to_cpu(buf) != AXFS_MAGIC) {
> + printk(KERN_ERR "READ: 0x%x\n", be32_to_cpu(buf));
> + printk(KERN_ERR "ERROR: Filesystem is incomplete and cannot be "
> + "mounted!\n");
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +int axfs_fill_super(struct super_block *sb, void *data, int silent)
> +{
> + struct axfs_super *sbi_in = (struct axfs_super *)data;
> + struct axfs_super *sbi;
> + struct inode *root;
> + int err;
> +
> + sbi = axfs_get_sbi();
missing check for failure
> + sb->s_fs_info = (void *)sbi;
> + memcpy(sbi, sbi_in, sizeof(*sbi));
> +
> + /* fully populate the incore superblock structures */
> + err = axfs_do_fill_super(sb);
> + if (err)
> + goto out;
> +
> + sb->s_flags |= MS_RDONLY;
> +
> + /* Setup the VFS super block now */
> + sb->s_op = &axfs_sops;
> + root = axfs_create_vfs_inode(sb, 0);
> + if (!root) {
> + err = -EINVAL;
> + goto out;
> + }
> +
> + sb->s_root = d_alloc_root(root);
> + if (!sb->s_root) {
> + iput(root);
> + err = -EINVAL;
> + goto out;
> + }
> +
> + err = axfs_init_profiling(sbi);
> + if (err)
> + goto out;
> +
> + return 0;
> +
> +out:
> + axfs_put_super(sb);
> + return err;
> +}
> +static struct axfs_super *axfs_get_sbi(void)
> +{
> + struct axfs_super *sbi;
> +
> + sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
> + if (sbi)
> + return sbi;
> +
> + axfs_put_sbi(sbi);
Looks useless, sbi is NULL here.
> + return ERR_PTR(-ENOMEM);
> +}
> +static int __init init_axfs_fs(void)
> +{
> + axfs_uncompress_init();
> + return register_filesystem(&axfs_fs_type);
> +}
> +
> +static void __exit exit_axfs_fs(void)
> +{
> + axfs_uncompress_exit();
> + unregister_filesystem(&axfs_fs_type);
Order looks wrong compared to init_axfs_fs()
> +}
> +
> +module_init(init_axfs_fs);
> +module_exit(exit_axfs_fs);
> +MODULE_LICENSE("GPL");
More information about the linux-mtd
mailing list