linux/fs/ramfs/inode.c
<<
>>
Prefs
   1/*
   2 * Resizable simple ram filesystem for Linux.
   3 *
   4 * Copyright (C) 2000 Linus Torvalds.
   5 *               2000 Transmeta Corp.
   6 *
   7 * Usage limits added by David Gibson, Linuxcare Australia.
   8 * This file is released under the GPL.
   9 */
  10
  11/*
  12 * NOTE! This filesystem is probably most useful
  13 * not as a real filesystem, but as an example of
  14 * how virtual filesystems can be written.
  15 *
  16 * It doesn't get much simpler than this. Consider
  17 * that this file implements the full semantics of
  18 * a POSIX-compliant read-write filesystem.
  19 *
  20 * Note in particular how the filesystem does not
  21 * need to implement any data structures of its own
  22 * to keep track of the virtual data: using the VFS
  23 * caches is sufficient.
  24 */
  25
  26#include <linux/fs.h>
  27#include <linux/pagemap.h>
  28#include <linux/highmem.h>
  29#include <linux/time.h>
  30#include <linux/init.h>
  31#include <linux/string.h>
  32#include <linux/backing-dev.h>
  33#include <linux/ramfs.h>
  34#include <linux/sched.h>
  35#include <linux/parser.h>
  36#include <linux/magic.h>
  37#include <linux/slab.h>
  38#include <linux/uaccess.h>
  39#include "internal.h"
  40
  41struct ramfs_mount_opts {
  42        umode_t mode;
  43};
  44
  45struct ramfs_fs_info {
  46        struct ramfs_mount_opts mount_opts;
  47};
  48
  49#define RAMFS_DEFAULT_MODE      0755
  50
  51static const struct super_operations ramfs_ops;
  52static const struct inode_operations ramfs_dir_inode_operations;
  53
  54static const struct address_space_operations ramfs_aops = {
  55        .readpage       = simple_readpage,
  56        .write_begin    = simple_write_begin,
  57        .write_end      = simple_write_end,
  58        .set_page_dirty = __set_page_dirty_no_writeback,
  59};
  60
  61struct inode *ramfs_get_inode(struct super_block *sb,
  62                                const struct inode *dir, umode_t mode, dev_t dev)
  63{
  64        struct inode * inode = new_inode(sb);
  65
  66        if (inode) {
  67                inode->i_ino = get_next_ino();
  68                inode_init_owner(inode, dir, mode);
  69                inode->i_mapping->a_ops = &ramfs_aops;
  70                mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER);
  71                mapping_set_unevictable(inode->i_mapping);
  72                inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode);
  73                switch (mode & S_IFMT) {
  74                default:
  75                        init_special_inode(inode, mode, dev);
  76                        break;
  77                case S_IFREG:
  78                        inode->i_op = &ramfs_file_inode_operations;
  79                        inode->i_fop = &ramfs_file_operations;
  80                        break;
  81                case S_IFDIR:
  82                        inode->i_op = &ramfs_dir_inode_operations;
  83                        inode->i_fop = &simple_dir_operations;
  84
  85                        /* directory inodes start off with i_nlink == 2 (for "." entry) */
  86                        inc_nlink(inode);
  87                        break;
  88                case S_IFLNK:
  89                        inode->i_op = &page_symlink_inode_operations;
  90                        inode_nohighmem(inode);
  91                        break;
  92                }
  93        }
  94        return inode;
  95}
  96
  97/*
  98 * File creation. Allocate an inode, and we're done..
  99 */
 100/* SMP-safe */
 101static int
 102ramfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev)
 103{
 104        struct inode * inode = ramfs_get_inode(dir->i_sb, dir, mode, dev);
 105        int error = -ENOSPC;
 106
 107        if (inode) {
 108                d_instantiate(dentry, inode);
 109                dget(dentry);   /* Extra count - pin the dentry in core */
 110                error = 0;
 111                dir->i_mtime = dir->i_ctime = current_time(dir);
 112        }
 113        return error;
 114}
 115
 116static int ramfs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
 117{
 118        int retval = ramfs_mknod(dir, dentry, mode | S_IFDIR, 0);
 119        if (!retval)
 120                inc_nlink(dir);
 121        return retval;
 122}
 123
 124static int ramfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl)
 125{
 126        return ramfs_mknod(dir, dentry, mode | S_IFREG, 0);
 127}
 128
 129static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname)
 130{
 131        struct inode *inode;
 132        int error = -ENOSPC;
 133
 134        inode = ramfs_get_inode(dir->i_sb, dir, S_IFLNK|S_IRWXUGO, 0);
 135        if (inode) {
 136                int l = strlen(symname)+1;
 137                error = page_symlink(inode, symname, l);
 138                if (!error) {
 139                        d_instantiate(dentry, inode);
 140                        dget(dentry);
 141                        dir->i_mtime = dir->i_ctime = current_time(dir);
 142                } else
 143                        iput(inode);
 144        }
 145        return error;
 146}
 147
 148static const struct inode_operations ramfs_dir_inode_operations = {
 149        .create         = ramfs_create,
 150        .lookup         = simple_lookup,
 151        .link           = simple_link,
 152        .unlink         = simple_unlink,
 153        .symlink        = ramfs_symlink,
 154        .mkdir          = ramfs_mkdir,
 155        .rmdir          = simple_rmdir,
 156        .mknod          = ramfs_mknod,
 157        .rename         = simple_rename,
 158};
 159
 160/*
 161 * Display the mount options in /proc/mounts.
 162 */
 163static int ramfs_show_options(struct seq_file *m, struct dentry *root)
 164{
 165        struct ramfs_fs_info *fsi = root->d_sb->s_fs_info;
 166
 167        if (fsi->mount_opts.mode != RAMFS_DEFAULT_MODE)
 168                seq_printf(m, ",mode=%o", fsi->mount_opts.mode);
 169        return 0;
 170}
 171
 172static const struct super_operations ramfs_ops = {
 173        .statfs         = simple_statfs,
 174        .drop_inode     = generic_delete_inode,
 175        .show_options   = ramfs_show_options,
 176};
 177
 178enum {
 179        Opt_mode,
 180        Opt_err
 181};
 182
 183static const match_table_t tokens = {
 184        {Opt_mode, "mode=%o"},
 185        {Opt_err, NULL}
 186};
 187
 188static int ramfs_parse_options(char *data, struct ramfs_mount_opts *opts)
 189{
 190        substring_t args[MAX_OPT_ARGS];
 191        int option;
 192        int token;
 193        char *p;
 194
 195        opts->mode = RAMFS_DEFAULT_MODE;
 196
 197        while ((p = strsep(&data, ",")) != NULL) {
 198                if (!*p)
 199                        continue;
 200
 201                token = match_token(p, tokens, args);
 202                switch (token) {
 203                case Opt_mode:
 204                        if (match_octal(&args[0], &option))
 205                                return -EINVAL;
 206                        opts->mode = option & S_IALLUGO;
 207                        break;
 208                /*
 209                 * We might like to report bad mount options here;
 210                 * but traditionally ramfs has ignored all mount options,
 211                 * and as it is used as a !CONFIG_SHMEM simple substitute
 212                 * for tmpfs, better continue to ignore other mount options.
 213                 */
 214                }
 215        }
 216
 217        return 0;
 218}
 219
 220int ramfs_fill_super(struct super_block *sb, void *data, int silent)
 221{
 222        struct ramfs_fs_info *fsi;
 223        struct inode *inode;
 224        int err;
 225
 226        fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL);
 227        sb->s_fs_info = fsi;
 228        if (!fsi)
 229                return -ENOMEM;
 230
 231        err = ramfs_parse_options(data, &fsi->mount_opts);
 232        if (err)
 233                return err;
 234
 235        sb->s_maxbytes          = MAX_LFS_FILESIZE;
 236        sb->s_blocksize         = PAGE_SIZE;
 237        sb->s_blocksize_bits    = PAGE_SHIFT;
 238        sb->s_magic             = RAMFS_MAGIC;
 239        sb->s_op                = &ramfs_ops;
 240        sb->s_time_gran         = 1;
 241
 242        inode = ramfs_get_inode(sb, NULL, S_IFDIR | fsi->mount_opts.mode, 0);
 243        sb->s_root = d_make_root(inode);
 244        if (!sb->s_root)
 245                return -ENOMEM;
 246
 247        return 0;
 248}
 249
 250struct dentry *ramfs_mount(struct file_system_type *fs_type,
 251        int flags, const char *dev_name, void *data)
 252{
 253        return mount_nodev(fs_type, flags, data, ramfs_fill_super);
 254}
 255
 256static void ramfs_kill_sb(struct super_block *sb)
 257{
 258        kfree(sb->s_fs_info);
 259        kill_litter_super(sb);
 260}
 261
 262static struct file_system_type ramfs_fs_type = {
 263        .name           = "ramfs",
 264        .mount          = ramfs_mount,
 265        .kill_sb        = ramfs_kill_sb,
 266        .fs_flags       = FS_USERNS_MOUNT,
 267};
 268
 269static int __init init_ramfs_fs(void)
 270{
 271        return register_filesystem(&ramfs_fs_type);
 272}
 273fs_initcall(init_ramfs_fs);
 274