cregit-Linux how code gets into the kernel

Release 4.17 fs/coda/file.c

Directory: fs/coda
// SPDX-License-Identifier: GPL-2.0
/*
 * File operations for Coda.
 * Original version: (C) 1996 Peter Braam 
 * Rewritten for Linux 2.1: (C) 1997 Carnegie Mellon University
 *
 * Carnegie Mellon encourages users of this code to contribute improvements
 * to the Coda project. Contact Peter Braam <coda@cs.cmu.edu>.
 */

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/stat.h>
#include <linux/cred.h>
#include <linux/errno.h>
#include <linux/spinlock.h>
#include <linux/string.h>
#include <linux/slab.h>
#include <linux/uaccess.h>

#include <linux/coda.h>
#include <linux/coda_psdev.h>

#include "coda_linux.h"
#include "coda_int.h"


static ssize_t coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to) { struct file *coda_file = iocb->ki_filp; struct coda_file_info *cfi = CODA_FTOC(coda_file); BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); return vfs_iter_read(cfi->cfi_container, to, &iocb->ki_pos, 0); }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro2335.94%114.29%
Jan Harkes1929.69%114.29%
Linus Torvalds (pre-git)1015.62%228.57%
Linus Torvalds1015.62%228.57%
Christoph Hellwig23.12%114.29%
Total64100.00%7100.00%


static ssize_t coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to) { struct file *coda_file = iocb->ki_filp; struct inode *coda_inode = file_inode(coda_file); struct coda_file_info *cfi = CODA_FTOC(coda_file); struct file *host_file; ssize_t ret; BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); host_file = cfi->cfi_container; file_start_write(host_file); inode_lock(coda_inode); ret = vfs_iter_write(cfi->cfi_container, to, &iocb->ki_pos, 0); coda_inode->i_size = file_inode(host_file)->i_size; coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; coda_inode->i_mtime = coda_inode->i_ctime = current_time(coda_inode); inode_unlock(coda_inode); file_end_write(host_file); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Al Viro4832.00%428.57%
Jan Harkes4530.00%214.29%
Linus Torvalds2718.00%214.29%
Linus Torvalds (pre-git)2416.00%428.57%
Deepa Dinamani42.67%17.14%
Christoph Hellwig21.33%17.14%
Total150100.00%14100.00%


static int coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) { struct coda_file_info *cfi; struct coda_inode_info *cii; struct file *host_file; struct inode *coda_inode, *host_inode; cfi = CODA_FTOC(coda_file); BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); host_file = cfi->cfi_container; if (!host_file->f_op->mmap) return -ENODEV; coda_inode = file_inode(coda_file); host_inode = file_inode(host_file); cii = ITOC(coda_inode); spin_lock(&cii->c_lock); coda_file->f_mapping = host_file->f_mapping; if (coda_inode->i_mapping == &coda_inode->i_data) coda_inode->i_mapping = host_inode->i_mapping; /* only allow additional mmaps as long as userspace isn't changing * the container file on us! */ else if (coda_inode->i_mapping != host_inode->i_mapping) { spin_unlock(&cii->c_lock); return -EBUSY; } /* keep track of how often the coda_inode/host_file has been mmapped */ cii->c_mapcount++; cfi->cfi_mapcount++; spin_unlock(&cii->c_lock); return call_mmap(host_file, vma); }

Contributors

PersonTokensPropCommitsCommitProp
Jan Harkes8947.85%114.29%
Linus Torvalds4725.27%114.29%
Yoshihisa Abe3317.74%114.29%
Andrew Morton84.30%114.29%
Al Viro63.23%114.29%
Linus Torvalds (pre-git)21.08%114.29%
Miklos Szeredi10.54%114.29%
Total186100.00%7100.00%


int coda_open(struct inode *coda_inode, struct file *coda_file) { struct file *host_file = NULL; int error; unsigned short flags = coda_file->f_flags & (~O_EXCL); unsigned short coda_flags = coda_flags_to_cflags(flags); struct coda_file_info *cfi; cfi = kmalloc(sizeof(struct coda_file_info), GFP_KERNEL); if (!cfi) return -ENOMEM; error = venus_open(coda_inode->i_sb, coda_i2f(coda_inode), coda_flags, &host_file); if (!host_file) error = -EIO; if (error) { kfree(cfi); return error; } host_file->f_flags |= coda_file->f_flags & (O_APPEND | O_SYNC); cfi->cfi_magic = CODA_MAGIC; cfi->cfi_mapcount = 0; cfi->cfi_container = host_file; BUG_ON(coda_file->private_data != NULL); coda_file->private_data = cfi; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Jan Harkes7544.91%240.00%
Linus Torvalds5834.73%120.00%
Linus Torvalds (pre-git)3420.36%240.00%
Total167100.00%5100.00%


int coda_release(struct inode *coda_inode, struct file *coda_file) { unsigned short flags = (coda_file->f_flags) & (~O_EXCL); unsigned short coda_flags = coda_flags_to_cflags(flags); struct coda_file_info *cfi; struct coda_inode_info *cii; struct inode *host_inode; int err; cfi = CODA_FTOC(coda_file); BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); err = venus_close(coda_inode->i_sb, coda_i2f(coda_inode), coda_flags, coda_file->f_cred->fsuid); host_inode = file_inode(cfi->cfi_container); cii = ITOC(coda_inode); /* did we mmap this file? */ spin_lock(&cii->c_lock); if (coda_inode->i_mapping == &host_inode->i_data) { cii->c_mapcount -= cfi->cfi_mapcount; if (!cii->c_mapcount) coda_inode->i_mapping = &coda_inode->i_data; } spin_unlock(&cii->c_lock); fput(cfi->cfi_container); kfree(coda_file->private_data); coda_file->private_data = NULL; /* VFS fput ignores the return value from file_operations->release, so * there is no use returning an error here */ return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds10052.08%114.29%
Jan Harkes7036.46%342.86%
Yoshihisa Abe168.33%114.29%
Al Viro31.56%114.29%
David Howells31.56%114.29%
Total192100.00%7100.00%


int coda_fsync(struct file *coda_file, loff_t start, loff_t end, int datasync) { struct file *host_file; struct inode *coda_inode = file_inode(coda_file); struct coda_file_info *cfi; int err; if (!(S_ISREG(coda_inode->i_mode) || S_ISDIR(coda_inode->i_mode) || S_ISLNK(coda_inode->i_mode))) return -EINVAL; err = filemap_write_and_wait_range(coda_inode->i_mapping, start, end); if (err) return err; inode_lock(coda_inode); cfi = CODA_FTOC(coda_file); BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); host_file = cfi->cfi_container; err = vfs_fsync(host_file, datasync); if (!err && !datasync) err = venus_fsync(coda_inode->i_sb, coda_i2f(coda_inode)); inode_unlock(coda_inode); return err; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds8552.80%114.29%
Josef Bacik3421.12%114.29%
Jan Harkes3119.25%114.29%
Christoph Hellwig63.73%228.57%
Al Viro53.11%228.57%
Total161100.00%7100.00%

const struct file_operations coda_file_operations = { .llseek = generic_file_llseek, .read_iter = coda_file_read_iter, .write_iter = coda_file_write_iter, .mmap = coda_file_mmap, .open = coda_open, .release = coda_release, .fsync = coda_fsync, .splice_read = generic_file_splice_read, };

Overall Contributors

PersonTokensPropCommitsCommitProp
Jan Harkes34333.73%615.79%
Linus Torvalds33432.84%37.89%
Linus Torvalds (pre-git)12011.80%513.16%
Al Viro969.44%615.79%
Yoshihisa Abe525.11%12.63%
Josef Bacik343.34%12.63%
Christoph Hellwig100.98%410.53%
Andrew Morton80.79%12.63%
Deepa Dinamani40.39%12.63%
Tejun Heo30.29%12.63%
Randy Dunlap30.29%12.63%
David Howells30.29%12.63%
Greg Kroah-Hartman10.10%12.63%
Adrian Bunk10.10%12.63%
Dave Jones10.10%12.63%
Jens Axboe10.10%12.63%
Arjan van de Ven10.10%12.63%
Fabian Frederick10.10%12.63%
Miklos Szeredi10.10%12.63%
Total1017100.00%38100.00%
Directory: fs/coda
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.