cregit-Linux how code gets into the kernel

Release 4.10 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
pre-gitpre-git11665.17%213.33%
dmitriy monakhovdmitriy monakhov126.74%16.67%
mel gormanmel gorman95.06%16.67%
christoph hellwigchristoph hellwig73.93%16.67%
al viroal viro73.93%320.00%
lee schermerhornlee schermerhorn73.93%16.67%
hirofumi ogawahirofumi ogawa73.93%16.67%
deepa dinamanideepa dinamani42.25%16.67%
dave hansendave hansen31.69%16.67%
linus torvaldslinus torvalds31.69%16.67%
andrew mortonandrew morton21.12%16.67%
andries brouwerandries 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
pre-gitpre-git6880.00%116.67%
andrew mortonandrew morton910.59%116.67%
deepa dinamanideepa dinamani44.71%116.67%
dmitriy monakhovdmitriy monakhov22.35%116.67%
andries brouwerandries brouwer11.18%116.67%
al viroal 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
pre-gitpre-git3164.58%125.00%
linus torvaldslinus torvalds1327.08%125.00%
dave hansendave hansen36.25%125.00%
al viroal 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
pre-gitpre-git3288.89%125.00%
al viroal viro38.33%250.00%
trond myklebusttrond 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
pre-gitpre-git6353.85%116.67%
al viroal viro3832.48%116.67%
peter staubachpeter staubach97.69%116.67%
deepa dinamanideepa dinamani43.42%116.67%
dmitriy monakhovdmitriy monakhov21.71%116.67%
andrew mortonandrew 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 wufengguang wu11299.12%150.00%
mike frysingermike 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
pre-gitpre-git6036.81%110.00%
fengguang wufengguang wu5835.58%110.00%
al viroal viro1811.04%330.00%
ingo molnaringo molnar116.75%110.00%
andi kleenandi kleen63.68%110.00%
andrew mortonandrew morton63.68%110.00%
kirill a. shutemovkirill a. shutemov21.23%110.00%
dmitriy monakhovdmitriy 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 viroal viro3083.33%250.00%
pre-gitpre-git513.89%125.00%
andries brouwerandries 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 wufengguang 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 landleyrob landley1854.55%150.00%
pre-gitpre-git1545.45%150.00%
Total33100.00%2100.00%

fs_initcall(init_ramfs_fs);

Overall Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git45742.59%35.26%
fengguang wufengguang wu24923.21%11.75%
al viroal viro11510.72%1424.56%
andrew mortonandrew morton312.89%610.53%
axel linaxel lin282.61%11.75%
art haasart haas282.61%11.75%
linus torvaldslinus torvalds211.96%610.53%
dmitriy monakhovdmitriy monakhov181.68%11.75%
rob landleyrob landley181.68%11.75%
deepa dinamanideepa dinamani121.12%11.75%
ingo molnaringo molnar111.03%11.75%
peter staubachpeter staubach90.84%11.75%
mel gormanmel gorman90.84%11.75%
christoph hellwigchristoph hellwig70.65%11.75%
lee schermerhornlee schermerhorn70.65%11.75%
hirofumi ogawahirofumi ogawa70.65%11.75%
dave hansendave hansen60.56%11.75%
andi kleenandi kleen60.56%11.75%
eric w. biedermaneric w. biederman50.47%11.75%
andries brouwerandries brouwer30.28%23.51%
paul gortmakerpaul gortmaker30.28%11.75%
maximilian attemsmaximilian attems30.28%11.75%
tejun heotejun heo30.28%11.75%
alexey dobriyanalexey dobriyan30.28%11.75%
matt mackallmatt mackall30.28%11.75%
david howellsdavid howells30.28%11.75%
kirill a. shutemovkirill a. shutemov20.19%11.75%
arjan van de venarjan van de ven20.19%11.75%
josef 'jeff' sipekjosef 'jeff' sipek20.19%11.75%
mike frysingermike frysinger10.09%11.75%
trond myklebusttrond myklebust10.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.