cregit-Linux how code gets into the kernel

Release 4.11 fs/ncpfs/mmap.c

Directory: fs/ncpfs
/*
 *  mmap.c
 *
 *  Copyright (C) 1995, 1996 by Volker Lendecke
 *  Modified 1997 Peter Waltenberg, Bill Hawes, David Woodhouse for 2.1 dcache
 *
 */

#include <linux/stat.h>
#include <linux/time.h>
#include <linux/kernel.h>
#include <linux/gfp.h>
#include <linux/mm.h>
#include <linux/shm.h>
#include <linux/errno.h>
#include <linux/mman.h>
#include <linux/string.h>
#include <linux/fcntl.h>
#include <linux/memcontrol.h>

#include <linux/uaccess.h>

#include "ncp_fs.h"

/*
 * Fill in the supplied page for mmap
 * XXX: how are we excluding truncate/invalidate here? Maybe need to lock
 * page?
 */

static int ncp_file_mmap_fault(struct vm_fault *vmf) { struct inode *inode = file_inode(vmf->vma->vm_file); char *pg_addr; unsigned int already_read; unsigned int count; int bufsize; int pos; /* XXX: loff_t ? */ /* * ncpfs has nothing against high pages as long * as recvmsg and memset works on it */ vmf->page = alloc_page(GFP_HIGHUSER); if (!vmf->page) return VM_FAULT_OOM; pg_addr = kmap(vmf->page); pos = vmf->pgoff << PAGE_SHIFT; count = PAGE_SIZE; /* what we can read in one go */ bufsize = NCP_SERVER(inode)->buffer_size; already_read = 0; if (ncp_make_open(inode, O_RDONLY) >= 0) { while (already_read < count) { int read_this_time; int to_read; to_read = bufsize - (pos % bufsize); to_read = min_t(unsigned int, to_read, count - already_read); if (ncp_read_kernel(NCP_SERVER(inode), NCP_FINFO(inode)->file_handle, pos, to_read, pg_addr + already_read, &read_this_time) != 0) { read_this_time = 0; } pos += read_this_time; already_read += read_this_time; if (read_this_time < to_read) { break; } } ncp_inode_close(inode); } if (already_read < PAGE_SIZE) memset(pg_addr + already_read, 0, PAGE_SIZE - already_read); flush_dcache_page(vmf->page); kunmap(vmf->page); /* * If I understand ncp_read_kernel() properly, the above always * fetches from the network, here the analogue of disk. * -- nyc */ count_vm_event(PGMAJFAULT); mem_cgroup_count_vm_event(vmf->vma->vm_mm, PGMAJFAULT); return VM_FAULT_MAJOR; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)20780.23%1150.00%
Nicholas Piggin207.75%29.09%
Ying Han83.10%14.55%
Linus Torvalds62.33%313.64%
Dave Jiang62.33%14.55%
Al Viro41.55%14.55%
Andrew Morton41.55%14.55%
Christoph Lameter20.78%14.55%
Nadia Yvette Chambers10.39%14.55%
Total258100.00%22100.00%

static const struct vm_operations_struct ncp_file_mmap = { .fault = ncp_file_mmap_fault, }; /* This is used for a general mmap of a ncp file */
int ncp_mmap(struct file *file, struct vm_area_struct *vma) { struct inode *inode = file_inode(file); ncp_dbg(1, "called\n"); if (!ncp_conn_valid(NCP_SERVER(inode))) return -EIO; /* only PAGE_COW or read-only supported now */ if (vma->vm_flags & VM_SHARED) return -EINVAL; /* we do not support files bigger than 4GB... We eventually supports just 4GB... */ if (vma_pages(vma) + vma->vm_pgoff > (1U << (32 - PAGE_SHIFT))) return -EFBIG; vma->vm_ops = &ncp_file_mmap; file_accessed(file); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)8685.15%555.56%
Christoph Hellwig54.95%111.11%
Joe Perches43.96%111.11%
Li Bin32.97%111.11%
Al Viro32.97%111.11%
Total101100.00%9100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)33380.43%1643.24%
Nicholas Piggin235.56%25.41%
Ying Han112.66%12.70%
Al Viro81.93%38.11%
Linus Torvalds71.69%410.81%
Dave Jiang61.45%12.70%
Christoph Hellwig51.21%12.70%
Joe Perches40.97%12.70%
Andrew Morton40.97%12.70%
Tejun Heo30.72%12.70%
Li Bin30.72%12.70%
Christoph Lameter20.48%12.70%
Petr Vandrovec20.48%12.70%
Dave Jones10.24%12.70%
Nadia Yvette Chambers10.24%12.70%
Alexey Dobriyan10.24%12.70%
Total414100.00%37100.00%
Directory: fs/ncpfs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.