fs: introduce f_op->mmap_capabilities for nommu mmap support
Since "BDI: Provide backing device capability information [try #3]" the backing_dev_info structure also provides flags for the kind of mmap operation available in a nommu environment, which is entirely unrelated to it's original purpose. Introduce a new nommu-only file operation to provide this information to the nommu mmap code instead. Splitting this from the backing_dev_info structure allows to remove lots of backing_dev_info instance that aren't otherwise needed, and entirely gets rid of the concept of providing a backing_dev_info for a character device. It also removes the need for the mtd_inodefs filesystem. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Tejun Heo <tj@kernel.org> Acked-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:

committed by
Jens Axboe

parent
97b713ba3e
commit
b4caecd480
@@ -287,13 +287,24 @@ static unsigned long get_unmapped_area_mem(struct file *file,
|
||||
return pgoff << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
/* permit direct mmap, for read, write or exec */
|
||||
static unsigned memory_mmap_capabilities(struct file *file)
|
||||
{
|
||||
return NOMMU_MAP_DIRECT |
|
||||
NOMMU_MAP_READ | NOMMU_MAP_WRITE | NOMMU_MAP_EXEC;
|
||||
}
|
||||
|
||||
static unsigned zero_mmap_capabilities(struct file *file)
|
||||
{
|
||||
return NOMMU_MAP_COPY;
|
||||
}
|
||||
|
||||
/* can't do an in-place private mapping if there's no MMU */
|
||||
static inline int private_mapping_ok(struct vm_area_struct *vma)
|
||||
{
|
||||
return vma->vm_flags & VM_MAYSHARE;
|
||||
}
|
||||
#else
|
||||
#define get_unmapped_area_mem NULL
|
||||
|
||||
static inline int private_mapping_ok(struct vm_area_struct *vma)
|
||||
{
|
||||
@@ -721,7 +732,10 @@ static const struct file_operations mem_fops = {
|
||||
.write = write_mem,
|
||||
.mmap = mmap_mem,
|
||||
.open = open_mem,
|
||||
#ifndef CONFIG_MMU
|
||||
.get_unmapped_area = get_unmapped_area_mem,
|
||||
.mmap_capabilities = memory_mmap_capabilities,
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DEVKMEM
|
||||
@@ -731,7 +745,10 @@ static const struct file_operations kmem_fops = {
|
||||
.write = write_kmem,
|
||||
.mmap = mmap_kmem,
|
||||
.open = open_kmem,
|
||||
#ifndef CONFIG_MMU
|
||||
.get_unmapped_area = get_unmapped_area_mem,
|
||||
.mmap_capabilities = memory_mmap_capabilities,
|
||||
#endif
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -760,16 +777,9 @@ static const struct file_operations zero_fops = {
|
||||
.read_iter = read_iter_zero,
|
||||
.aio_write = aio_write_zero,
|
||||
.mmap = mmap_zero,
|
||||
};
|
||||
|
||||
/*
|
||||
* capabilities for /dev/zero
|
||||
* - permits private mappings, "copies" are taken of the source of zeros
|
||||
* - no writeback happens
|
||||
*/
|
||||
static struct backing_dev_info zero_bdi = {
|
||||
.name = "char/mem",
|
||||
.capabilities = BDI_CAP_MAP_COPY | BDI_CAP_NO_ACCT_AND_WRITEBACK,
|
||||
#ifndef CONFIG_MMU
|
||||
.mmap_capabilities = zero_mmap_capabilities,
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct file_operations full_fops = {
|
||||
@@ -783,22 +793,22 @@ static const struct memdev {
|
||||
const char *name;
|
||||
umode_t mode;
|
||||
const struct file_operations *fops;
|
||||
struct backing_dev_info *dev_info;
|
||||
fmode_t fmode;
|
||||
} devlist[] = {
|
||||
[1] = { "mem", 0, &mem_fops, &directly_mappable_cdev_bdi },
|
||||
[1] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET },
|
||||
#ifdef CONFIG_DEVKMEM
|
||||
[2] = { "kmem", 0, &kmem_fops, &directly_mappable_cdev_bdi },
|
||||
[2] = { "kmem", 0, &kmem_fops, FMODE_UNSIGNED_OFFSET },
|
||||
#endif
|
||||
[3] = { "null", 0666, &null_fops, NULL },
|
||||
[3] = { "null", 0666, &null_fops, 0 },
|
||||
#ifdef CONFIG_DEVPORT
|
||||
[4] = { "port", 0, &port_fops, NULL },
|
||||
[4] = { "port", 0, &port_fops, 0 },
|
||||
#endif
|
||||
[5] = { "zero", 0666, &zero_fops, &zero_bdi },
|
||||
[7] = { "full", 0666, &full_fops, NULL },
|
||||
[8] = { "random", 0666, &random_fops, NULL },
|
||||
[9] = { "urandom", 0666, &urandom_fops, NULL },
|
||||
[5] = { "zero", 0666, &zero_fops, 0 },
|
||||
[7] = { "full", 0666, &full_fops, 0 },
|
||||
[8] = { "random", 0666, &random_fops, 0 },
|
||||
[9] = { "urandom", 0666, &urandom_fops, 0 },
|
||||
#ifdef CONFIG_PRINTK
|
||||
[11] = { "kmsg", 0644, &kmsg_fops, NULL },
|
||||
[11] = { "kmsg", 0644, &kmsg_fops, 0 },
|
||||
#endif
|
||||
};
|
||||
|
||||
@@ -816,12 +826,7 @@ static int memory_open(struct inode *inode, struct file *filp)
|
||||
return -ENXIO;
|
||||
|
||||
filp->f_op = dev->fops;
|
||||
if (dev->dev_info)
|
||||
filp->f_mapping->backing_dev_info = dev->dev_info;
|
||||
|
||||
/* Is /dev/mem or /dev/kmem ? */
|
||||
if (dev->dev_info == &directly_mappable_cdev_bdi)
|
||||
filp->f_mode |= FMODE_UNSIGNED_OFFSET;
|
||||
filp->f_mode |= dev->fmode;
|
||||
|
||||
if (dev->fops->open)
|
||||
return dev->fops->open(inode, filp);
|
||||
@@ -846,11 +851,6 @@ static struct class *mem_class;
|
||||
static int __init chr_dev_init(void)
|
||||
{
|
||||
int minor;
|
||||
int err;
|
||||
|
||||
err = bdi_init(&zero_bdi);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (register_chrdev(MEM_MAJOR, "mem", &memory_fops))
|
||||
printk("unable to get major %d for memory devs\n", MEM_MAJOR);
|
||||
|
Reference in New Issue
Block a user