diff options
Diffstat (limited to 'fs/logfs/super.c')
| -rw-r--r-- | fs/logfs/super.c | 50 | 
1 files changed, 16 insertions, 34 deletions
diff --git a/fs/logfs/super.c b/fs/logfs/super.c index 33435e4b14d..54360293bcb 100644 --- a/fs/logfs/super.c +++ b/fs/logfs/super.c @@ -13,6 +13,7 @@  #include <linux/bio.h>  #include <linux/slab.h>  #include <linux/blkdev.h> +#include <linux/module.h>  #include <linux/mtd/mtd.h>  #include <linux/statfs.h>  #include <linux/buffer_head.h> @@ -91,28 +92,6 @@ void logfs_crash_dump(struct super_block *sb)  }  /* - * TODO: move to lib/string.c - */ -/** - * memchr_inv - Find a character in an area of memory. - * @s: The memory area - * @c: The byte to search for - * @n: The size of the area. - * - * returns the address of the first character other than @c, or %NULL - * if the whole buffer contains just @c. - */ -void *memchr_inv(const void *s, int c, size_t n) -{ -	const unsigned char *p = s; -	while (n-- != 0) -		if ((unsigned char)c != *p++) -			return (void *)(p - 1); - -	return NULL; -} - -/*   * FIXME: There should be a reserve for root, similar to ext2.   */  int logfs_statfs(struct dentry *dentry, struct kstatfs *stats) @@ -336,11 +315,9 @@ static int logfs_get_sb_final(struct super_block *sb)  	if (IS_ERR(rootdir))  		goto fail; -	sb->s_root = d_alloc_root(rootdir); -	if (!sb->s_root) { -		iput(rootdir); +	sb->s_root = d_make_root(rootdir); +	if (!sb->s_root)  		goto fail; -	}  	/* at that point we know that ->put_super() will be called */  	super->s_erase_page = alloc_pages(GFP_KERNEL, 0); @@ -480,10 +457,6 @@ static int logfs_read_sb(struct super_block *sb, int read_only)  			!read_only)  		return -EIO; -	mutex_init(&super->s_dirop_mutex); -	mutex_init(&super->s_object_alias_mutex); -	INIT_LIST_HEAD(&super->s_freeing_list); -  	ret = logfs_init_rw(sb);  	if (ret)  		return ret; @@ -511,14 +484,15 @@ static void logfs_kill_sb(struct super_block *sb)  	/* Alias entries slow down mount, so evict as many as possible */  	sync_filesystem(sb);  	logfs_write_anchor(sb); +	free_areas(sb);  	/*  	 * From this point on alias entries are simply dropped - and any  	 * writes to the object store are considered bugs.  	 */ -	super->s_flags |= LOGFS_SB_FLAG_SHUTDOWN;  	log_super("LogFS: Now in shutdown\n");  	generic_shutdown_super(sb); +	super->s_flags |= LOGFS_SB_FLAG_SHUTDOWN;  	BUG_ON(super->s_dirty_used_bytes || super->s_dirty_free_bytes); @@ -545,7 +519,7 @@ static struct dentry *logfs_get_sb_device(struct logfs_super *super,  	log_super("LogFS: Start mount %x\n", mount_count++);  	err = -EINVAL; -	sb = sget(type, logfs_sb_test, logfs_sb_set, super); +	sb = sget(type, logfs_sb_test, logfs_sb_set, flags | MS_NOATIME, super);  	if (IS_ERR(sb)) {  		super->s_devops->put_device(super);  		kfree(super); @@ -566,8 +540,8 @@ static struct dentry *logfs_get_sb_device(struct logfs_super *super,  	 * the filesystem incompatible with 32bit systems.  	 */  	sb->s_maxbytes	= (1ull << 43) - 1; +	sb->s_max_links = LOGFS_LINK_MAX;  	sb->s_op	= &logfs_super_operations; -	sb->s_flags	= flags | MS_NOATIME;  	err = logfs_read_sb(sb, sb->s_flags & MS_RDONLY);  	if (err) @@ -601,6 +575,10 @@ static struct dentry *logfs_mount(struct file_system_type *type, int flags,  	if (!super)  		return ERR_PTR(-ENOMEM); +	mutex_init(&super->s_dirop_mutex); +	mutex_init(&super->s_object_alias_mutex); +	INIT_LIST_HEAD(&super->s_freeing_list); +  	if (!devname)  		err = logfs_get_sb_bdev(super, type, devname);  	else if (strncmp(devname, "mtd", 3)) @@ -630,6 +608,7 @@ static struct file_system_type logfs_fs_type = {  	.fs_flags	= FS_REQUIRES_DEV,  }; +MODULE_ALIAS_FS("logfs");  static int __init logfs_init(void)  { @@ -647,7 +626,10 @@ static int __init logfs_init(void)  	if (ret)  		goto out2; -	return register_filesystem(&logfs_fs_type); +	ret = register_filesystem(&logfs_fs_type); +	if (!ret) +		return 0; +	logfs_destroy_inode_cache();  out2:  	logfs_compr_exit();  out1:  | 
