Skip to content

Commit

Permalink
Merge branch '9p-iov_iter' into for-next
Browse files Browse the repository at this point in the history
  • Loading branch information
Al Viro committed Apr 12, 2015
2 parents 34d0640 + dcdbd7b commit c48722c
Show file tree
Hide file tree
Showing 12 changed files with 355 additions and 627 deletions.
4 changes: 0 additions & 4 deletions fs/9p/v9fs_vfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,14 +68,10 @@ int v9fs_file_open(struct inode *inode, struct file *file);
void v9fs_inode2stat(struct inode *inode, struct p9_wstat *stat);
int v9fs_uflags2omode(int uflags, int extended);

ssize_t v9fs_file_readn(struct file *, char *, char __user *, u32, u64);
ssize_t v9fs_fid_readn(struct p9_fid *, char *, char __user *, u32, u64);
void v9fs_blank_wstat(struct p9_wstat *wstat);
int v9fs_vfs_setattr_dotl(struct dentry *, struct iattr *);
int v9fs_file_fsync_dotl(struct file *filp, loff_t start, loff_t end,
int datasync);
ssize_t v9fs_file_write_internal(struct inode *, struct p9_fid *,
const char __user *, size_t, loff_t *, int);
int v9fs_refresh_inode(struct p9_fid *fid, struct inode *inode);
int v9fs_refresh_inode_dotl(struct p9_fid *fid, struct inode *inode);
static inline void v9fs_invalidate_inode_attr(struct inode *inode)
Expand Down
80 changes: 37 additions & 43 deletions fs/9p/vfs_addr.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,11 @@
*/
static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page)
{
int retval;
loff_t offset;
char *buffer;
struct inode *inode;
struct inode *inode = page->mapping->host;
struct bio_vec bvec = {.bv_page = page, .bv_len = PAGE_SIZE};
struct iov_iter to;
int retval, err;

inode = page->mapping->host;
p9_debug(P9_DEBUG_VFS, "\n");

BUG_ON(!PageLocked(page));
Expand All @@ -65,24 +64,23 @@ static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page)
if (retval == 0)
return retval;

buffer = kmap(page);
offset = page_offset(page);
iov_iter_bvec(&to, ITER_BVEC | READ, &bvec, 1, PAGE_SIZE);

retval = v9fs_fid_readn(fid, buffer, NULL, PAGE_CACHE_SIZE, offset);
if (retval < 0) {
retval = p9_client_read(fid, page_offset(page), &to, &err);
if (err) {
v9fs_uncache_page(inode, page);
retval = err;
goto done;
}

memset(buffer + retval, 0, PAGE_CACHE_SIZE - retval);
zero_user(page, retval, PAGE_SIZE - retval);
flush_dcache_page(page);
SetPageUptodate(page);

v9fs_readpage_to_fscache(inode, page);
retval = 0;

done:
kunmap(page);
unlock_page(page);
return retval;
}
Expand Down Expand Up @@ -161,41 +159,32 @@ static void v9fs_invalidate_page(struct page *page, unsigned int offset,

static int v9fs_vfs_writepage_locked(struct page *page)
{
char *buffer;
int retval, len;
loff_t offset, size;
mm_segment_t old_fs;
struct v9fs_inode *v9inode;
struct inode *inode = page->mapping->host;
struct v9fs_inode *v9inode = V9FS_I(inode);
loff_t size = i_size_read(inode);
struct iov_iter from;
struct bio_vec bvec;
int err, len;

v9inode = V9FS_I(inode);
size = i_size_read(inode);
if (page->index == size >> PAGE_CACHE_SHIFT)
len = size & ~PAGE_CACHE_MASK;
else
len = PAGE_CACHE_SIZE;

set_page_writeback(page);

buffer = kmap(page);
offset = page_offset(page);
bvec.bv_page = page;
bvec.bv_offset = 0;
bvec.bv_len = len;
iov_iter_bvec(&from, ITER_BVEC | WRITE, &bvec, 1, len);

old_fs = get_fs();
set_fs(get_ds());
/* We should have writeback_fid always set */
BUG_ON(!v9inode->writeback_fid);

retval = v9fs_file_write_internal(inode,
v9inode->writeback_fid,
(__force const char __user *)buffer,
len, &offset, 0);
if (retval > 0)
retval = 0;
set_page_writeback(page);

p9_client_write(v9inode->writeback_fid, page_offset(page), &from, &err);

set_fs(old_fs);
kunmap(page);
end_page_writeback(page);
return retval;
return err;
}

static int v9fs_vfs_writepage(struct page *page, struct writeback_control *wbc)
Expand Down Expand Up @@ -261,16 +250,21 @@ static int v9fs_launder_page(struct page *page)
static ssize_t
v9fs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
{
/*
* FIXME
* Now that we do caching with cache mode enabled, We need
* to support direct IO
*/
p9_debug(P9_DEBUG_VFS, "v9fs_direct_IO: v9fs_direct_IO (%pD) off/no(%lld/%lu) EINVAL\n",
iocb->ki_filp,
(long long)pos, iter->nr_segs);

return -EINVAL;
struct file *file = iocb->ki_filp;
ssize_t n;
int err = 0;
if (rw & WRITE) {
n = p9_client_write(file->private_data, pos, iter, &err);
if (n) {
struct inode *inode = file_inode(file);
loff_t i_size = i_size_read(inode);
if (pos + n > i_size)
inode_add_bytes(inode, pos + n - i_size);
}
} else {
n = p9_client_read(file->private_data, pos, iter, &err);
}
return n ? n : err;
}

static int v9fs_write_begin(struct file *filp, struct address_space *mapping,
Expand Down
15 changes: 11 additions & 4 deletions fs/9p/vfs_dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <linux/inet.h>
#include <linux/idr.h>
#include <linux/slab.h>
#include <linux/uio.h>
#include <net/9p/9p.h>
#include <net/9p/client.h>

Expand Down Expand Up @@ -115,6 +116,7 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
int buflen;
int reclen = 0;
struct p9_rdir *rdir;
struct kvec kvec;

p9_debug(P9_DEBUG_VFS, "name %pD\n", file);
fid = file->private_data;
Expand All @@ -124,16 +126,21 @@ static int v9fs_dir_readdir(struct file *file, struct dir_context *ctx)
rdir = v9fs_alloc_rdir_buf(file, buflen);
if (!rdir)
return -ENOMEM;
kvec.iov_base = rdir->buf;
kvec.iov_len = buflen;

while (1) {
if (rdir->tail == rdir->head) {
err = v9fs_file_readn(file, rdir->buf, NULL,
buflen, ctx->pos);
if (err <= 0)
struct iov_iter to;
int n;
iov_iter_kvec(&to, READ | ITER_KVEC, &kvec, 1, buflen);
n = p9_client_read(file->private_data, ctx->pos, &to,
&err);
if (err)
return err;

rdir->head = 0;
rdir->tail = err;
rdir->tail = n;
}
while (rdir->head < rdir->tail) {
p9stat_init(&st);
Expand Down
Loading

0 comments on commit c48722c

Please sign in to comment.