cregit-Linux how code gets into the kernel

Release 4.11 fs/ramfs/inode.c

Directory: fs/ramfs
/*
 * Resizable simple ram filesystem for Linux.
 *
 * Copyright (C) 2000 Linus Torvalds.
 *               2000 Transmeta Corp.
 *
 * Usage limits added by David Gibson, Linuxcare Australia.
 * This file is released under the GPL.
 */

/*
 * NOTE! This filesystem is probably most useful
 * not as a real filesystem, but as an example of
 * how virtual filesystems can be written.
 *
 * It doesn't get much simpler than this. Consider
 * that this file implements the full semantics of
 * a POSIX-compliant read-write filesystem.
 *
 * Note in particular how the filesystem does not
 * need to implement any data structures of its own
 * to keep track of the virtual data: using the VFS
 * caches is sufficient.
 */

#include <linux/fs.h>
#include <linux/pagemap.h>
#include <linux/highmem.h>
#include <linux/time.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/backing-dev.h>
#include <linux/ramfs.h>
#include <linux/sched.h>
#include <linux/parser.h>
#include <linux/magic.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include "internal.h"


#define RAMFS_DEFAULT_MODE	0755


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,
};


struct inode *ramfs_get_inode(struct super_block *sb, const struct inode *dir, umode_t mode, dev_t dev) { struct inode * inode = new_inode(sb); if (inode) { inode->i_ino = get_next_ino(); inode_init_owner(inode, dir, mode); inode->i_mapping->a_ops = &ramfs_aops; mapping_set_gfp_mask(inode->i_mapping, GFP_HIGHUSER); mapping_set_unevictable(inode->i_mapping); inode->i_atime = inode->i_mtime = inode->i_ctime = current_time(inode); switch (mode & S_IFMT) { default: init_special_inode(inode, mode, dev); break; case S_IFREG: inode->i_op = &ramfs_file_inode_operations; inode->i_fop = &ramfs_file_operations; break; case S_IFDIR: inode->i_op = &ramfs_dir_inode_operations; inode->i_fop = &simple_dir_operations; /* directory inodes start off with i_nlink == 2 (for "." entry) */ inc_nlink(inode); break; case S_IFLNK: inode->i_op = &page_symlink_inode_operations; inode_nohighmem(inode); break; } } return inode; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)11665.17%213.33%
Dmitriy Monakhov126.74%16.67%
Mel Gorman95.06%16.67%
Hirofumi Ogawa73.93%16.67%
Al Viro73.93%320.00%
Christoph Hellwig73.93%16.67%
Lee Schermerhorn73.93%16.67%
Deepa Dinamani42.25%16.67%
Dave Hansen31.69%16.67%
Linus Torvalds31.69%16.67%
Andrew Morton21.12%16.67%
Andries E. Brouwer10.56%16.67%
Total178100.00%15100.00%

/* * File creation. Allocate an inode, and we're done.. */ /* SMP-safe */
static int 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; if (inode) { d_instantiate(dentry, inode); dget(dentry); /* Extra count - pin the dentry in core */ error = 0; dir->i_mtime = dir->i_ctime = current_time(dir); } return error; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6880.00%116.67%
Andrew Morton910.59%116.67%
Deepa Dinamani44.71%116.67%
Dmitriy Monakhov22.35%116.67%
Andries E. Brouwer11.18%116.67%
Al Viro11.18%116.67%
Total85100.00%6100.00%


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) inc_nlink(dir); return retval; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3164.58%125.00%
Linus Torvalds1327.08%125.00%
Dave Hansen36.25%125.00%
Al Viro12.08%125.00%
Total48100.00%4100.00%


static int ramfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, bool excl) { return ramfs_mknod(dir, dentry, mode | S_IFREG, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)3288.89%125.00%
Al Viro38.33%250.00%
Trond Myklebust12.78%125.00%
Total36100.00%4100.00%


static int ramfs_symlink(struct inode * dir, struct dentry *dentry, const char * symname) { struct inode *inode; int error = -ENOSPC; inode = ramfs_get_inode(dir->i_sb, dir, S_IFLNK|S_IRWXUGO, 0); if (inode) { int l = strlen(symname)+1; error = page_symlink(inode, symname, l); if (!error) { d_instantiate(dentry, inode); dget(dentry); dir->i_mtime = dir->i_ctime = current_time(dir); } else iput(inode); } return error; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6353.85%116.67%
Al Viro3832.48%116.67%
Peter Staubach97.69%116.67%
Deepa Dinamani43.42%116.67%
Dmitriy Monakhov21.71%116.67%
Andrew Morton10.85%116.67%
Total117100.00%6100.00%

static const struct inode_operations ramfs_dir_inode_operations = { .create = ramfs_create, .lookup = simple_lookup, .link = simple_link, .unlink = simple_unlink, .symlink = ramfs_symlink, .mkdir = ramfs_mkdir, .rmdir = simple_rmdir, .mknod = ramfs_mknod, .rename = simple_rename, }; static const struct super_operations ramfs_ops = { .statfs = simple_statfs, .drop_inode = generic_delete_inode, .show_options = generic_show_options, }; struct ramfs_mount_opts { umode_t mode; }; enum { Opt_mode, Opt_err }; static const match_table_t tokens = { {Opt_mode, "mode=%o"}, {Opt_err, NULL} }; struct ramfs_fs_info { struct ramfs_mount_opts mount_opts; };
static int ramfs_parse_options(char *data, struct ramfs_mount_opts *opts) { substring_t args[MAX_OPT_ARGS]; int option; int token; char *p; opts->mode = RAMFS_DEFAULT_MODE; while ((p = strsep(&data, ",")) != NULL) { if (!*p) continue; token = match_token(p, tokens, args); switch (token) { case Opt_mode: if (match_octal(&args[0], &option)) return -EINVAL; opts->mode = option & S_IALLUGO; break; /* * We might like to report bad mount options here; * but traditionally ramfs has ignored all mount options, * and as it is used as a !CONFIG_SHMEM simple substitute * for tmpfs, better continue to ignore other mount options. */ } } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Fengguang Wu11299.12%150.00%
Mike Frysinger10.88%150.00%
Total113100.00%2100.00%


int ramfs_fill_super(struct super_block *sb, void *data, int silent) { struct ramfs_fs_info *fsi; 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) return -ENOMEM; err = ramfs_parse_options(data, &fsi->mount_opts); if (err) return err; sb->s_maxbytes = MAX_LFS_FILESIZE; sb->s_blocksize = PAGE_SIZE; sb->s_blocksize_bits = PAGE_SHIFT; sb->s_magic = RAMFS_MAGIC; sb->s_op = &ramfs_ops; sb->s_time_gran = 1; inode = ramfs_get_inode(sb, NULL, S_IFDIR | fsi->mount_opts.mode, 0); sb->s_root = d_make_root(inode); if (!sb->s_root) return -ENOMEM; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6036.81%110.00%
Fengguang Wu5835.58%110.00%
Al Viro1811.04%330.00%
Ingo Molnar116.75%110.00%
Andi Kleen63.68%110.00%
Andrew Morton63.68%110.00%
Kirill A. Shutemov21.23%110.00%
Dmitriy Monakhov21.23%110.00%
Total163100.00%10100.00%


struct dentry *ramfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) { return mount_nodev(fs_type, flags, data, ramfs_fill_super); }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro3083.33%250.00%
Linus Torvalds (pre-git)513.89%125.00%
Andries E. Brouwer12.78%125.00%
Total36100.00%4100.00%


static void ramfs_kill_sb(struct super_block *sb) { kfree(sb->s_fs_info); kill_litter_super(sb); }

Contributors

PersonTokensPropCommitsCommitProp
Fengguang Wu23100.00%1100.00%
Total23100.00%1100.00%

static struct file_system_type ramfs_fs_type = { .name = "ramfs", .mount = ramfs_mount, .kill_sb = ramfs_kill_sb, .fs_flags = FS_USERNS_MOUNT, };
int __init init_ramfs_fs(void) { static unsigned long once; if (test_and_set_bit(0, &once)) return 0; return register_filesystem(&ramfs_fs_type); }

Contributors

PersonTokensPropCommitsCommitProp
Rob Landley1854.55%150.00%
Linus Torvalds (pre-git)1545.45%150.00%
Total33100.00%2100.00%

fs_initcall(init_ramfs_fs);

Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)45742.59%35.26%
Fengguang Wu24923.21%11.75%
Al Viro11510.72%1424.56%
Andrew Morton312.89%610.53%
Art Haas282.61%11.75%
Axel Lin282.61%11.75%
Linus Torvalds211.96%610.53%
Rob Landley181.68%11.75%
Dmitriy Monakhov181.68%11.75%
Deepa Dinamani121.12%11.75%
Ingo Molnar111.03%11.75%
Mel Gorman90.84%11.75%
Peter Staubach90.84%11.75%
Hirofumi Ogawa70.65%11.75%
Christoph Hellwig70.65%11.75%
Lee Schermerhorn70.65%11.75%
Andi Kleen60.56%11.75%
Dave Hansen60.56%11.75%
Eric W. Biedermann50.47%11.75%
David Howells30.28%11.75%
Tejun Heo30.28%11.75%
Paul Gortmaker30.28%11.75%
Matt Mackall30.28%11.75%
Andries E. Brouwer30.28%23.51%
Maximilian Attems30.28%11.75%
Alexey Dobriyan30.28%11.75%
Arjan van de Ven20.19%11.75%
Kirill A. Shutemov20.19%11.75%
Josef 'Jeff' Sipek20.19%11.75%
Trond Myklebust10.09%11.75%
Mike Frysinger10.09%11.75%
Total1073100.00%57100.00%
Directory: fs/ramfs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.