cregit-Linux how code gets into the kernel

Release 4.10 fs/ext2/namei.c

Directory: fs/ext2
/*
 * linux/fs/ext2/namei.c
 *
 * Rewrite to pagecache. Almost all code had been changed, so blame me
 * if the things go wrong. Please, send bug reports to
 * viro@parcelfarce.linux.theplanet.co.uk
 *
 * Stuff here is basically a glue between the VFS and generic UNIXish
 * filesystem that keeps everything in pagecache. All knowledge of the
 * directory layout is in fs/ext2/dir.c - it turned out to be easily separatable
 * and it's easier to debug that way. In principle we might want to
 * generalize that a bit and turn it into a library. Or not.
 *
 * The only non-static object here is ext2_dir_inode_operations.
 *
 * TODO: get rid of kmap() use, add readahead.
 *
 * Copyright (C) 1992, 1993, 1994, 1995
 * Remy Card (card@masi.ibp.fr)
 * Laboratoire MASI - Institut Blaise Pascal
 * Universite Pierre et Marie Curie (Paris VI)
 *
 *  from
 *
 *  linux/fs/minix/namei.c
 *
 *  Copyright (C) 1991, 1992  Linus Torvalds
 *
 *  Big-endian to little-endian byte-swapping/bitmaps by
 *        David S. Miller (davem@caip.rutgers.edu), 1995
 */

#include <linux/pagemap.h>
#include <linux/quotaops.h>
#include "ext2.h"
#include "xattr.h"
#include "acl.h"


static inline int ext2_add_nondir(struct dentry *dentry, struct inode *inode) { int err = ext2_add_link(dentry, inode); if (!err) { unlock_new_inode(inode); d_instantiate(dentry, inode); return 0; } inode_dec_link_count(inode); unlock_new_inode(inode); iput(inode); return err; }

Contributors

PersonTokensPropCommitsCommitProp
linus torvaldslinus torvalds3552.24%114.29%
pre-gitpre-git1826.87%342.86%
al viroal viro1319.40%228.57%
alexey dobriyanalexey dobriyan11.49%114.29%
Total67100.00%7100.00%

/* * Methods themselves. */
static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, unsigned int flags) { struct inode * inode; ino_t ino; if (dentry->d_name.len > EXT2_NAME_LEN) return ERR_PTR(-ENAMETOOLONG); ino = ext2_inode_by_name(dir, &dentry->d_name); inode = NULL; if (ino) { inode = ext2_iget(dir->i_sb, ino); if (inode == ERR_PTR(-ESTALE)) { ext2_error(dir->i_sb, __func__, "deleted inode referenced: %lu", (unsigned long) ino); return ERR_PTR(-EIO); } } return d_splice_alias(inode, dentry); }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git4233.87%325.00%
linus torvaldslinus torvalds3225.81%18.33%
bryan donlanbryan donlan2721.77%18.33%
al viroal viro97.26%325.00%
neil brownneil brown86.45%18.33%
heiko carstensheiko carstens43.23%18.33%
trond myklebusttrond myklebust10.81%18.33%
david howellsdavid howells10.81%18.33%
Total124100.00%12100.00%


struct dentry *ext2_get_parent(struct dentry *child) { struct qstr dotdot = QSTR_INIT("..", 2); unsigned long ino = ext2_inode_by_name(d_inode(child), &dotdot); if (!ino) return ERR_PTR(-ENOENT); return d_obtain_alias(ext2_iget(child->d_sb, ino)); }

Contributors

PersonTokensPropCommitsCommitProp
neil brownneil brown4368.25%114.29%
al viroal viro812.70%228.57%
david howellsdavid howells57.94%228.57%
linus torvaldslinus torvalds46.35%114.29%
christoph hellwigchristoph hellwig34.76%114.29%
Total63100.00%7100.00%

/* * By the time this is called, we already have created * the directory cache entry for the new file, but it * is so far negative - it has no inode. * * If the create succeeds, we fill in the inode information * with d_instantiate(). */
static int ext2_create (struct inode * dir, struct dentry * dentry, umode_t mode, bool excl) { struct inode *inode; int err; err = dquot_initialize(dir); if (err) return err; inode = ext2_new_inode(dir, mode, &dentry->d_name); if (IS_ERR(inode)) return PTR_ERR(inode); inode->i_op = &ext2_file_inode_operations; if (test_opt(inode->i_sb, NOBH)) { inode->i_mapping->a_ops = &ext2_nobh_aops; inode->i_fop = &ext2_file_operations; } else { inode->i_mapping->a_ops = &ext2_aops; inode->i_fop = &ext2_file_operations; } mark_inode_dirty(inode); return ext2_add_nondir(dentry, inode); }

Contributors

PersonTokensPropCommitsCommitProp
linus torvaldslinus torvalds4129.50%17.69%
carsten ottecarsten otte2417.27%17.69%
pre-gitpre-git2215.83%215.38%
christoph hellwigchristoph hellwig1611.51%215.38%
andrew mortonandrew morton139.35%17.69%
jan karajan kara128.63%17.69%
eric pariseric paris53.60%17.69%
al viroal viro32.16%215.38%
matthew wilcoxmatthew wilcox21.44%17.69%
trond myklebusttrond myklebust10.72%17.69%
Total139100.00%13100.00%


static int ext2_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode) { struct inode *inode = ext2_new_inode(dir, mode, NULL); if (IS_ERR(inode)) return PTR_ERR(inode); inode->i_op = &ext2_file_inode_operations; if (test_opt(inode->i_sb, NOBH)) { inode->i_mapping->a_ops = &ext2_nobh_aops; inode->i_fop = &ext2_file_operations; } else { inode->i_mapping->a_ops = &ext2_aops; inode->i_fop = &ext2_file_operations; } mark_inode_dirty(inode); d_tmpfile(dentry, inode); unlock_new_inode(inode); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
al viroal viro11998.35%150.00%
matthew wilcoxmatthew wilcox21.65%150.00%
Total121100.00%2100.00%


static int ext2_mknod (struct inode * dir, struct dentry *dentry, umode_t mode, dev_t rdev) { struct inode * inode; int err; err = dquot_initialize(dir); if (err) return err; inode = ext2_new_inode (dir, mode, &dentry->d_name); err = PTR_ERR(inode); if (!IS_ERR(inode)) { init_special_inode(inode, inode->i_mode, rdev); #ifdef CONFIG_EXT2_FS_XATTR inode->i_op = &ext2_special_inode_operations; #endif mark_inode_dirty(inode); err = ext2_add_nondir(dentry, inode); } return err; }

Contributors

PersonTokensPropCommitsCommitProp
linus torvaldslinus torvalds4942.61%18.33%
pre-gitpre-git2118.26%216.67%
theodore tsotheodore tso1412.17%18.33%
al viroal viro108.70%216.67%
jan karajan kara97.83%18.33%
christoph hellwigchristoph hellwig54.35%216.67%
eric pariseric paris54.35%18.33%
andrew mortonandrew morton10.87%18.33%
andries brouwerandries brouwer10.87%18.33%
Total115100.00%12100.00%


static int ext2_symlink (struct inode * dir, struct dentry * dentry, const char * symname) { struct super_block * sb = dir->i_sb; int err = -ENAMETOOLONG; unsigned l = strlen(symname)+1; struct inode * inode; if (l > sb->s_blocksize) goto out; err = dquot_initialize(dir); if (err) goto out; inode = ext2_new_inode (dir, S_IFLNK | S_IRWXUGO, &dentry->d_name); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out; if (l > sizeof (EXT2_I(inode)->i_data)) { /* slow symlink */ inode->i_op = &ext2_symlink_inode_operations; inode_nohighmem(inode); if (test_opt(inode->i_sb, NOBH)) inode->i_mapping->a_ops = &ext2_nobh_aops; else inode->i_mapping->a_ops = &ext2_aops; err = page_symlink(inode, symname, l); if (err) goto out_fail; } else { /* fast symlink */ inode->i_op = &ext2_fast_symlink_inode_operations; inode->i_link = (char*)EXT2_I(inode)->i_data; memcpy(inode->i_link, symname, l); inode->i_size = l-1; } mark_inode_dirty(inode); err = ext2_add_nondir(dentry, inode); out: return err; out_fail: inode_dec_link_count(inode); unlock_new_inode(inode); iput (inode); goto out; }

Contributors

PersonTokensPropCommitsCommitProp
linus torvaldslinus torvalds12245.19%28.70%
pre-gitpre-git8531.48%1043.48%
andrew mortonandrew morton228.15%28.70%
al viroal viro207.41%313.04%
jan karajan kara93.33%14.35%
christoph hellwigchristoph hellwig51.85%28.70%
eric pariseric paris51.85%14.35%
alexey dobriyanalexey dobriyan10.37%14.35%
theodore tsotheodore tso10.37%14.35%
Total270100.00%23100.00%


static int ext2_link (struct dentry * old_dentry, struct inode * dir, struct dentry *dentry) { struct inode *inode = d_inode(old_dentry); int err; err = dquot_initialize(dir); if (err) return err; inode->i_ctime = current_time(inode); inode_inc_link_count(inode); ihold(inode); err = ext2_add_link(dentry, inode); if (!err) { d_instantiate(dentry, inode); return 0; } inode_dec_link_count(inode); iput(inode); return err; }

Contributors

PersonTokensPropCommitsCommitProp
al viroal viro3734.91%214.29%
pre-gitpre-git3230.19%535.71%
linus torvaldslinus torvalds1514.15%17.14%
jan karajan kara98.49%17.14%
christoph hellwigchristoph hellwig54.72%214.29%
deepa dinamanideepa dinamani43.77%17.14%
david howellsdavid howells32.83%17.14%
alexey dobriyanalexey dobriyan10.94%17.14%
Total106100.00%14100.00%


static int ext2_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode) { struct inode * inode; int err; err = dquot_initialize(dir); if (err) return err; inode_inc_link_count(dir); inode = ext2_new_inode(dir, S_IFDIR | mode, &dentry->d_name); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_dir; inode->i_op = &ext2_dir_inode_operations; inode->i_fop = &ext2_dir_operations; if (test_opt(inode->i_sb, NOBH)) inode->i_mapping->a_ops = &ext2_nobh_aops; else inode->i_mapping->a_ops = &ext2_aops; inode_inc_link_count(inode); err = ext2_make_empty(inode, dir); if (err) goto out_fail; err = ext2_add_link(dentry, inode); if (err) goto out_fail; unlock_new_inode(inode); d_instantiate(dentry, inode); out: return err; out_fail: inode_dec_link_count(inode); inode_dec_link_count(inode); unlock_new_inode(inode); iput(inode); out_dir: inode_dec_link_count(dir); goto out; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git9143.54%1050.00%
linus torvaldslinus torvalds5928.23%15.00%
andrew mortonandrew morton2110.05%15.00%
al viroal viro146.70%315.00%
jan karajan kara94.31%15.00%
alexey dobriyanalexey dobriyan52.39%15.00%
christoph hellwigchristoph hellwig52.39%210.00%
eric pariseric paris52.39%15.00%
Total209100.00%20100.00%


static int ext2_unlink(struct inode * dir, struct dentry *dentry) { struct inode * inode = d_inode(dentry); struct ext2_dir_entry_2 * de; struct page * page; int err; err = dquot_initialize(dir); if (err) goto out; de = ext2_find_entry (dir, &dentry->d_name, &page); if (!de) { err = -ENOENT; goto out; } err = ext2_delete_entry (de, page); if (err) goto out; inode->i_ctime = dir->i_ctime; inode_dec_link_count(inode); err = 0; out: return err; }

Contributors

PersonTokensPropCommitsCommitProp
linus torvaldslinus torvalds6755.37%19.09%
pre-gitpre-git2621.49%436.36%
jan karajan kara1613.22%19.09%
christoph hellwigchristoph hellwig54.13%218.18%
al viroal viro32.48%19.09%
david howellsdavid howells32.48%19.09%
alexey dobriyanalexey dobriyan10.83%19.09%
Total121100.00%11100.00%


static int ext2_rmdir (struct inode * dir, struct dentry *dentry) { struct inode * inode = d_inode(dentry); int err = -ENOTEMPTY; if (ext2_empty_dir(inode)) { err = ext2_unlink(dir, dentry); if (!err) { inode->i_size = 0; inode_dec_link_count(inode); inode_dec_link_count(dir); } } return err; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git5673.68%770.00%
linus torvaldslinus torvalds1519.74%110.00%
david howellsdavid howells33.95%110.00%
alexey dobriyanalexey dobriyan22.63%110.00%
Total76100.00%10100.00%


static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry, struct inode * new_dir, struct dentry * new_dentry, unsigned int flags) { struct inode * old_inode = d_inode(old_dentry); struct inode * new_inode = d_inode(new_dentry); struct page * dir_page = NULL; struct ext2_dir_entry_2 * dir_de = NULL; struct page * old_page; struct ext2_dir_entry_2 * old_de; int err; if (flags & ~RENAME_NOREPLACE) return -EINVAL; err = dquot_initialize(old_dir); if (err) goto out; err = dquot_initialize(new_dir); if (err) goto out; old_de = ext2_find_entry (old_dir, &old_dentry->d_name, &old_page); if (!old_de) { err = -ENOENT; goto out; } if (S_ISDIR(old_inode->i_mode)) { err = -EIO; dir_de = ext2_dotdot(old_inode, &dir_page); if (!dir_de) goto out_old; } if (new_inode) { struct page *new_page; struct ext2_dir_entry_2 *new_de; err = -ENOTEMPTY; if (dir_de && !ext2_empty_dir (new_inode)) goto out_dir; err = -ENOENT; new_de = ext2_find_entry (new_dir, &new_dentry->d_name, &new_page); if (!new_de) goto out_dir; ext2_set_link(new_dir, new_de, new_page, old_inode, 1); new_inode->i_ctime = current_time(new_inode); if (dir_de) drop_nlink(new_inode); inode_dec_link_count(new_inode); } else { err = ext2_add_link(new_dentry, old_inode); if (err) goto out_dir; if (dir_de) inode_inc_link_count(new_dir); } /* * Like most other Unix systems, set the ctime for inodes on a * rename. */ old_inode->i_ctime = current_time(old_inode); mark_inode_dirty(old_inode); ext2_delete_entry (old_de, old_page); if (dir_de) { if (old_dir != new_dir) ext2_set_link(old_inode, dir_de, dir_page, new_dir, 0); else { kunmap(dir_page); put_page(dir_page); } inode_dec_link_count(old_dir); } return 0; out_dir: if (dir_de) { kunmap(dir_page); put_page(dir_page); } out_old: kunmap(old_page); put_page(old_page); out: return err; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git17442.54%1955.88%
linus torvaldslinus torvalds12330.07%12.94%
jan karajan kara358.56%25.88%
miklos szeredimiklos szeredi153.67%12.94%
nicolas pitrenicolas pitre122.93%12.94%
christoph hellwigchristoph hellwig102.44%25.88%
deepa dinamanideepa dinamani81.96%12.94%
josh huntjosh hunt61.47%12.94%
al viroal viro61.47%12.94%
david howellsdavid howells61.47%12.94%
andrew mortonandrew morton51.22%12.94%
alexey dobriyanalexey dobriyan30.73%12.94%
dave hansendave hansen30.73%12.94%
kirill a. shutemovkirill a. shutemov30.73%12.94%
Total409100.00%34100.00%

const struct inode_operations ext2_dir_inode_operations = { .create = ext2_create, .lookup = ext2_lookup, .link = ext2_link, .unlink = ext2_unlink, .symlink = ext2_symlink, .mkdir = ext2_mkdir, .rmdir = ext2_rmdir, .mknod = ext2_mknod, .rename = ext2_rename, #ifdef CONFIG_EXT2_FS_XATTR .listxattr = ext2_listxattr, #endif .setattr = ext2_setattr, .get_acl = ext2_get_acl, .set_acl = ext2_set_acl, .tmpfile = ext2_tmpfile, }; const struct inode_operations ext2_special_inode_operations = { #ifdef CONFIG_EXT2_FS_XATTR .listxattr = ext2_listxattr, #endif .setattr = ext2_setattr, .get_acl = ext2_get_acl, .set_acl = ext2_set_acl, };

Overall Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git60430.94%3136.90%
linus torvaldslinus torvalds56528.94%33.57%
al viroal viro24712.65%1517.86%
jan karajan kara995.07%22.38%
andrew mortonandrew morton804.10%55.95%
christoph hellwigchristoph hellwig713.64%55.95%
theodore tsotheodore tso542.77%22.38%
neil brownneil brown512.61%11.19%
bryan donlanbryan donlan271.38%11.19%
carsten ottecarsten otte241.23%11.19%
david howellsdavid howells211.08%22.38%
eric pariseric paris201.02%11.19%
miklos szeredimiklos szeredi150.77%11.19%
alexey dobriyanalexey dobriyan140.72%11.19%
deepa dinamanideepa dinamani120.61%11.19%
nicolas pitrenicolas pitre120.61%11.19%
james morrisjames morris100.51%11.19%
josh huntjosh hunt60.31%11.19%
heiko carstensheiko carstens40.20%11.19%
matthew wilcoxmatthew wilcox40.20%11.19%
dave hansendave hansen30.15%11.19%
kirill a. shutemovkirill a. shutemov30.15%11.19%
arjan van de venarjan van de ven20.10%11.19%
trond myklebusttrond myklebust20.10%22.38%
maximilian attemsmaximilian attems10.05%11.19%
andries brouwerandries brouwer10.05%11.19%
Total1952100.00%84100.00%
Directory: fs/ext2
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.