linux/mm/tiny-shmem.c
<<
>>
Prefs
   1/*
   2 * tiny-shmem.c: simple shmemfs and tmpfs using ramfs code
   3 *
   4 * Matt Mackall <mpm@selenic.com> January, 2004
   5 * derived from mm/shmem.c and fs/ramfs/inode.c
   6 *
   7 * This is intended for small system where the benefits of the full
   8 * shmem code (swap-backed and resource-limited) are outweighed by
   9 * their complexity. On systems without swap this code should be
  10 * effectively equivalent, but much lighter weight.
  11 */
  12
  13#include <linux/fs.h>
  14#include <linux/init.h>
  15#include <linux/vfs.h>
  16#include <linux/mount.h>
  17#include <linux/file.h>
  18#include <linux/mm.h>
  19#include <linux/module.h>
  20#include <linux/swap.h>
  21#include <linux/ramfs.h>
  22
  23static struct file_system_type tmpfs_fs_type = {
  24        .name           = "tmpfs",
  25        .get_sb         = ramfs_get_sb,
  26        .kill_sb        = kill_litter_super,
  27};
  28
  29static struct vfsmount *shm_mnt;
  30
  31static int __init init_tmpfs(void)
  32{
  33        BUG_ON(register_filesystem(&tmpfs_fs_type) != 0);
  34
  35        shm_mnt = kern_mount(&tmpfs_fs_type);
  36        BUG_ON(IS_ERR(shm_mnt));
  37
  38        return 0;
  39}
  40module_init(init_tmpfs)
  41
  42/**
  43 * shmem_file_setup - get an unlinked file living in tmpfs
  44 * @name: name for dentry (to be seen in /proc/<pid>/maps
  45 * @size: size to be set for the file
  46 * @flags: vm_flags
  47 */
  48struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags)
  49{
  50        int error;
  51        struct file *file;
  52        struct inode *inode;
  53        struct dentry *dentry, *root;
  54        struct qstr this;
  55
  56        if (IS_ERR(shm_mnt))
  57                return (void *)shm_mnt;
  58
  59        error = -ENOMEM;
  60        this.name = name;
  61        this.len = strlen(name);
  62        this.hash = 0; /* will go */
  63        root = shm_mnt->mnt_root;
  64        dentry = d_alloc(root, &this);
  65        if (!dentry)
  66                goto put_memory;
  67
  68        error = -ENOSPC;
  69        inode = ramfs_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0);
  70        if (!inode)
  71                goto put_dentry;
  72
  73        d_instantiate(dentry, inode);
  74        error = -ENFILE;
  75        file = alloc_file(shm_mnt, dentry, FMODE_WRITE | FMODE_READ,
  76                        &ramfs_file_operations);
  77        if (!file)
  78                goto put_dentry;
  79
  80        inode->i_nlink = 0;     /* It is unlinked */
  81
  82        /* notify everyone as to the change of file size */
  83        error = do_truncate(dentry, size, 0, file);
  84        if (error < 0)
  85                goto close_file;
  86
  87        return file;
  88
  89close_file:
  90        put_filp(file);
  91        return ERR_PTR(error);
  92
  93put_dentry:
  94        dput(dentry);
  95put_memory:
  96        return ERR_PTR(error);
  97}
  98
  99/**
 100 * shmem_zero_setup - setup a shared anonymous mapping
 101 * @vma: the vma to be mmapped is prepared by do_mmap_pgoff
 102 */
 103int shmem_zero_setup(struct vm_area_struct *vma)
 104{
 105        struct file *file;
 106        loff_t size = vma->vm_end - vma->vm_start;
 107
 108        file = shmem_file_setup("dev/zero", size, vma->vm_flags);
 109        if (IS_ERR(file))
 110                return PTR_ERR(file);
 111
 112        if (vma->vm_file)
 113                fput(vma->vm_file);
 114        vma->vm_file = file;
 115        vma->vm_ops = &generic_file_vm_ops;
 116        return 0;
 117}
 118
 119int shmem_unuse(swp_entry_t entry, struct page *page)
 120{
 121        return 0;
 122}
 123
 124#ifndef CONFIG_MMU
 125unsigned long shmem_get_unmapped_area(struct file *file,
 126                                      unsigned long addr,
 127                                      unsigned long len,
 128                                      unsigned long pgoff,
 129                                      unsigned long flags)
 130{
 131        return ramfs_nommu_get_unmapped_area(file, addr, len, pgoff, flags);
 132}
 133#endif
 134
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.