Release 4.11 fs/9p/vfs_file.c
/*
* linux/fs/9p/vfs_file.c
*
* This file contians vfs file ops for 9P2000.
*
* Copyright (C) 2004 by Eric Van Hensbergen <ericvh@gmail.com>
* Copyright (C) 2002 by Ron Minnich <rminnich@lanl.gov>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to:
* Free Software Foundation
* 51 Franklin Street, Fifth Floor
* Boston, MA 02111-1301 USA
*
*/
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/file.h>
#include <linux/stat.h>
#include <linux/string.h>
#include <linux/inet.h>
#include <linux/list.h>
#include <linux/pagemap.h>
#include <linux/utsname.h>
#include <linux/uaccess.h>
#include <linux/idr.h>
#include <linux/uio.h>
#include <linux/slab.h>
#include <net/9p/9p.h>
#include <net/9p/client.h>
#include "v9fs.h"
#include "v9fs_vfs.h"
#include "fid.h"
#include "cache.h"
static const struct vm_operations_struct v9fs_file_vm_ops;
static const struct vm_operations_struct v9fs_mmap_file_vm_ops;
/**
* v9fs_file_open - open a file (or directory)
* @inode: inode to be opened
* @file: file being opened
*
*/
int v9fs_file_open(struct inode *inode, struct file *file)
{
int err;
struct v9fs_inode *v9inode;
struct v9fs_session_info *v9ses;
struct p9_fid *fid;
int omode;
p9_debug(P9_DEBUG_VFS, "inode: %p file: %p\n", inode, file);
v9inode = V9FS_I(inode);
v9ses = v9fs_inode2v9ses(inode);
if (v9fs_proto_dotl(v9ses))
omode = v9fs_open_to_dotl_flags(file->f_flags);
else
omode = v9fs_uflags2omode(file->f_flags,
v9fs_proto_dotu(v9ses));
fid = file->private_data;
if (!fid) {
fid = v9fs_fid_clone(file_dentry(file));
if (IS_ERR(fid))
return PTR_ERR(fid);
err = p9_client_open(fid, omode);
if (err < 0) {
p9_client_clunk(fid);
return err;
}
if ((file->f_flags & O_APPEND) &&
(!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)))
generic_file_llseek(file, 0, SEEK_END);
}
file->private_data = fid;
mutex_lock(&v9inode->v_mutex);
if ((v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE) &&
!v9inode->writeback_fid &&
((file->f_flags & O_ACCMODE) != O_RDONLY)) {
/*
* clone a fid and add it to writeback_fid
* we do it during open time instead of
* page dirty time via write_begin/page_mkwrite
* because we want write after unlink usecase
* to work.
*/
fid = v9fs_writeback_fid(file_dentry(file));
if (IS_ERR(fid)) {
err = PTR_ERR(fid);
mutex_unlock(&v9inode->v_mutex);
goto out_error;
}
v9inode->writeback_fid = (void *) fid;
}
mutex_unlock(&v9inode->v_mutex);
if (v9ses->cache == CACHE_LOOSE || v9ses->cache == CACHE_FSCACHE)
v9fs_cache_inode_set_cookie(inode, file);
return 0;
out_error:
p9_client_clunk(file->private_data);
file->private_data = NULL;
return err;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 119 | 35.74% | 5 | 26.32% |
M. Mohan Kumar | 70 | 21.02% | 2 | 10.53% |
Eric Van Hensbergen | 67 | 20.12% | 4 | 21.05% |
Latchesar Ionkov | 51 | 15.32% | 4 | 21.05% |
Dominique Martinet | 18 | 5.41% | 1 | 5.26% |
Miklos Szeredi | 6 | 1.80% | 1 | 5.26% |
Joe Perches | 1 | 0.30% | 1 | 5.26% |
Sripathi Kodi | 1 | 0.30% | 1 | 5.26% |
Total | 333 | 100.00% | 19 | 100.00% |
/**
* v9fs_file_lock - lock a file (or directory)
* @filp: file to be locked
* @cmd: lock command
* @fl: file lock structure
*
* Bugs: this looks like a local only lock, we should extend into 9P
* by using open exclusive
*/
static int v9fs_file_lock(struct file *filp, int cmd, struct file_lock *fl)
{
int res = 0;
struct inode *inode = file_inode(filp);
p9_debug(P9_DEBUG_VFS, "filp: %p lock: %p\n", filp, fl);
/* No mandatory locks */
if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK)
return -ENOLCK;
if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) {
filemap_write_and_wait(inode->i_mapping);
invalidate_mapping_pages(&inode->i_data, 0, -1);
}
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
M. Mohan Kumar | 104 | 96.30% | 1 | 33.33% |
Al Viro | 3 | 2.78% | 1 | 33.33% |
Joe Perches | 1 | 0.93% | 1 | 33.33% |
Total | 108 | 100.00% | 3 | 100.00% |
static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
{
struct p9_flock flock;
struct p9_fid *fid;
uint8_t status = P9_LOCK_ERROR;
int res = 0;
unsigned char fl_type;
fid = filp->private_data;
BUG_ON(fid == NULL);
if ((fl->fl_flags & FL_POSIX) != FL_POSIX)
BUG();
res = locks_lock_file_wait(filp, fl);
if (res < 0)
goto out;
/* convert posix lock to p9 tlock args */
memset(&flock, 0, sizeof(flock));
/* map the lock type */
switch (fl->fl_type) {
case F_RDLCK:
flock.type = P9_LOCK_TYPE_RDLCK;
break;
case F_WRLCK:
flock.type = P9_LOCK_TYPE_WRLCK;
break;
case F_UNLCK:
flock.type = P9_LOCK_TYPE_UNLCK;
break;
}
flock.start = fl->fl_start;
if (fl->fl_end == OFFSET_MAX)
flock.length = 0;
else
flock.length = fl->fl_end - fl->fl_start + 1;
flock.proc_id = fl->fl_pid;
flock.client_id = fid->clnt->name;
if (IS_SETLKW(cmd))
flock.flags = P9_LOCK_FLAGS_BLOCK;
/*
* if its a blocked request and we get P9_LOCK_BLOCKED as the status
* for lock request, keep on trying
*/
for (;;) {
res = p9_client_lock_dotl(fid, &flock, &status);
if (res < 0)
goto out_unlock;
if (status != P9_LOCK_BLOCKED)
break;
if (status == P9_LOCK_BLOCKED && !IS_SETLKW(cmd))
break;
if (schedule_timeout_interruptible(P9_LOCK_TIMEOUT) != 0)
break;
}
/* map 9p status to VFS status */
switch (status) {
case P9_LOCK_SUCCESS:
res = 0;
break;
case P9_LOCK_BLOCKED:
res = -EAGAIN;
break;
default:
WARN_ONCE(1, "unknown lock status code: %d\n", status);
/* fallthough */
case P9_LOCK_ERROR:
case P9_LOCK_GRACE:
res = -ENOLCK;
break;
}
out_unlock:
/*
* incase server returned error for lock request, revert
* it locally
*/
if (res < 0 && fl->fl_type != F_UNLCK) {
fl_type = fl->fl_type;
fl->fl_type = F_UNLCK;
/* Even if this fails we want to return the remote error */
locks_lock_file_wait(filp, fl);
fl->fl_type = fl_type;
}
out:
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
M. Mohan Kumar | 299 | 82.14% | 1 | 11.11% |
Jim Garlick | 40 | 10.99% | 2 | 22.22% |
Kirill A. Shutemov | 16 | 4.40% | 2 | 22.22% |
Will Deacon | 4 | 1.10% | 1 | 11.11% |
Dominique Martinet | 3 | 0.82% | 2 | 22.22% |
Benjamin Coddington | 2 | 0.55% | 1 | 11.11% |
Total | 364 | 100.00% | 9 | 100.00% |
static int v9fs_file_getlock(struct file *filp, struct file_lock *fl)
{
struct p9_getlock glock;
struct p9_fid *fid;
int res = 0;
fid = filp->private_data;
BUG_ON(fid == NULL);
posix_test_lock(filp, fl);
/*
* if we have a conflicting lock locally, no need to validate
* with server
*/
if (fl->fl_type != F_UNLCK)
return res;
/* convert posix lock to p9 tgetlock args */
memset(&glock, 0, sizeof(glock));
glock.type = P9_LOCK_TYPE_UNLCK;
glock.start = fl->fl_start;
if (fl->fl_end == OFFSET_MAX)
glock.length = 0;
else
glock.length = fl->fl_end - fl->fl_start + 1;
glock.proc_id = fl->fl_pid;
glock.client_id = fid->clnt->name;
res = p9_client_getlock_dotl(fid, &glock);
if (res < 0)
return res;
/* map 9p lock type to os lock type */
switch (glock.type) {
case P9_LOCK_TYPE_RDLCK:
fl->fl_type = F_RDLCK;
break;
case P9_LOCK_TYPE_WRLCK:
fl->fl_type = F_WRLCK;
break;
case P9_LOCK_TYPE_UNLCK:
fl->fl_type = F_UNLCK;
break;
}
if (glock.type != P9_LOCK_TYPE_UNLCK) {
fl->fl_start = glock.start;
if (glock.length == 0)
fl->fl_end = OFFSET_MAX;
else
fl->fl_end = glock.start + glock.length - 1;
fl->fl_pid = glock.proc_id;
}
kfree(glock.client_id);
return res;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
M. Mohan Kumar | 213 | 81.92% | 1 | 25.00% |
Jim Garlick | 36 | 13.85% | 1 | 25.00% |
Al Viro | 7 | 2.69% | 1 | 25.00% |
Will Deacon | 4 | 1.54% | 1 | 25.00% |
Total | 260 | 100.00% | 4 | 100.00% |
/**
* v9fs_file_lock_dotl - lock a file (or directory)
* @filp: file to be locked
* @cmd: lock command
* @fl: file lock structure
*
*/
static int v9fs_file_lock_dotl(struct file *filp, int cmd, struct file_lock *fl)
{
struct inode *inode = file_inode(filp);
int ret = -ENOLCK;
p9_debug(P9_DEBUG_VFS, "filp: %p cmd:%d lock: %p name: %pD\n",
filp, cmd, fl, filp);
/* No mandatory locks */
if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK)
goto out_err;
if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) {
filemap_write_and_wait(inode->i_mapping);
invalidate_mapping_pages(&inode->i_data, 0, -1);
}
if (IS_SETLK(cmd) || IS_SETLKW(cmd))
ret = v9fs_file_do_lock(filp, cmd, fl);
else if (IS_GETLK(cmd))
ret = v9fs_file_getlock(filp, fl);
else
ret = -EINVAL;
out_err:
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
M. Mohan Kumar | 124 | 77.50% | 3 | 25.00% |
Eric Van Hensbergen | 23 | 14.38% | 4 | 33.33% |
Al Viro | 4 | 2.50% | 2 | 16.67% |
Abhishek Kulkarni | 4 | 2.50% | 1 | 8.33% |
Venkateswararao Jujjuri (JV) | 4 | 2.50% | 1 | 8.33% |
Joe Perches | 1 | 0.62% | 1 | 8.33% |
Total | 160 | 100.00% | 12 | 100.00% |
/**
* v9fs_file_flock_dotl - lock a file
* @filp: file to be locked
* @cmd: lock command
* @fl: file lock structure
*
*/
static int v9fs_file_flock_dotl(struct file *filp, int cmd,
struct file_lock *fl)
{
struct inode *inode = file_inode(filp);
int ret = -ENOLCK;
p9_debug(P9_DEBUG_VFS, "filp: %p cmd:%d lock: %p name: %pD\n",
filp, cmd, fl, filp);
/* No mandatory locks */
if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK)
goto out_err;
if (!(fl->fl_flags & FL_FLOCK))
goto out_err;
if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) {
filemap_write_and_wait(inode->i_mapping);
invalidate_mapping_pages(&inode->i_data, 0, -1);
}
/* Convert flock to posix lock */
fl->fl_flags |= FL_POSIX;
fl->fl_flags ^= FL_FLOCK;
if (IS_SETLK(cmd) | IS_SETLKW(cmd))
ret = v9fs_file_do_lock(filp, cmd, fl);
else
ret = -EINVAL;
out_err:
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Eric Van Hensbergen | 75 | 44.12% | 1 | 10.00% |
M. Mohan Kumar | 73 | 42.94% | 1 | 10.00% |
Sachin S. Prabhu | 6 | 3.53% | 1 | 10.00% |
Andrew Morton | 6 | 3.53% | 1 | 10.00% |
Al Viro | 4 | 2.35% | 2 | 20.00% |
Pavel Emelyanov | 3 | 1.76% | 1 | 10.00% |
Hirofumi Ogawa | 1 | 0.59% | 1 | 10.00% |
Latchesar Ionkov | 1 | 0.59% | 1 | 10.00% |
Joe Perches | 1 | 0.59% | 1 | 10.00% |
Total | 170 | 100.00% | 10 | 100.00% |
/**
* v9fs_file_read - read from a file
* @filp: file pointer to read
* @udata: user data buffer to read data into
* @count: size of buffer
* @offset: offset at which to read data
*
*/
static ssize_t
v9fs_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
struct p9_fid *fid = iocb->ki_filp->private_data;
int ret, err = 0;
p9_debug(P9_DEBUG_VFS, "count %zu offset %lld\n",
iov_iter_count(to), iocb->ki_pos);
ret = p9_client_read(fid, iocb->ki_pos, to, &err);
if (!ret)
return err;
iocb->ki_pos += ret;
return ret;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Al Viro | 41 | 49.40% | 2 | 25.00% |
Eric Van Hensbergen | 32 | 38.55% | 3 | 37.50% |
Latchesar Ionkov | 8 | 9.64% | 2 | 25.00% |
Vincent Bernat | 2 | 2.41% | 1 | 12.50% |
Total | 83 | 100.00% | 8 | 100.00% |
/**
* v9fs_file_write - write to a file
* @filp: file pointer to write
* @data: data buffer to write data from
* @count: size of buffer
* @offset: offset at which to write data
*
*/
static ssize_t
v9fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
struct file *file = iocb->ki_filp;
ssize_t retval;
loff_t origin;
int err = 0;
retval = generic_write_checks(iocb, from);
if (retval <= 0)
return retval;
origin = iocb->ki_pos;
retval = p9_client_write(file->private_data, iocb->ki_pos, from, &err);
if (retval > 0) {
struct inode *inode = file_inode(file);
loff_t i_size;
unsigned long pg_start, pg_end;
pg_start = origin >> PAGE_SHIFT;
pg_end = (origin + retval - 1) >> PAGE_SHIFT;
if (inode->i_mapping && inode->i_mapping->nrpages)
invalidate_inode_pages2_range(inode->i_mapping,
pg_start, pg_end);
iocb->ki_pos += retval;
i_size = i_size_read(inode);
if (iocb->ki_pos > i_size) {
inode_add_bytes(inode, iocb->ki_pos - i_size);
i_size_write(inode, iocb->ki_pos);
}
return retval;
}
return err;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Al Viro | 103 | 52.82% | 4 | 23.53% |
Abhishek Kulkarni | 36 | 18.46% | 3 | 17.65% |
Eric Van Hensbergen | 32 | 16.41% | 4 | 23.53% |
Aneesh Kumar K.V | 19 | 9.74% | 2 | 11.76% |
Kirill A. Shutemov | 2 | 1.03% | 1 | 5.88% |
Latchesar Ionkov | 1 | 0.51% | 1 | 5.88% |
Harsh Prateek Bora | 1 | 0.51% | 1 | 5.88% |
Venkateswararao Jujjuri (JV) | 1 | 0.51% | 1 | 5.88% |
Total | 195 | 100.00% | 17 | 100.00% |
static int v9fs_file_fsync(struct file *filp, loff_t start, loff_t end,
int datasync)
{
struct p9_fid *fid;
struct inode *inode = filp->f_mapping->host;
struct p9_wstat wstat;
int retval;
retval = filemap_write_and_wait_range(inode->i_mapping, start, end);
if (retval)
return retval;
inode_lock(inode);
p9_debug(P9_DEBUG_VFS, "filp %p datasync %x\n", filp, datasync);
fid = filp->private_data;
v9fs_blank_wstat(&wstat);
retval = p9_client_wstat(fid, &wstat);
inode_unlock(inode);
return retval;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
M. Mohan Kumar | 60 | 55.05% | 1 | 20.00% |
Josef Bacik | 45 | 41.28% | 1 | 20.00% |
Al Viro | 2 | 1.83% | 1 | 20.00% |
Christoph Hellwig | 1 | 0.92% | 1 | 20.00% |
Joe Perches | 1 | 0.92% | 1 | 20.00% |
Total | 109 | 100.00% | 5 | 100.00% |
int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
int datasync)
{
struct p9_fid *fid;
struct inode *inode = filp->f_mapping->host;
int retval;
retval = filemap_write_and_wait_range(inode->i_mapping, start, end);
if (retval)
return retval;
inode_lock(inode);
p9_debug(P9_DEBUG_VFS, "filp %p datasync %x\n", filp, datasync);
fid = filp->private_data;
retval = p9_client_fsync(fid, datasync);
inode_unlock(inode);
return retval;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Venkateswararao Jujjuri (JV) | 48 | 49.48% | 2 | 40.00% |
Josef Bacik | 45 | 46.39% | 1 | 20.00% |
Al Viro | 2 | 2.06% | 1 | 20.00% |
Joe Perches | 2 | 2.06% | 1 | 20.00% |
Total | 97 | 100.00% | 5 | 100.00% |
static int
v9fs_file_mmap(struct file *filp, struct vm_area_struct *vma)
{
int retval;
retval = generic_file_mmap(filp, vma);
if (!retval)
vma->vm_ops = &v9fs_file_vm_ops;
return retval;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 41 | 95.35% | 1 | 50.00% |
Dominique Martinet | 2 | 4.65% | 1 | 50.00% |
Total | 43 | 100.00% | 2 | 100.00% |
static int
v9fs_mmap_file_mmap(struct file *filp, struct vm_area_struct *vma)
{
int retval;
struct inode *inode;
struct v9fs_inode *v9inode;
struct p9_fid *fid;
inode = file_inode(filp);
v9inode = V9FS_I(inode);
mutex_lock(&v9inode->v_mutex);
if (!v9inode->writeback_fid &&
(vma->vm_flags & VM_WRITE)) {
/*
* clone a fid and add it to writeback_fid
* we do it during mmap instead of
* page dirty time via write_begin/page_mkwrite
* because we want write after unlink usecase
* to work.
*/
fid = v9fs_writeback_fid(file_dentry(filp));
if (IS_ERR(fid)) {
retval = PTR_ERR(fid);
mutex_unlock(&v9inode->v_mutex);
return retval;
}
v9inode->writeback_fid = (void *) fid;
}
mutex_unlock(&v9inode->v_mutex);
retval = generic_file_mmap(filp, vma);
if (!retval)
vma->vm_ops = &v9fs_mmap_file_vm_ops;
return retval;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dominique Martinet | 148 | 96.73% | 1 | 33.33% |
Miklos Szeredi | 3 | 1.96% | 1 | 33.33% |
Aneesh Kumar K.V | 2 | 1.31% | 1 | 33.33% |
Total | 153 | 100.00% | 3 | 100.00% |
static int
v9fs_vm_page_mkwrite(struct vm_fault *vmf)
{
struct v9fs_inode *v9inode;
struct page *page = vmf->page;
struct file *filp = vmf->vma->vm_file;
struct inode *inode = file_inode(filp);
p9_debug(P9_DEBUG_VFS, "page %p fid %lx\n",
page, (unsigned long)filp->private_data);
/* Update file times before taking page lock */
file_update_time(filp);
v9inode = V9FS_I(inode);
/* make sure the cache has finished storing the page */
v9fs_fscache_wait_on_page_write(inode, page);
BUG_ON(!v9inode->writeback_fid);
lock_page(page);
if (page->mapping != inode->i_mapping)
goto out_unlock;
wait_for_stable_page(page);
return VM_FAULT_LOCKED;
out_unlock:
unlock_page(page);
return VM_FAULT_NOPAGE;
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Aneesh Kumar K.V | 109 | 85.16% | 2 | 25.00% |
Jan Kara | 6 | 4.69% | 1 | 12.50% |
Darrick J. Wong | 5 | 3.91% | 1 | 12.50% |
Al Viro | 3 | 2.34% | 1 | 12.50% |
Dave Jiang | 2 | 1.56% | 1 | 12.50% |
Dominique Martinet | 2 | 1.56% | 1 | 12.50% |
Joe Perches | 1 | 0.78% | 1 | 12.50% |
Total | 128 | 100.00% | 8 | 100.00% |
/**
* v9fs_mmap_file_read - read from a file
* @filp: file pointer to read
* @data: user data buffer to read data into
* @count: size of buffer
* @offset: offset at which to read data
*
*/
static ssize_t
v9fs_mmap_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
{
/* TODO: Check if there are dirty pages */
return v9fs_file_read_iter(iocb, to);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dominique Martinet | 16 | 64.00% | 1 | 50.00% |
Al Viro | 9 | 36.00% | 1 | 50.00% |
Total | 25 | 100.00% | 2 | 100.00% |
/**
* v9fs_mmap_file_write - write to a file
* @filp: file pointer to write
* @data: data buffer to write data from
* @count: size of buffer
* @offset: offset at which to write data
*
*/
static ssize_t
v9fs_mmap_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
/*
* TODO: invalidate mmaps on filp's inode between
* offset and offset+count
*/
return v9fs_file_write_iter(iocb, from);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dominique Martinet | 16 | 64.00% | 1 | 50.00% |
Al Viro | 9 | 36.00% | 1 | 50.00% |
Total | 25 | 100.00% | 2 | 100.00% |
static void v9fs_mmap_vm_close(struct vm_area_struct *vma)
{
struct inode *inode;
struct writeback_control wbc = {
.nr_to_write = LONG_MAX,
.sync_mode = WB_SYNC_ALL,
.range_start = vma->vm_pgoff * PAGE_SIZE,
/* absolute end, byte at end included */
.range_end = vma->vm_pgoff * PAGE_SIZE +
(vma->vm_end - vma->vm_start - 1),
};
p9_debug(P9_DEBUG_VFS, "9p VMA close, %p, flushing", vma);
inode = file_inode(vma->vm_file);
if (!mapping_cap_writeback_dirty(inode->i_mapping))
wbc.nr_to_write = 0;
might_sleep();
sync_inode(inode, &wbc);
}
Contributors
Person | Tokens | Prop | Commits | CommitProp |
Dominique Martinet | 108 | 100.00% | 1 | 100.00% |
Total | 108 | 100.00% | 1 | 100.00% |
static const struct vm_operations_struct v9fs_file_vm_ops = {
.fault = filemap_fault,
.map_pages = filemap_map_pages,
.page_mkwrite = v9fs_vm_page_mkwrite,
};
static const struct vm_operations_struct v9fs_mmap_file_vm_ops = {
.close = v9fs_mmap_vm_close,
.fault = filemap_fault,
.map_pages = filemap_map_pages,
.page_mkwrite = v9fs_vm_page_mkwrite,
};
const struct file_operations v9fs_cached_file_operations = {
.llseek = generic_file_llseek,
.read_iter = generic_file_read_iter,
.write_iter = generic_file_write_iter,
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock,
.mmap = v9fs_file_mmap,
.fsync = v9fs_file_fsync,
};
const struct file_operations v9fs_cached_file_operations_dotl = {
.llseek = generic_file_llseek,
.read_iter = generic_file_read_iter,
.write_iter = generic_file_write_iter,
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock_dotl,
.flock = v9fs_file_flock_dotl,
.mmap = v9fs_file_mmap,
.fsync = v9fs_file_fsync_dotl,
};
const struct file_operations v9fs_file_operations = {
.llseek = generic_file_llseek,
.read_iter = v9fs_file_read_iter,
.write_iter = v9fs_file_write_iter,
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock,
.mmap = generic_file_readonly_mmap,
.fsync = v9fs_file_fsync,
};
const struct file_operations v9fs_file_operations_dotl = {
.llseek = generic_file_llseek,
.read_iter = v9fs_file_read_iter,
.write_iter = v9fs_file_write_iter,
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock_dotl,
.flock = v9fs_file_flock_dotl,
.mmap = generic_file_readonly_mmap,
.fsync = v9fs_file_fsync_dotl,
};
const struct file_operations v9fs_mmap_file_operations = {
.llseek = generic_file_llseek,
.read_iter = v9fs_mmap_file_read_iter,
.write_iter = v9fs_mmap_file_write_iter,
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock,
.mmap = v9fs_mmap_file_mmap,
.fsync = v9fs_file_fsync,
};
const struct file_operations v9fs_mmap_file_operations_dotl = {
.llseek = generic_file_llseek,
.read_iter = v9fs_mmap_file_read_iter,
.write_iter = v9fs_mmap_file_write_iter,
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock_dotl,
.flock = v9fs_file_flock_dotl,
.mmap = v9fs_mmap_file_mmap,
.fsync = v9fs_file_fsync_dotl,
};
Overall Contributors
Person | Tokens | Prop | Commits | CommitProp |
M. Mohan Kumar | 971 | 34.77% | 4 | 5.19% |
Dominique Martinet | 426 | 15.25% | 3 | 3.90% |
Eric Van Hensbergen | 343 | 12.28% | 12 | 15.58% |
Aneesh Kumar K.V | 316 | 11.31% | 8 | 10.39% |
Al Viro | 237 | 8.49% | 12 | 15.58% |
Venkateswararao Jujjuri (JV) | 95 | 3.40% | 4 | 5.19% |
Josef Bacik | 90 | 3.22% | 1 | 1.30% |
Jim Garlick | 76 | 2.72% | 2 | 2.60% |
Latchesar Ionkov | 64 | 2.29% | 5 | 6.49% |
Abhishek Kulkarni | 46 | 1.65% | 3 | 3.90% |
Sripathi Kodi | 38 | 1.36% | 2 | 2.60% |
Kirill A. Shutemov | 28 | 1.00% | 4 | 5.19% |
Miklos Szeredi | 9 | 0.32% | 1 | 1.30% |
Joe Perches | 8 | 0.29% | 1 | 1.30% |
Will Deacon | 8 | 0.29% | 1 | 1.30% |
Sachin S. Prabhu | 6 | 0.21% | 1 | 1.30% |
Andrew Morton | 6 | 0.21% | 1 | 1.30% |
Jan Kara | 6 | 0.21% | 1 | 1.30% |
Darrick J. Wong | 5 | 0.18% | 1 | 1.30% |
Pavel Emelyanov | 3 | 0.11% | 1 | 1.30% |
Benjamin Coddington | 2 | 0.07% | 1 | 1.30% |
Dave Jiang | 2 | 0.07% | 1 | 1.30% |
Vincent Bernat | 2 | 0.07% | 1 | 1.30% |
Hirofumi Ogawa | 1 | 0.04% | 1 | 1.30% |
Harsh Prateek Bora | 1 | 0.04% | 1 | 1.30% |
Christoph Hellwig | 1 | 0.04% | 1 | 1.30% |
Fabian Frederick | 1 | 0.04% | 1 | 1.30% |
Linus Torvalds | 1 | 0.04% | 1 | 1.30% |
Arjan van de Ven | 1 | 0.04% | 1 | 1.30% |
Total | 2793 | 100.00% | 77 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.