diff options
Diffstat (limited to 'fs/ramfs')
| -rw-r--r-- | fs/ramfs/file-mmu.c | 17 | ||||
| -rw-r--r-- | fs/ramfs/file-nommu.c | 31 | ||||
| -rw-r--r-- | fs/ramfs/inode.c | 82 | ||||
| -rw-r--r-- | fs/ramfs/internal.h | 1 | 
4 files changed, 47 insertions, 84 deletions
diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c index 4884ac5ae9b..4f56de822d2 100644 --- a/fs/ramfs/file-mmu.c +++ b/fs/ramfs/file-mmu.c @@ -30,22 +30,15 @@  #include "internal.h" -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, -}; -  const struct file_operations ramfs_file_operations = { -	.read		= do_sync_read, -	.aio_read	= generic_file_aio_read, -	.write		= do_sync_write, -	.aio_write	= generic_file_aio_write, +	.read		= new_sync_read, +	.read_iter	= generic_file_read_iter, +	.write		= new_sync_write, +	.write_iter	= generic_file_write_iter,  	.mmap		= generic_file_mmap,  	.fsync		= noop_fsync,  	.splice_read	= generic_file_splice_read, -	.splice_write	= generic_file_splice_write, +	.splice_write	= iter_file_splice_write,  	.llseek		= generic_file_llseek,  }; diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index 9eead2c796b..dda012ad420 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -27,24 +27,23 @@  #include "internal.h"  static int ramfs_nommu_setattr(struct dentry *, struct iattr *); - -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 unsigned long ramfs_nommu_get_unmapped_area(struct file *file, +						   unsigned long addr, +						   unsigned long len, +						   unsigned long pgoff, +						   unsigned long flags); +static int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma);  const struct file_operations ramfs_file_operations = {  	.mmap			= ramfs_nommu_mmap,  	.get_unmapped_area	= ramfs_nommu_get_unmapped_area, -	.read			= do_sync_read, -	.aio_read		= generic_file_aio_read, -	.write			= do_sync_write, -	.aio_write		= generic_file_aio_write, +	.read			= new_sync_read, +	.read_iter		= generic_file_read_iter, +	.write			= new_sync_write, +	.write_iter		= generic_file_write_iter,  	.fsync			= noop_fsync,  	.splice_read		= generic_file_splice_read, -	.splice_write		= generic_file_splice_write, +	.splice_write		= iter_file_splice_write,  	.llseek			= generic_file_llseek,  }; @@ -110,8 +109,10 @@ int ramfs_nommu_expand_for_mapping(struct inode *inode, size_t newsize)  		/* prevent the page from being discarded on memory pressure */  		SetPageDirty(page); +		SetPageUptodate(page);  		unlock_page(page); +		put_page(page);  	}  	return 0; @@ -195,12 +196,12 @@ static int ramfs_nommu_setattr(struct dentry *dentry, struct iattr *ia)   *   - the pages to be mapped must exist   *   - the pages be physically contiguous in sequence   */ -unsigned long ramfs_nommu_get_unmapped_area(struct file *file, +static unsigned long ramfs_nommu_get_unmapped_area(struct file *file,  					    unsigned long addr, unsigned long len,  					    unsigned long pgoff, unsigned long flags)  {  	unsigned long maxpages, lpages, nr, loop, ret; -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct page **pages = NULL, **ptr, *page;  	loff_t isize; @@ -254,7 +255,7 @@ out:  /*   * set up a mapping for shared memory segments   */ -int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma) +static int ramfs_nommu_mmap(struct file *file, struct vm_area_struct *vma)  {  	if (!(vma->vm_flags & VM_SHARED))  		return -ENOSYS; 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); diff --git a/fs/ramfs/internal.h b/fs/ramfs/internal.h index 6b330639b51..a9d8ae88fa1 100644 --- a/fs/ramfs/internal.h +++ b/fs/ramfs/internal.h @@ -10,5 +10,4 @@   */ -extern const struct address_space_operations ramfs_aops;  extern const struct inode_operations ramfs_file_inode_operations;  | 
