cregit-Linux how code gets into the kernel

Release 4.10 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_area_struct *area, struct vm_fault *vmf) { struct inode *inode = file_inode(area->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(area->vm_mm, PGMAJFAULT); return VM_FAULT_MAJOR; }

Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git21181.47%1152.38%
nick pigginnick piggin218.11%29.52%
ying hanying han93.47%14.76%
linus torvaldslinus torvalds62.32%314.29%
al viroal viro51.93%14.76%
andrew mortonandrew morton41.54%14.76%
christoph lameterchristoph lameter20.77%14.76%
nadia yvette chambersnadia yvette chambers10.39%14.76%
Total259100.00%21100.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
pre-gitpre-git8685.15%555.56%
christoph hellwigchristoph hellwig54.95%111.11%
joe perchesjoe perches43.96%111.11%
li binli bin32.97%111.11%
al viroal viro32.97%111.11%
Total101100.00%9100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
pre-gitpre-git33781.20%1644.44%
nick pigginnick piggin245.78%25.56%
ying hanying han122.89%12.78%
al viroal viro92.17%38.33%
linus torvaldslinus torvalds71.69%411.11%
christoph hellwigchristoph hellwig51.20%12.78%
andrew mortonandrew morton40.96%12.78%
joe perchesjoe perches40.96%12.78%
li binli bin30.72%12.78%
tejun heotejun heo30.72%12.78%
christoph lameterchristoph lameter20.48%12.78%
petr vandrovec*petr vandrovec*20.48%12.78%
nadia yvette chambersnadia yvette chambers10.24%12.78%
alexey dobriyanalexey dobriyan10.24%12.78%
dave jonesdave jones10.24%12.78%
Total415100.00%36100.00%
Directory: fs/ncpfs
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.