diff options
Diffstat (limited to 'fs/ramfs/inode.c')
| -rw-r--r-- | fs/ramfs/inode.c | 82 | 
1 files changed, 26 insertions, 56 deletions
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c index eacb166fb25..d365b1c4eb3 100644 --- a/fs/ramfs/inode.c +++ b/fs/ramfs/inode.c @@ -23,7 +23,6 @@   * caches is sufficient.   */ -#include <linux/module.h>  #include <linux/fs.h>  #include <linux/pagemap.h>  #include <linux/highmem.h> @@ -44,6 +43,13 @@  static const struct super_operations ramfs_ops;  static const struct inode_operations ramfs_dir_inode_operations; +static const struct address_space_operations ramfs_aops = { +	.readpage	= simple_readpage, +	.write_begin	= simple_write_begin, +	.write_end	= simple_write_end, +	.set_page_dirty	= __set_page_dirty_no_writeback, +}; +  static struct backing_dev_info ramfs_backing_dev_info = {  	.name		= "ramfs",  	.ra_pages	= 0,	/* No readahead */ @@ -53,7 +59,7 @@ static struct backing_dev_info ramfs_backing_dev_info = {  };  struct inode *ramfs_get_inode(struct super_block *sb, -				const struct inode *dir, int mode, dev_t dev) +				const struct inode *dir, umode_t mode, dev_t dev)  {  	struct inode * inode = new_inode(sb); @@ -93,7 +99,7 @@ struct inode *ramfs_get_inode(struct super_block *sb,   */  /* SMP-safe */  static int -ramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) +ramfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)  {  	struct inode * inode = ramfs_get_inode(dir->i_sb, dir, mode, dev);  	int error = -ENOSPC; @@ -107,7 +113,7 @@ ramfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)  	return error;  } -static int ramfs_mkdir(struct inode * dir, struct dentry * dentry, int mode) +static int ramfs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)  {  	int retval = ramfs_mknod(dir, dentry, mode | S_IFDIR, 0);  	if (!retval) @@ -115,7 +121,7 @@ static int ramfs_mkdir(struct inode * dir, struct dentry * dentry, int mode)  	return retval;  } -static int ramfs_create(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd) +static int ramfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl)  {  	return ramfs_mknod(dir, dentry, mode | S_IFREG, 0);  } @@ -210,22 +216,19 @@ static int ramfs_parse_options(char *data, struct ramfs_mount_opts *opts)  int ramfs_fill_super(struct super_block *sb, void *data, int silent)  {  	struct ramfs_fs_info *fsi; -	struct inode *inode = NULL; -	struct dentry *root; +	struct inode *inode;  	int err;  	save_mount_options(sb, data);  	fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL);  	sb->s_fs_info = fsi; -	if (!fsi) { -		err = -ENOMEM; -		goto fail; -	} +	if (!fsi) +		return -ENOMEM;  	err = ramfs_parse_options(data, &fsi->mount_opts);  	if (err) -		goto fail; +		return err;  	sb->s_maxbytes		= MAX_LFS_FILESIZE;  	sb->s_blocksize		= PAGE_CACHE_SIZE; @@ -235,24 +238,11 @@ int ramfs_fill_super(struct super_block *sb, void *data, int silent)  	sb->s_time_gran		= 1;  	inode = ramfs_get_inode(sb, NULL, S_IFDIR | fsi->mount_opts.mode, 0); -	if (!inode) { -		err = -ENOMEM; -		goto fail; -	} - -	root = d_alloc_root(inode); -	sb->s_root = root; -	if (!root) { -		err = -ENOMEM; -		goto fail; -	} +	sb->s_root = d_make_root(inode); +	if (!sb->s_root) +		return -ENOMEM;  	return 0; -fail: -	kfree(fsi); -	sb->s_fs_info = NULL; -	iput(inode); -	return err;  }  struct dentry *ramfs_mount(struct file_system_type *fs_type, @@ -261,12 +251,6 @@ struct dentry *ramfs_mount(struct file_system_type *fs_type,  	return mount_nodev(fs_type, flags, data, ramfs_fill_super);  } -static struct dentry *rootfs_mount(struct file_system_type *fs_type, -	int flags, const char *dev_name, void *data) -{ -	return mount_nodev(fs_type, flags|MS_NOUSER, data, ramfs_fill_super); -} -  static void ramfs_kill_sb(struct super_block *sb)  {  	kfree(sb->s_fs_info); @@ -277,39 +261,25 @@ static struct file_system_type ramfs_fs_type = {  	.name		= "ramfs",  	.mount		= ramfs_mount,  	.kill_sb	= ramfs_kill_sb, +	.fs_flags	= FS_USERNS_MOUNT,  }; -static struct file_system_type rootfs_fs_type = { -	.name		= "rootfs", -	.mount		= rootfs_mount, -	.kill_sb	= kill_litter_super, -}; - -static int __init init_ramfs_fs(void) -{ -	return register_filesystem(&ramfs_fs_type); -} -static void __exit exit_ramfs_fs(void) -{ -	unregister_filesystem(&ramfs_fs_type); -} - -module_init(init_ramfs_fs) -module_exit(exit_ramfs_fs) - -int __init init_rootfs(void) +int __init init_ramfs_fs(void)  { +	static unsigned long once;  	int err; +	if (test_and_set_bit(0, &once)) +		return 0; +  	err = bdi_init(&ramfs_backing_dev_info);  	if (err)  		return err; -	err = register_filesystem(&rootfs_fs_type); +	err = register_filesystem(&ramfs_fs_type);  	if (err)  		bdi_destroy(&ramfs_backing_dev_info);  	return err;  } - -MODULE_LICENSE("GPL"); +fs_initcall(init_ramfs_fs);  | 
