[PATCH 06/10] AXFS: axfs_super.c

Bernhard Reutner-Fischer rep.dot.nop at gmail.com
Fri Aug 22 08:07:29 EDT 2008


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".




More information about the linux-mtd mailing list