Release 4.7 fs/bfs/inode.c
/*
* fs/bfs/inode.c
* BFS superblock and inode operations.
* Copyright (C) 1999-2006 Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
* From fs/minix, Copyright (C) 1991, 1992 Linus Torvalds.
*
* Made endianness-clean by Andrew Stribblehill <ads@wompom.org>, 2005.
*/
#include <linux/module.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/buffer_head.h>
#include <linux/vfs.h>
#include <linux/writeback.h>
#include <linux/uio.h>
#include <asm/uaccess.h>
#include "bfs.h"
MODULE_AUTHOR("Tigran Aivazian <tigran@aivazian.fsnet.co.uk>");
MODULE_DESCRIPTION("SCO UnixWare BFS filesystem for Linux");
MODULE_LICENSE("GPL");
#undef DEBUG
#ifdef DEBUG
#define dprintf(x...) printf(x)
#else
#define dprintf(x...)
#endif
struct inode *bfs_iget(struct super_block *sb, unsigned long ino)
{
struct bfs_inode *di;
struct inode *inode;
struct buffer_head *bh;
int block, off;
inode = iget_locked(sb, ino);
if (!inode)
return ERR_PTR(-ENOMEM);
if (!(inode->i_state & I_NEW))
return inode;
if ((ino < BFS_ROOT_INO) || (ino > BFS_SB(inode->i_sb)->si_lasti)) {
printf("Bad inode number %s:%08lx\n", inode->i_sb->s_id, ino);
goto error;
}
block = (ino - BFS_ROOT_INO) / BFS_INODES_PER_BLOCK + 1;
bh = sb_bread(inode->i_sb, block);
if (!bh) {
printf("Unable to read inode %s:%08lx\n", inode->i_sb->s_id,
ino);
goto error;
}
off = (ino - BFS_ROOT_INO) % BFS_INODES_PER_BLOCK;
di = (struct bfs_inode *)bh->b_data + off;
inode->i_mode = 0x0000FFFF & le32_to_cpu(di->i_mode);
if (le32_to_cpu(di->i_vtype) == BFS_VDIR) {
inode->i_mode |= S_IFDIR;
inode->i_op = &bfs_dir_inops;
inode->i_fop = &bfs_dir_operations;
} else if (le32_to_cpu(di->i_vtype) == BFS_VREG) {
inode->i_mode |= S_IFREG;
inode->i_op = &bfs_file_inops;
inode->i_fop = &bfs_file_operations;
inode->i_mapping->a_ops = &bfs_aops;
}
BFS_I(inode)->i_sblock = le32_to_cpu(di->i_sblock);
BFS_I(inode)->i_eblock = le32_to_cpu(di->i_eblock);
BFS_I(inode)->i_dsk_ino = le16_to_cpu(di->i_ino);
i_uid_write(inode, le32_to_cpu(di->i_uid));
i_gid_write(inode, le32_to_cpu(di->i_gid));
set_nlink(inode, le32_to_cpu(di->i_nlink));
inode->i_size = BFS_FILESIZE(di);
inode->i_blocks = BFS_FILEBLOCKS(di);
inode->i_atime.tv_sec = le32_to_cpu(di->i_atime);
inode->i_mtime.tv_sec = le32_to_cpu(di->i_mtime);
inode->i_ctime.tv_sec = le32_to_cpu(di->i_ctime);
inode->i_atime.tv_nsec = 0;
inode->i_mtime.tv_nsec = 0;
inode->i_ctime.tv_nsec = 0;
brelse(bh);
unlock_new_inode(inode);
return inode;
error:
iget_failed(inode);
return ERR_PTR(-EIO);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 244 | 53.74% | 4 | 26.67% |
david howells | david howells | 76 | 16.74% | 1 | 6.67% |
andrew stribblehill | andrew stribblehill | 55 | 12.11% | 1 | 6.67% |
andi kleen | andi kleen | 30 | 6.61% | 1 | 6.67% |
dmitri vorobiev | dmitri vorobiev | 18 | 3.96% | 1 | 6.67% |
linus torvalds | linus torvalds | 14 | 3.08% | 3 | 20.00% |
eric w. biederman | eric w. biederman | 8 | 1.76% | 1 | 6.67% |
miklos szeredi | miklos szeredi | 4 | 0.88% | 1 | 6.67% |
dave jones | dave jones | 4 | 0.88% | 1 | 6.67% |
dan carpenter | dan carpenter | 1 | 0.22% | 1 | 6.67% |
| Total | 454 | 100.00% | 15 | 100.00% |
static struct bfs_inode *find_inode(struct super_block *sb, u16 ino, struct buffer_head **p)
{
if ((ino < BFS_ROOT_INO) || (ino > BFS_SB(sb)->si_lasti)) {
printf("Bad inode number %s:%08x\n", sb->s_id, ino);
return ERR_PTR(-EIO);
}
ino -= BFS_ROOT_INO;
*p = sb_bread(sb, 1 + ino / BFS_INODES_PER_BLOCK);
if (!*p) {
printf("Unable to read inode %s:%08x\n", sb->s_id, ino);
return ERR_PTR(-EIO);
}
return (struct bfs_inode *)(*p)->b_data + ino % BFS_INODES_PER_BLOCK;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
al viro | al viro | 122 | 100.00% | 1 | 100.00% |
| Total | 122 | 100.00% | 1 | 100.00% |
static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc)
{
struct bfs_sb_info *info = BFS_SB(inode->i_sb);
unsigned int ino = (u16)inode->i_ino;
unsigned long i_sblock;
struct bfs_inode *di;
struct buffer_head *bh;
int err = 0;
dprintf("ino=%08x\n", ino);
di = find_inode(inode->i_sb, ino, &bh);
if (IS_ERR(di))
return PTR_ERR(di);
mutex_lock(&info->bfs_lock);
if (ino == BFS_ROOT_INO)
di->i_vtype = cpu_to_le32(BFS_VDIR);
else
di->i_vtype = cpu_to_le32(BFS_VREG);
di->i_ino = cpu_to_le16(ino);
di->i_mode = cpu_to_le32(inode->i_mode);
di->i_uid = cpu_to_le32(i_uid_read(inode));
di->i_gid = cpu_to_le32(i_gid_read(inode));
di->i_nlink = cpu_to_le32(inode->i_nlink);
di->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
di->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
di->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
i_sblock = BFS_I(inode)->i_sblock;
di->i_sblock = cpu_to_le32(i_sblock);
di->i_eblock = cpu_to_le32(BFS_I(inode)->i_eblock);
di->i_eoffset = cpu_to_le32(i_sblock * BFS_BSIZE + inode->i_size - 1);
mark_buffer_dirty(bh);
if (wbc->sync_mode == WB_SYNC_ALL) {
sync_dirty_buffer(bh);
if (buffer_req(bh) && !buffer_uptodate(bh))
err = -EIO;
}
brelse(bh);
mutex_unlock(&info->bfs_lock);
return err;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 153 | 47.52% | 3 | 21.43% |
andrew stribblehill | andrew stribblehill | 62 | 19.25% | 1 | 7.14% |
al viro | al viro | 56 | 17.39% | 2 | 14.29% |
dmitri vorobiev | dmitri vorobiev | 16 | 4.97% | 1 | 7.14% |
linus torvalds | linus torvalds | 11 | 3.42% | 3 | 21.43% |
christoph hellwig | christoph hellwig | 9 | 2.80% | 1 | 7.14% |
eric w. biederman | eric w. biederman | 6 | 1.86% | 1 | 7.14% |
andi kleen | andi kleen | 6 | 1.86% | 1 | 7.14% |
andrey v. savochkin | andrey v. savochkin | 3 | 0.93% | 1 | 7.14% |
| Total | 322 | 100.00% | 14 | 100.00% |
static void bfs_evict_inode(struct inode *inode)
{
unsigned long ino = inode->i_ino;
struct bfs_inode *di;
struct buffer_head *bh;
struct super_block *s = inode->i_sb;
struct bfs_sb_info *info = BFS_SB(s);
struct bfs_inode_info *bi = BFS_I(inode);
dprintf("ino=%08lx\n", ino);
truncate_inode_pages_final(&inode->i_data);
invalidate_inode_buffers(inode);
clear_inode(inode);
if (inode->i_nlink)
return;
di = find_inode(s, inode->i_ino, &bh);
if (IS_ERR(di))
return;
mutex_lock(&info->bfs_lock);
/* clear on-disk inode */
memset(di, 0, sizeof(struct bfs_inode));
mark_buffer_dirty(bh);
brelse(bh);
if (bi->i_dsk_ino) {
if (bi->i_sblock)
info->si_freeb += bi->i_eblock + 1 - bi->i_sblock;
info->si_freei++;
clear_bit(ino, info->si_imap);
bfs_dump_imap("delete_inode", s);
}
/*
* If this was the last file, make the previous block
* "last block of the last file" even if there is no
* real file there, saves us 1 gap.
*/
if (info->si_lf_eblk == bi->i_eblock)
info->si_lf_eblk = bi->i_sblock - 1;
mutex_unlock(&info->bfs_lock);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 96 | 43.24% | 3 | 20.00% |
dmitri vorobiev | dmitri vorobiev | 40 | 18.02% | 2 | 13.33% |
al viro | al viro | 37 | 16.67% | 2 | 13.33% |
dave jones | dave jones | 20 | 9.01% | 1 | 6.67% |
andrew stribblehill | andrew stribblehill | 15 | 6.76% | 1 | 6.67% |
mark fasheh | mark fasheh | 7 | 3.15% | 1 | 6.67% |
linus torvalds | linus torvalds | 4 | 1.80% | 2 | 13.33% |
johannes weiner | johannes weiner | 1 | 0.45% | 1 | 6.67% |
fabian frederick | fabian frederick | 1 | 0.45% | 1 | 6.67% |
jan kara | jan kara | 1 | 0.45% | 1 | 6.67% |
| Total | 222 | 100.00% | 15 | 100.00% |
static void bfs_put_super(struct super_block *s)
{
struct bfs_sb_info *info = BFS_SB(s);
if (!info)
return;
mutex_destroy(&info->bfs_lock);
kfree(info->si_imap);
kfree(info);
s->s_fs_info = NULL;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
dave jones | dave jones | 20 | 37.74% | 1 | 20.00% |
pre-git | pre-git | 18 | 33.96% | 1 | 20.00% |
dmitri vorobiev | dmitri vorobiev | 8 | 15.09% | 1 | 20.00% |
eric sesterhenn | eric sesterhenn | 6 | 11.32% | 1 | 20.00% |
brian gerst | brian gerst | 1 | 1.89% | 1 | 20.00% |
| Total | 53 | 100.00% | 5 | 100.00% |
static int bfs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
struct super_block *s = dentry->d_sb;
struct bfs_sb_info *info = BFS_SB(s);
u64 id = huge_encode_dev(s->s_bdev->bd_dev);
buf->f_type = BFS_MAGIC;
buf->f_bsize = s->s_blocksize;
buf->f_blocks = info->si_blocks;
buf->f_bfree = buf->f_bavail = info->si_freeb;
buf->f_files = info->si_lasti + 1 - BFS_ROOT_INO;
buf->f_ffree = info->si_freei;
buf->f_fsid.val[0] = (u32)id;
buf->f_fsid.val[1] = (u32)(id >> 32);
buf->f_namelen = BFS_NAMELEN;
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 79 | 55.63% | 2 | 28.57% |
al viro | al viro | 33 | 23.24% | 2 | 28.57% |
dave jones | dave jones | 18 | 12.68% | 1 | 14.29% |
david howells | david howells | 11 | 7.75% | 1 | 14.29% |
andrew morton | andrew morton | 1 | 0.70% | 1 | 14.29% |
| Total | 142 | 100.00% | 7 | 100.00% |
static struct kmem_cache *bfs_inode_cachep;
static struct inode *bfs_alloc_inode(struct super_block *sb)
{
struct bfs_inode_info *bi;
bi = kmem_cache_alloc(bfs_inode_cachep, GFP_KERNEL);
if (!bi)
return NULL;
return &bi->vfs_inode;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
linus torvalds | linus torvalds | 40 | 97.56% | 1 | 50.00% |
christoph lameter | christoph lameter | 1 | 2.44% | 1 | 50.00% |
| Total | 41 | 100.00% | 2 | 100.00% |
static void bfs_i_callback(struct rcu_head *head)
{
struct inode *inode = container_of(head, struct inode, i_rcu);
kmem_cache_free(bfs_inode_cachep, BFS_I(inode));
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
nick piggin | nick piggin | 19 | 52.78% | 1 | 50.00% |
linus torvalds | linus torvalds | 17 | 47.22% | 1 | 50.00% |
| Total | 36 | 100.00% | 2 | 100.00% |
static void bfs_destroy_inode(struct inode *inode)
{
call_rcu(&inode->i_rcu, bfs_i_callback);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
nick piggin | nick piggin | 20 | 95.24% | 1 | 50.00% |
linus torvalds | linus torvalds | 1 | 4.76% | 1 | 50.00% |
| Total | 21 | 100.00% | 2 | 100.00% |
static void init_once(void *foo)
{
struct bfs_inode_info *bi = foo;
inode_init_once(&bi->vfs_inode);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
linus torvalds | linus torvalds | 22 | 88.00% | 1 | 50.00% |
christoph lameter | christoph lameter | 3 | 12.00% | 1 | 50.00% |
| Total | 25 | 100.00% | 2 | 100.00% |
static int __init init_inodecache(void)
{
bfs_inode_cachep = kmem_cache_create("bfs_inode_cache",
sizeof(struct bfs_inode_info),
0, (SLAB_RECLAIM_ACCOUNT|
SLAB_MEM_SPREAD|SLAB_ACCOUNT),
init_once);
if (bfs_inode_cachep == NULL)
return -ENOMEM;
return 0;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
linus torvalds | linus torvalds | 39 | 82.98% | 1 | 16.67% |
paul jackson | paul jackson | 4 | 8.51% | 2 | 33.33% |
vladimir davydov | vladimir davydov | 2 | 4.26% | 1 | 16.67% |
andrew morton | andrew morton | 1 | 2.13% | 1 | 16.67% |
fabian frederick | fabian frederick | 1 | 2.13% | 1 | 16.67% |
| Total | 47 | 100.00% | 6 | 100.00% |
static void destroy_inodecache(void)
{
/*
* Make sure all delayed rcu free inodes are flushed before we
* destroy cache.
*/
rcu_barrier();
kmem_cache_destroy(bfs_inode_cachep);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
linus torvalds | linus torvalds | 13 | 76.47% | 1 | 50.00% |
kirill a. shutemov | kirill a. shutemov | 4 | 23.53% | 1 | 50.00% |
| Total | 17 | 100.00% | 2 | 100.00% |
static const struct super_operations bfs_sops = {
.alloc_inode = bfs_alloc_inode,
.destroy_inode = bfs_destroy_inode,
.write_inode = bfs_write_inode,
.evict_inode = bfs_evict_inode,
.put_super = bfs_put_super,
.statfs = bfs_statfs,
};
void bfs_dump_imap(const char *prefix, struct super_block *s)
{
#ifdef DEBUG
int i;
char *tmpbuf = (char *)get_zeroed_page(GFP_KERNEL);
if (!tmpbuf)
return;
for (i = BFS_SB(s)->si_lasti; i >= 0; i--) {
if (i > PAGE_SIZE - 100) break;
if (test_bit(i, BFS_SB(s)->si_imap))
strcat(tmpbuf, "1");
else
strcat(tmpbuf, "0");
}
printf("BFS-fs: %s: lasti=%08lx <%s>\n",
prefix, BFS_SB(s)->si_lasti, tmpbuf);
free_page((unsigned long)tmpbuf);
#endif
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
andrew stribblehill | andrew stribblehill | 106 | 84.80% | 1 | 25.00% |
pre-git | pre-git | 17 | 13.60% | 1 | 25.00% |
dmitri vorobiev | dmitri vorobiev | 1 | 0.80% | 1 | 25.00% |
fabian frederick | fabian frederick | 1 | 0.80% | 1 | 25.00% |
| Total | 125 | 100.00% | 4 | 100.00% |
static int bfs_fill_super(struct super_block *s, void *data, int silent)
{
struct buffer_head *bh, *sbh;
struct bfs_super_block *bfs_sb;
struct inode *inode;
unsigned i, imap_len;
struct bfs_sb_info *info;
int ret = -EINVAL;
unsigned long i_sblock, i_eblock, i_eoff, s_size;
info = kzalloc(sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;
mutex_init(&info->bfs_lock);
s->s_fs_info = info;
sb_set_blocksize(s, BFS_BSIZE);
sbh = sb_bread(s, 0);
if (!sbh)
goto out;
bfs_sb = (struct bfs_super_block *)sbh->b_data;
if (le32_to_cpu(bfs_sb->s_magic) != BFS_MAGIC) {
if (!silent)
printf("No BFS filesystem on %s (magic=%08x)\n",
s->s_id, le32_to_cpu(bfs_sb->s_magic));
goto out1;
}
if (BFS_UNCLEAN(bfs_sb, s) && !silent)
printf("%s is unclean, continuing\n", s->s_id);
s->s_magic = BFS_MAGIC;
if (le32_to_cpu(bfs_sb->s_start) > le32_to_cpu(bfs_sb->s_end)) {
printf("Superblock is corrupted\n");
goto out1;
}
info->si_lasti = (le32_to_cpu(bfs_sb->s_start) - BFS_BSIZE) /
sizeof(struct bfs_inode)
+ BFS_ROOT_INO - 1;
imap_len = (info->si_lasti / 8) + 1;
info->si_imap = kzalloc(imap_len, GFP_KERNEL);
if (!info->si_imap)
goto out1;
for (i = 0; i < BFS_ROOT_INO; i++)
set_bit(i, info->si_imap);
s->s_op = &bfs_sops;
inode = bfs_iget(s, BFS_ROOT_INO);
if (IS_ERR(inode)) {
ret = PTR_ERR(inode);
goto out2;
}
s->s_root = d_make_root(inode);
if (!s->s_root) {
ret = -ENOMEM;
goto out2;
}
info->si_blocks = (le32_to_cpu(bfs_sb->s_end) + 1) >> BFS_BSIZE_BITS;
info->si_freeb = (le32_to_cpu(bfs_sb->s_end) + 1
- le32_to_cpu(bfs_sb->s_start)) >> BFS_BSIZE_BITS;
info->si_freei = 0;
info->si_lf_eblk = 0;
/* can we read the last block? */
bh = sb_bread(s, info->si_blocks - 1);
if (!bh) {
printf("Last block not available: %lu\n", info->si_blocks - 1);
ret = -EIO;
goto out3;
}
brelse(bh);
bh = NULL;
for (i = BFS_ROOT_INO; i <= info->si_lasti; i++) {
struct bfs_inode *di;
int block = (i - BFS_ROOT_INO) / BFS_INODES_PER_BLOCK + 1;
int off = (i - BFS_ROOT_INO) % BFS_INODES_PER_BLOCK;
unsigned long eblock;
if (!off) {
brelse(bh);
bh = sb_bread(s, block);
}
if (!bh)
continue;
di = (struct bfs_inode *)bh->b_data + off;
/* test if filesystem is not corrupted */
i_eoff = le32_to_cpu(di->i_eoffset);
i_sblock = le32_to_cpu(di->i_sblock);
i_eblock = le32_to_cpu(di->i_eblock);
s_size = le32_to_cpu(bfs_sb->s_end);
if (i_sblock > info->si_blocks ||
i_eblock > info->si_blocks ||
i_sblock > i_eblock ||
i_eoff > s_size ||
i_sblock * BFS_BSIZE > i_eoff) {
printf("Inode 0x%08x corrupted\n", i);
brelse(bh);
ret = -EIO;
goto out3;
}
if (!di->i_ino) {
info->si_freei++;
continue;
}
set_bit(i, info->si_imap);
info->si_freeb -= BFS_FILEBLOCKS(di);
eblock = le32_to_cpu(di->i_eblock);
if (eblock > info->si_lf_eblk)
info->si_lf_eblk = eblock;
}
brelse(bh);
brelse(sbh);
bfs_dump_imap("read_super", s);
return 0;
out3:
dput(s->s_root);
s->s_root = NULL;
out2:
kfree(info->si_imap);
out1:
brelse(sbh);
out:
mutex_destroy(&info->bfs_lock);
kfree(info);
s->s_fs_info = NULL;
return ret;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 319 | 41.21% | 3 | 12.50% |
eric sesterhenn | eric sesterhenn | 161 | 20.80% | 2 | 8.33% |
al viro | al viro | 150 | 19.38% | 4 | 16.67% |
dave jones | dave jones | 71 | 9.17% | 1 | 4.17% |
david howells | david howells | 22 | 2.84% | 1 | 4.17% |
andrew stribblehill | andrew stribblehill | 18 | 2.33% | 1 | 4.17% |
linus torvalds | linus torvalds | 11 | 1.42% | 5 | 20.83% |
artem bityutskiy | artem bityutskiy | 9 | 1.16% | 1 | 4.17% |
dmitri vorobiev | dmitri vorobiev | 7 | 0.90% | 2 | 8.33% |
brian gerst | brian gerst | 2 | 0.26% | 1 | 4.17% |
panagiotis issaris* | panagiotis issaris* | 2 | 0.26% | 1 | 4.17% |
alexey dobriyan | alexey dobriyan | 1 | 0.13% | 1 | 4.17% |
fabian frederick | fabian frederick | 1 | 0.13% | 1 | 4.17% |
| Total | 774 | 100.00% | 24 | 100.00% |
static struct dentry *bfs_mount(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data)
{
return mount_bdev(fs_type, flags, dev_name, data, bfs_fill_super);
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
al viro | al viro | 33 | 84.62% | 2 | 40.00% |
pre-git | pre-git | 5 | 12.82% | 2 | 40.00% |
andries brouwer | andries brouwer | 1 | 2.56% | 1 | 20.00% |
| Total | 39 | 100.00% | 5 | 100.00% |
static struct file_system_type bfs_fs_type = {
.owner = THIS_MODULE,
.name = "bfs",
.mount = bfs_mount,
.kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV,
};
MODULE_ALIAS_FS("bfs");
static int __init init_bfs_fs(void)
{
int err = init_inodecache();
if (err)
goto out1;
err = register_filesystem(&bfs_fs_type);
if (err)
goto out;
return 0;
out:
destroy_inodecache();
out1:
return err;
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
linus torvalds | linus torvalds | 35 | 70.00% | 1 | 33.33% |
pre-git | pre-git | 15 | 30.00% | 2 | 66.67% |
| Total | 50 | 100.00% | 3 | 100.00% |
static void __exit exit_bfs_fs(void)
{
unregister_filesystem(&bfs_fs_type);
destroy_inodecache();
}
Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 15 | 83.33% | 2 | 66.67% |
linus torvalds | linus torvalds | 3 | 16.67% | 1 | 33.33% |
| Total | 18 | 100.00% | 3 | 100.00% |
module_init(init_bfs_fs)
module_exit(exit_bfs_fs)
Overall Contributors
| Person | Tokens | Prop | Commits | CommitProp |
pre-git | pre-git | 1039 | 38.90% | 11 | 15.71% |
al viro | al viro | 455 | 17.03% | 11 | 15.71% |
andrew stribblehill | andrew stribblehill | 256 | 9.58% | 1 | 1.43% |
linus torvalds | linus torvalds | 225 | 8.42% | 6 | 8.57% |
eric sesterhenn | eric sesterhenn | 167 | 6.25% | 2 | 2.86% |
dave jones | dave jones | 133 | 4.98% | 1 | 1.43% |
david howells | david howells | 109 | 4.08% | 2 | 2.86% |
dmitri vorobiev | dmitri vorobiev | 90 | 3.37% | 2 | 2.86% |
nick piggin | nick piggin | 39 | 1.46% | 1 | 1.43% |
andi kleen | andi kleen | 36 | 1.35% | 1 | 1.43% |
christoph hellwig | christoph hellwig | 23 | 0.86% | 5 | 7.14% |
art haas | art haas | 22 | 0.82% | 1 | 1.43% |
eric w. biederman | eric w. biederman | 19 | 0.71% | 2 | 2.86% |
artem bityutskiy | artem bityutskiy | 9 | 0.34% | 1 | 1.43% |
mark fasheh | mark fasheh | 7 | 0.26% | 1 | 1.43% |
christoph lameter | christoph lameter | 6 | 0.22% | 3 | 4.29% |
miklos szeredi | miklos szeredi | 4 | 0.15% | 1 | 1.43% |
fabian frederick | fabian frederick | 4 | 0.15% | 2 | 2.86% |
kirill a. shutemov | kirill a. shutemov | 4 | 0.15% | 1 | 1.43% |
paul jackson | paul jackson | 4 | 0.15% | 2 | 2.86% |
andrey v. savochkin | andrey v. savochkin | 3 | 0.11% | 1 | 1.43% |
brian gerst | brian gerst | 3 | 0.11% | 1 | 1.43% |
panagiotis issaris* | panagiotis issaris* | 2 | 0.07% | 1 | 1.43% |
tigran aivazian | tigran aivazian | 2 | 0.07% | 1 | 1.43% |
vladimir davydov | vladimir davydov | 2 | 0.07% | 1 | 1.43% |
andrew morton | andrew morton | 2 | 0.07% | 2 | 2.86% |
johannes weiner | johannes weiner | 1 | 0.04% | 1 | 1.43% |
josef 'jeff' sipek | josef 'jeff' sipek | 1 | 0.04% | 1 | 1.43% |
dan carpenter | dan carpenter | 1 | 0.04% | 1 | 1.43% |
andries brouwer | andries brouwer | 1 | 0.04% | 1 | 1.43% |
alexey dobriyan | alexey dobriyan | 1 | 0.04% | 1 | 1.43% |
jan kara | jan kara | 1 | 0.04% | 1 | 1.43% |
| Total | 2671 | 100.00% | 70 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.