cregit-Linux how code gets into the kernel

Release 4.16 drivers/staging/ncpfs/mmap.c

// SPDX-License-Identifier: GPL-2.0
/*
 *  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); count_memcg_event_mm(vmf->vma->vm_mm, PGMAJFAULT); return VM_FAULT_MAJOR; }

Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)20780.23%1147.83%
Nicholas Piggin207.75%28.70%
Ying Han72.71%14.35%
Dave Jiang62.33%14.35%
Linus Torvalds62.33%313.04%
Andrew Morton41.55%14.35%
Al Viro41.55%14.35%
Christoph Lameter20.78%14.35%
Nadia Yvette Chambers10.39%14.35%
Roman Gushchin10.39%14.35%
Total258100.00%23100.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%
Al Viro32.97%111.11%
Li Bin32.97%111.11%
Total101100.00%9100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Linus Torvalds (pre-git)33079.52%1641.03%
Nicholas Piggin235.54%25.13%
Ying Han102.41%12.56%
Al Viro81.93%37.69%
Linus Torvalds71.69%410.26%
Dave Jiang61.45%12.56%
Tejun Heo61.45%12.56%
Christoph Hellwig51.20%12.56%
Andrew Morton40.96%12.56%
Joe Perches40.96%12.56%
Li Bin30.72%12.56%
Petr Vandrovec20.48%12.56%
Christoph Lameter20.48%12.56%
Greg Kroah-Hartman10.24%12.56%
Roman Gushchin10.24%12.56%
Nadia Yvette Chambers10.24%12.56%
Alexey Dobriyan10.24%12.56%
Dave Jones10.24%12.56%
Total415100.00%39100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.