cregit-Linux how code gets into the kernel

Release 4.18 fs/ufs/namei.c

Directory: fs/ufs
// SPDX-License-Identifier: GPL-2.0
/*
 * linux/fs/ufs/namei.c
 *
 * Migration to usage of "page cache" on May 2006 by
 * Evgeniy Dushistov <dushistov@mail.ru> based on ext2 code base.
 *
 * Copyright (C) 1998
 * Daniel Pirkl <daniel.pirkl@email.cz>
 * Charles University, Faculty of Mathematics and Physics
 *
 *  from
 *
 *  linux/fs/ext2/namei.c
 *
 * 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/time.h>
#include <linux/fs.h>

#include "ufs_fs.h"
#include "ufs.h"
#include "util.h"


static inline int ufs_add_nondir(struct dentry *dentry, struct inode *inode) { int err = ufs_add_link(dentry, inode); if (!err) { d_instantiate_new(dentry, inode); return 0; } inode_dec_link_count(inode); unlock_new_inode(inode); iput(inode); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds3251.61%116.67%
Linus Torvalds (pre-git)2337.10%233.33%
Al Viro69.68%233.33%
Alexey Dobriyan11.61%116.67%
Total62100.00%6100.00%


static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, unsigned int flags) { struct inode * inode = NULL; ino_t ino; if (dentry->d_name.len > UFS_MAXNAMLEN) return ERR_PTR(-ENAMETOOLONG); ino = ufs_inode_by_name(dir, &dentry->d_name); if (ino) inode = ufs_iget(dir->i_sb, ino); return d_splice_alias(inode, dentry); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds4047.62%114.29%
Linus Torvalds (pre-git)3238.10%114.29%
Al Viro78.33%228.57%
Alexey Dobriyan33.57%114.29%
David Howells11.19%114.29%
Trond Myklebust11.19%114.29%
Total84100.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 ufs_create (struct inode * dir, struct dentry * dentry, umode_t mode, bool excl) { struct inode *inode; inode = ufs_new_inode(dir, mode); if (IS_ERR(inode)) return PTR_ERR(inode); inode->i_op = &ufs_file_inode_operations; inode->i_fop = &ufs_file_operations; inode->i_mapping->a_ops = &ufs_aops; mark_inode_dirty(inode); return ufs_add_nondir(dentry, inode); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)4148.24%333.33%
Linus Torvalds2934.12%111.11%
Al Viro1011.76%333.33%
Evgeniy Dushistov44.71%111.11%
Trond Myklebust11.18%111.11%
Total85100.00%9100.00%


static int ufs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t rdev) { struct inode *inode; int err; if (!old_valid_dev(rdev)) return -EINVAL; inode = ufs_new_inode(dir, mode); err = PTR_ERR(inode); if (!IS_ERR(inode)) { init_special_inode(inode, mode, rdev); ufs_set_inode_dev(inode->i_sb, UFS_I(inode), rdev); mark_inode_dirty(inode); err = ufs_add_nondir(dentry, inode); } return err; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds4541.67%112.50%
Linus Torvalds (pre-git)2624.07%112.50%
Al Viro2624.07%337.50%
Andries E. Brouwer65.56%225.00%
Alex Kiernan54.63%112.50%
Total108100.00%8100.00%


static int ufs_symlink (struct inode * dir, struct dentry * dentry, const char * symname) { struct super_block * sb = dir->i_sb; int err; unsigned l = strlen(symname)+1; struct inode * inode; if (l > sb->s_blocksize) return -ENAMETOOLONG; inode = ufs_new_inode(dir, S_IFLNK | S_IRWXUGO); err = PTR_ERR(inode); if (IS_ERR(inode)) return err; if (l > UFS_SB(sb)->s_uspi->s_maxsymlinklen) { /* slow symlink */ inode->i_op = &page_symlink_inode_operations; inode_nohighmem(inode); inode->i_mapping->a_ops = &ufs_aops; err = page_symlink(inode, symname, l); if (err) goto out_fail; } else { /* fast symlink */ inode->i_op = &simple_symlink_inode_operations; inode->i_link = (char *)UFS_I(inode)->i_u1.i_symlink; memcpy(inode->i_link, symname, l); inode->i_size = l-1; } mark_inode_dirty(inode); return ufs_add_nondir(dentry, inode); out_fail: inode_dec_link_count(inode); unlock_new_inode(inode); iput(inode); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds9944.39%215.38%
Linus Torvalds (pre-git)8136.32%215.38%
Al Viro3716.59%538.46%
Dave Jones31.35%17.69%
Andrew Morton10.45%17.69%
Duane Griffin10.45%17.69%
Alexey Dobriyan10.45%17.69%
Total223100.00%13100.00%


static int ufs_link (struct dentry * old_dentry, struct inode * dir, struct dentry *dentry) { struct inode *inode = d_inode(old_dentry); int error; inode->i_ctime = current_time(inode); inode_inc_link_count(inode); ihold(inode); error = ufs_add_link(dentry, inode); if (error) { inode_dec_link_count(inode); iput(inode); } else d_instantiate(dentry, inode); return error; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds3943.82%111.11%
Jan Kara1820.22%111.11%
Linus Torvalds (pre-git)1213.48%111.11%
Al Viro1011.24%222.22%
Deepa Dinamani44.49%111.11%
David Howells33.37%111.11%
Arnd Bergmann22.25%111.11%
Alexey Dobriyan11.12%111.11%
Total89100.00%9100.00%


static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode) { struct inode * inode; int err; inode_inc_link_count(dir); inode = ufs_new_inode(dir, S_IFDIR|mode); err = PTR_ERR(inode); if (IS_ERR(inode)) goto out_dir; inode->i_op = &ufs_dir_inode_operations; inode->i_fop = &ufs_dir_operations; inode->i_mapping->a_ops = &ufs_aops; inode_inc_link_count(inode); err = ufs_make_empty(inode, dir); if (err) goto out_fail; err = ufs_add_link(dentry, inode); if (err) goto out_fail; d_instantiate_new(dentry, inode); return 0; 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); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)8653.09%433.33%
Linus Torvalds3521.60%18.33%
Fabian Frederick1710.49%18.33%
Al Viro116.79%433.33%
Evgeniy Dushistov95.56%18.33%
Alexey Dobriyan42.47%18.33%
Total162100.00%12100.00%


static int ufs_unlink(struct inode *dir, struct dentry *dentry) { struct inode * inode = d_inode(dentry); struct ufs_dir_entry *de; struct page *page; int err = -ENOENT; de = ufs_find_entry(dir, &dentry->d_name, &page); if (!de) goto out; err = ufs_delete_entry(dir, 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 Torvalds4946.67%111.11%
Linus Torvalds (pre-git)4139.05%444.44%
Evgeniy Dushistov87.62%111.11%
Alexey Dobriyan43.81%222.22%
David Howells32.86%111.11%
Total105100.00%9100.00%


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

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds4153.95%116.67%
Linus Torvalds (pre-git)3039.47%350.00%
David Howells33.95%116.67%
Alexey Dobriyan22.63%116.67%
Total76100.00%6100.00%


static int ufs_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 ufs_dir_entry * dir_de = NULL; struct page *old_page; struct ufs_dir_entry *old_de; int err = -ENOENT; if (flags & ~RENAME_NOREPLACE) return -EINVAL; old_de = ufs_find_entry(old_dir, &old_dentry->d_name, &old_page); if (!old_de) goto out; if (S_ISDIR(old_inode->i_mode)) { err = -EIO; dir_de = ufs_dotdot(old_inode, &dir_page); if (!dir_de) goto out_old; } if (new_inode) { struct page *new_page; struct ufs_dir_entry *new_de; err = -ENOTEMPTY; if (dir_de && !ufs_empty_dir(new_inode)) goto out_dir; err = -ENOENT; new_de = ufs_find_entry(new_dir, &new_dentry->d_name, &new_page); if (!new_de) goto out_dir; ufs_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 = ufs_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); ufs_delete_entry(old_dir, old_de, old_page); mark_inode_dirty(old_inode); if (dir_de) { if (old_dir != new_dir) ufs_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
Linus Torvalds (pre-git)17445.91%426.67%
Linus Torvalds10226.91%16.67%
Evgeniy Dushistov359.23%16.67%
Al Viro246.33%213.33%
Miklos Szeredi153.96%16.67%
Alexey Dobriyan92.37%213.33%
Deepa Dinamani82.11%16.67%
David Howells61.58%16.67%
Dave Hansen30.79%16.67%
Kirill A. Shutemov30.79%16.67%
Total379100.00%15100.00%

const struct inode_operations ufs_dir_inode_operations = { .create = ufs_create, .lookup = ufs_lookup, .link = ufs_link, .unlink = ufs_unlink, .symlink = ufs_symlink, .mkdir = ufs_mkdir, .rmdir = ufs_rmdir, .mknod = ufs_mknod, .rename = ufs_rename, };

Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)58640.61%712.50%
Linus Torvalds51235.48%23.57%
Al Viro1319.08%1832.14%
Evgeniy Dushistov573.95%35.36%
Alexey Dobriyan251.73%23.57%
Art Haas181.25%11.79%
Jan Kara181.25%11.79%
Fabian Frederick171.18%11.79%
David Howells161.11%23.57%
Miklos Szeredi151.04%11.79%
Deepa Dinamani120.83%11.79%
Alex Kiernan80.55%11.79%
Andries E. Brouwer60.42%23.57%
Dave Jones40.28%23.57%
Kirill A. Shutemov30.21%11.79%
Dave Hansen30.21%11.79%
Christoph Hellwig30.21%23.57%
Arnd Bergmann20.14%11.79%
Trond Myklebust20.14%23.57%
Arjan van de Ven10.07%11.79%
Andrew Morton10.07%11.79%
Duane Griffin10.07%11.79%
Greg Kroah-Hartman10.07%11.79%
Mike Frysinger10.07%11.79%
Total1443100.00%56100.00%
Directory: fs/ufs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.