lkml.org 
[lkml]   [2008]   [Aug]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 06/10] AXFS: axfs_super.c
    On Wed, Aug 20, 2008 at 10:45:37PM -0700, Jared Hulbert wrote:
    >+static int axfs_get_onmedia_super(struct super_block *sb)
    >+{
    >+ int err;
    >+ struct axfs_super *sbi = AXFS_SB(sb);
    >+ struct axfs_super_onmedia *sbo;
    >+
    >+ sbo = kmalloc(sizeof(*sbo), GFP_KERNEL);
    >+ if (!sbo)
    >+ return -ENOMEM;
    >+
    >+ axfs_copy_metadata(sb, (void *)sbo, 0, sizeof(*sbo));
    >+
    >+ /* Do sanity checks on the superblock */
    >+ if (be32_to_cpu(sbo->magic) != AXFS_MAGIC) {
    >+ printk(KERN_ERR "axfs: wrong magic\n");
    >+ err = -EINVAL;
    >+ goto out;
    >+ }
    >+
    >+ /* verify the signiture is correct */
    >+ if (strncmp(sbo->signature, AXFS_SIGNATURE, sizeof(AXFS_SIGNATURE))) {
    >+ printk(KERN_ERR "axfs: wrong axfs signature,"
    >+ " read %s, expected %s\n",
    >+ sbo->signature, AXFS_SIGNATURE);
    >+ err = -EINVAL;
    >+ goto out;
    >+ }

    As Phillip mentioned for some other cases, just initialize err to
    EINVAL.
    >+
    >+ sbi->magic = be32_to_cpu(sbo->magic);
    >+ sbi->version_major = sbo->version_major;
    >+ sbi->version_minor = sbo->version_minor;
    >+ sbi->version_sub = sbo->version_sub;
    >+ sbi->files = be64_to_cpu(sbo->files);
    >+ sbi->size = be64_to_cpu(sbo->size);
    >+ sbi->blocks = be64_to_cpu(sbo->blocks);
    >+ sbi->mmap_size = be64_to_cpu(sbo->mmap_size);
    >+ sbi->cblock_size = be32_to_cpu(sbo->cblock_size);
    >+ sbi->timestamp.tv_sec = be64_to_cpu(sbo->timestamp);
    >+ sbi->timestamp.tv_nsec = 0;
    >+ sbi->compression_type = sbo->compression_type;
    >+
    >+ err = axfs_set_compression_type(sbi);
    >+ if (err)
    >+ goto out;
    >+
    >+ /* If no block or MTD device, adjust mmapable to cover all image */
    >+ if (AXFS_NODEV(sb))
    >+ sbi->mmap_size = sbi->size;
    >+
    >+ err = axfs_fill_region_descriptors(sb, sbo);
    [as already mentioned the clipped snippet here is unneeded]
    >+out:
    >+ kfree(sbo);
    >+ return err;
    >+}

    >+int axfs_verify_device_sizes(struct super_block *sb)
    >+{
    >+ struct axfs_super *sbi = AXFS_SB(sb);
    >+ struct mtd_info *mtd0 = AXFS_MTD(sb);
    >+ struct mtd_info *mtd1 = AXFS_MTD1(sb);
    >+ int sndsize = sbi->size - sbi->mmap_size;
    >+
    >+ /* Whole FS on one device */
    >+ if (mtd0 && !mtd1 && (mtd0->size < sbi->size)) {
    >+ printk(KERN_ERR "axfs: ERROR: Filesystem extends beyond end of"
    >+ "MTD! Filesystem cannot be safely mounted!\n");

    missing space in "end ofMTD"
    You're mixing the style of where you put such a space, so potential
    errors are not easy to spot (manually).
    e.g.:

    >+ printk(KERN_ERR "axfs: ERROR: Mmap segment extends"
    >+ " beyond end of MTD!");
    >+ printk(KERN_ERR "mtd name: %s, mtd size: 0x%x, mmap "
    >+ "size: 0x%llx",
    >+ mtd0->name, mtd0->size, sbi->mmap_size);

    >+static int axfs_check_options(char *options, struct axfs_super *sbi)
    >+{
    >+ unsigned long address = 0;
    >+ char *iomem = NULL;
    >+ unsigned long length = 0;
    >+ char *p;
    >+ int err = -EINVAL;
    >+ substring_t args[MAX_OPT_ARGS];
    >+
    >+ if (!options)
    >+ return 0;
    >+
    >+ if (!*options)
    >+ return 0;
    >+
    >+ while ((p = strsep(&options, ",")) != NULL) {
    >+ int token;
    >+ if (!*p)
    >+ continue;
    >+
    >+ token = match_token(p, tokens, args);
    >+ switch (token) {
    >+ case OPTION_SECOND_DEV:
    >+ sbi->second_dev = match_strdup(&args[0]);
    >+ if (!(sbi->second_dev)) {
    >+ err = -ENOMEM;
    >+ goto out;
    >+ }
    >+ if (!*(sbi->second_dev))
    >+ goto bad_value;
    >+ break;
    >+ case OPTION_IOMEM:
    >+ iomem = match_strdup(&args[0]);
    >+ if (!(iomem)) {
    >+ err = -ENOMEM;
    >+ goto out;
    >+ }
    >+ if (!*iomem)
    >+ goto bad_value;
    >+ break;
    >+ case OPTION_PHYSICAL_ADDRESS_LOWER_X:
    >+ case OPTION_PHYSICAL_ADDRESS_UPPER_X:
    >+ if (match_hex(&args[0], (int *)&address))
    >+ goto out;
    >+ if (!address)
    >+ goto bad_value;
    >+ break;
    >+ default:

    just:
    goto bad_value;

    >+ printk(KERN_ERR
    >+ "axfs: unrecognized mount option \"%s\" "
    >+ "or missing value\n", p);
    >+ goto out;
    >+ }
    >+ }
    >+
    >+ if (iomem) {
    >+ if (address)
    >+ goto out;
    >+ err = axfs_get_uml_address(iomem, &address, &length);

    missing:
    if (err)
    goto out;

    >+ kfree(iomem);
    >+ sbi->iomem_size = length;
    >+ sbi->virt_start_addr = address;
    >+ }
    >+
    >+ sbi->phys_start_addr = address;
    >+ return 0;
    >+
    >+bad_value:
    >+ printk(KERN_ERR
    >+ "axfs: unrecognized mount option \"%s\" "
    >+ "or missing value\n", p);
    >+out:
    >+ if (iomem)
    >+ kfree(iomem);

    just kfree(iomem);

    >+ return err;
    >+}
    >+

    >+static int axfs_statfs(struct dentry *dentry, struct kstatfs *buf)
    >+{
    >+ struct axfs_super *sbi = AXFS_SB(dentry->d_sb);
    >+
    >+ buf->f_type = AXFS_MAGIC;
    >+ buf->f_bsize = AXFS_PAGE_SIZE;

    What will happen if i transfer the filesystem to a box with a different
    pagesize?

    >+ buf->f_blocks = sbi->blocks;
    >+ buf->f_bfree = 0;
    >+ buf->f_bavail = 0;
    >+ buf->f_files = sbi->files;
    >+ buf->f_ffree = 0;
    >+ buf->f_namelen = AXFS_MAXPATHLEN;
    >+ return 0;
    >+}

    I think i have seen the string "compessed" in one of your patches,
    should be "compressed".



    \
     
     \ /
      Last update: 2008-08-22 14:11    [W:7.126 / U:0.888 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site