Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 71a1c012 authored by Al Viro's avatar Al Viro
Browse files

logfs get_sb massage, part 1



move allocation of logfs_super to logfs_get_sb, pass it to
logfs_get_sb_...().

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent d2d1ea93
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
#include <linux/bio.h>
#include <linux/blkdev.h>
#include <linux/buffer_head.h>
#include <linux/slab.h>
#include <linux/gfp.h>

#define PAGE_OFS(ofs) ((ofs) & (PAGE_SIZE-1))
@@ -320,20 +321,23 @@ static const struct logfs_device_ops bd_devops = {
	.put_device	= bdev_put_device,
};

int logfs_get_sb_bdev(struct file_system_type *type, int flags,
int logfs_get_sb_bdev(struct logfs_super *p,
		struct file_system_type *type, int flags,
		const char *devname, struct vfsmount *mnt)
{
	struct block_device *bdev;

	bdev = open_bdev_exclusive(devname, FMODE_READ|FMODE_WRITE, type);
	if (IS_ERR(bdev))
	if (IS_ERR(bdev)) {
		kfree(p);
		return PTR_ERR(bdev);
	}

	if (MAJOR(bdev->bd_dev) == MTD_BLOCK_MAJOR) {
		int mtdnr = MINOR(bdev->bd_dev);
		close_bdev_exclusive(bdev, FMODE_READ|FMODE_WRITE);
		return logfs_get_sb_mtd(type, flags, mtdnr, mnt);
		return logfs_get_sb_mtd(p, type, flags, mtdnr, mnt);
	}

	return logfs_get_sb_device(type, flags, NULL, bdev, &bd_devops, mnt);
	return logfs_get_sb_device(p, type, flags, NULL, bdev, &bd_devops, mnt);
}
+6 −3
Original line number Diff line number Diff line
@@ -265,14 +265,17 @@ static const struct logfs_device_ops mtd_devops = {
	.put_device	= mtd_put_device,
};

int logfs_get_sb_mtd(struct file_system_type *type, int flags,
int logfs_get_sb_mtd(struct logfs_super *s,
		struct file_system_type *type, int flags,
		int mtdnr, struct vfsmount *mnt)
{
	struct mtd_info *mtd;
	const struct logfs_device_ops *devops = &mtd_devops;

	mtd = get_mtd_device(NULL, mtdnr);
	if (IS_ERR(mtd))
	if (IS_ERR(mtd)) {
		kfree(s);
		return PTR_ERR(mtd);
	return logfs_get_sb_device(type, flags, mtd, NULL, devops, mnt);
	}
	return logfs_get_sb_device(s, type, flags, mtd, NULL, devops, mnt);
}
+12 −5
Original line number Diff line number Diff line
@@ -471,24 +471,30 @@ void logfs_compr_exit(void);

/* dev_bdev.c */
#ifdef CONFIG_BLOCK
int logfs_get_sb_bdev(struct file_system_type *type, int flags,
int logfs_get_sb_bdev(struct logfs_super *s,
		struct file_system_type *type, int flags,
		const char *devname, struct vfsmount *mnt);
#else
static inline int logfs_get_sb_bdev(struct file_system_type *type, int flags,
static inline int logfs_get_sb_bdev(struct logfs_super *s,
		struct file_system_type *type, int flags,
		const char *devname, struct vfsmount *mnt)
{
	kfree(s);
	return -ENODEV;
}
#endif

/* dev_mtd.c */
#ifdef CONFIG_MTD
int logfs_get_sb_mtd(struct file_system_type *type, int flags,
int logfs_get_sb_mtd(struct logfs_super *s,
		struct file_system_type *type, int flags,
		int mtdnr, struct vfsmount *mnt);
#else
static inline int logfs_get_sb_mtd(struct file_system_type *type, int flags,
static inline int logfs_get_sb_mtd(struct logfs_super *s,
		struct file_system_type *type, int flags,
		int mtdnr, struct vfsmount *mnt)
{
	kfree(s);
	return -ENODEV;
}
#endif
@@ -619,7 +625,8 @@ void emergency_read_end(struct page *page);
void logfs_crash_dump(struct super_block *sb);
void *memchr_inv(const void *s, int c, size_t n);
int logfs_statfs(struct dentry *dentry, struct kstatfs *stats);
int logfs_get_sb_device(struct file_system_type *type, int flags,
int logfs_get_sb_device(struct logfs_super *s,
		struct file_system_type *type, int flags,
		struct mtd_info *mtd, struct block_device *bdev,
		const struct logfs_device_ops *devops, struct vfsmount *mnt);
int logfs_check_ds(struct logfs_disk_super *ds);
+13 −9
Original line number Diff line number Diff line
@@ -536,19 +536,16 @@ static void logfs_kill_sb(struct super_block *sb)
	log_super("LogFS: Finished unmounting\n");
}

int logfs_get_sb_device(struct file_system_type *type, int flags,
int logfs_get_sb_device(struct logfs_super *super,
		struct file_system_type *type, int flags,
		struct mtd_info *mtd, struct block_device *bdev,
		const struct logfs_device_ops *devops, struct vfsmount *mnt)
{
	struct logfs_super *super;
	struct super_block *sb;
	int err = -ENOMEM;
	static int mount_count;

	log_super("LogFS: Start mount %x\n", mount_count++);
	super = kzalloc(sizeof(*super), GFP_KERNEL);
	if (!super)
		goto err0;

	super->s_mtd	= mtd;
	super->s_bdev	= bdev;
@@ -603,20 +600,27 @@ static int logfs_get_sb(struct file_system_type *type, int flags,
		const char *devname, void *data, struct vfsmount *mnt)
{
	ulong mtdnr;
	struct logfs_super *super;

	super = kzalloc(sizeof(*super), GFP_KERNEL);
	if (!super)
		return -ENOMEM;

	if (!devname)
		return logfs_get_sb_bdev(type, flags, devname, mnt);
		return logfs_get_sb_bdev(super, type, flags, devname, mnt);
	if (strncmp(devname, "mtd", 3))
		return logfs_get_sb_bdev(type, flags, devname, mnt);
		return logfs_get_sb_bdev(super, type, flags, devname, mnt);

	{
		char *garbage;
		mtdnr = simple_strtoul(devname+3, &garbage, 0);
		if (*garbage)
		if (*garbage) {
			kfree(super);
			return -EINVAL;
		}
	}

	return logfs_get_sb_mtd(type, flags, mtdnr, mnt);
	return logfs_get_sb_mtd(super, type, flags, mtdnr, mnt);
}

static struct file_system_type logfs_fs_type = {