cregit-Linux how code gets into the kernel

Release 4.17 fs/efs/namei.c

Directory: fs/efs
// SPDX-License-Identifier: GPL-2.0
/*
 * namei.c
 *
 * Copyright (c) 1999 Al Smith
 *
 * Portions derived from work (c) 1995,1996 Christian Vogelgsang.
 */

#include <linux/buffer_head.h>
#include <linux/string.h>
#include <linux/exportfs.h>
#include "efs.h"



static efs_ino_t efs_find_entry(struct inode *inode, const char *name, int len) { struct buffer_head *bh; int slot, namelen; char *nameptr; struct efs_dir *dirblock; struct efs_dentry *dirslot; efs_ino_t inodenum; efs_block_t block; if (inode->i_size & (EFS_DIRBSIZE-1)) pr_warn("%s(): directory size not a multiple of EFS_DIRBSIZE\n", __func__); for(block = 0; block < inode->i_blocks; block++) { bh = sb_bread(inode->i_sb, efs_bmap(inode, block)); if (!bh) { pr_err("%s(): failed to read dir block %d\n", __func__, block); return 0; } dirblock = (struct efs_dir *) bh->b_data; if (be16_to_cpu(dirblock->magic) != EFS_DIRBLK_MAGIC) { pr_err("%s(): invalid directory block\n", __func__); brelse(bh); return 0; } for (slot = 0; slot < dirblock->slots; slot++) { dirslot = (struct efs_dentry *) (((char *) bh->b_data) + EFS_SLOTAT(dirblock, slot)); namelen = dirslot->namelen; nameptr = dirslot->name; if ((namelen == len) && (!memcmp(name, nameptr, len))) { inodenum = be32_to_cpu(dirslot->inode); brelse(bh); return inodenum; } } brelse(bh); } return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)24794.64%125.00%
Fabian Frederick124.60%250.00%
Linus Torvalds20.77%125.00%
Total261100.00%4100.00%


struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) { efs_ino_t inodenum; struct inode *inode = NULL; inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len); if (inodenum) inode = efs_iget(dir->i_sb, inodenum); return d_splice_alias(inode, dentry); }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)6183.56%116.67%
Al Viro912.33%350.00%
David Howells22.74%116.67%
Trond Myklebust11.37%116.67%
Total73100.00%6100.00%


static struct inode *efs_nfs_get_inode(struct super_block *sb, u64 ino, u32 generation) { struct inode *inode; if (ino == 0) return ERR_PTR(-ESTALE); inode = efs_iget(sb, ino); if (IS_ERR(inode)) return ERR_CAST(inode); if (generation && inode->i_generation != generation) { iput(inode); return ERR_PTR(-ESTALE); } return inode; }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Hellwig8093.02%266.67%
David Howells66.98%133.33%
Total86100.00%3100.00%


struct dentry *efs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, int fh_type) { return generic_fh_to_dentry(sb, fid, fh_len, fh_type, efs_nfs_get_inode); }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Hellwig37100.00%2100.00%
Total37100.00%2100.00%


struct dentry *efs_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len, int fh_type) { return generic_fh_to_parent(sb, fid, fh_len, fh_type, efs_nfs_get_inode); }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Hellwig37100.00%2100.00%
Total37100.00%2100.00%


struct dentry *efs_get_parent(struct dentry *child) { struct dentry *parent = ERR_PTR(-ENOENT); efs_ino_t ino; ino = efs_find_entry(d_inode(child), "..", 2); if (ino) parent = d_obtain_alias(efs_iget(child->d_sb, ino)); return parent; }

Contributors

PersonTokensPropCommitsCommitProp
Christoph Hellwig5590.16%240.00%
David Howells58.20%240.00%
Al Viro11.64%120.00%
Total61100.00%5100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)31455.18%210.53%
Christoph Hellwig21637.96%631.58%
David Howells132.28%210.53%
Fabian Frederick122.11%210.53%
Al Viro101.76%421.05%
Linus Torvalds20.35%15.26%
Trond Myklebust10.18%15.26%
Greg Kroah-Hartman10.18%15.26%
Total569100.00%19100.00%
Directory: fs/efs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.