Skip to content

Commit

Permalink
fs/9p: Add read write helper function
Browse files Browse the repository at this point in the history
We add read write helper function here which will
be used later by the mmap patch

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Venkateswararao Jujjuri <jvrao@linux.vnet.ibm.com>
Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
  • Loading branch information
Aneesh Kumar K.V authored and Eric Van Hensbergen committed Mar 15, 2011
1 parent 2efda79 commit 1731177
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 42 deletions.
4 changes: 3 additions & 1 deletion fs/9p/v9fs_vfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@ 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, int datasync);

ssize_t v9fs_file_write_internal(struct inode *, struct p9_fid *,
const char __user *, size_t, loff_t *, int);
#define P9_LOCK_TIMEOUT (30*HZ)
102 changes: 61 additions & 41 deletions fs/9p/vfs_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -323,25 +323,22 @@ static int v9fs_file_flock_dotl(struct file *filp, int cmd,
}

/**
* v9fs_file_readn - read from a file
* @filp: file pointer to read
* v9fs_fid_readn - read from a fid
* @fid: fid to read
* @data: data buffer to read data into
* @udata: user data buffer to read data into
* @count: size of buffer
* @offset: offset at which to read data
*
*/

ssize_t
v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count,
v9fs_fid_readn(struct p9_fid *fid, char *data, char __user *udata, u32 count,
u64 offset)
{
int n, total, size;
struct p9_fid *fid = filp->private_data;

P9_DPRINTK(P9_DEBUG_VFS, "fid %d offset %llu count %d\n", fid->fid,
(long long unsigned) offset, count);

(long long unsigned) offset, count);
n = 0;
total = 0;
size = fid->iounit ? fid->iounit : fid->clnt->msize - P9_IOHDRSZ;
Expand All @@ -366,6 +363,22 @@ v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count,
return total;
}

/**
* v9fs_file_readn - read from a file
* @filp: file pointer to read
* @data: data buffer to read data into
* @udata: user data buffer to read data into
* @count: size of buffer
* @offset: offset at which to read data
*
*/
ssize_t
v9fs_file_readn(struct file *filp, char *data, char __user *udata, u32 count,
u64 offset)
{
return v9fs_fid_readn(filp->private_data, data, udata, count, offset);
}

/**
* v9fs_file_read - read from a file
* @filp: file pointer to read
Expand Down Expand Up @@ -398,45 +411,21 @@ v9fs_file_read(struct file *filp, char __user *udata, size_t count,
return ret;
}

/**
* 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(struct file *filp, const char __user * data,
size_t count, loff_t * offset)
ssize_t
v9fs_file_write_internal(struct inode *inode, struct p9_fid *fid,
const char __user *data, size_t count,
loff_t *offset, int invalidate)
{
ssize_t retval;
size_t total = 0;
int n;
struct p9_fid *fid;
size_t total = 0;
struct p9_client *clnt;
struct inode *inode = filp->f_path.dentry->d_inode;
loff_t origin = *offset;
unsigned long pg_start, pg_end;

P9_DPRINTK(P9_DEBUG_VFS, "data %p count %d offset %x\n", data,
(int)count, (int)*offset);

fid = filp->private_data;
clnt = fid->clnt;

retval = generic_write_checks(filp, &origin, &count, 0);
if (retval)
goto out;

retval = -EINVAL;
if ((ssize_t) count < 0)
goto out;
retval = 0;
if (!count)
goto out;

do {
n = p9_client_write(fid, NULL, data+total, origin+total, count);
if (n <= 0)
Expand All @@ -445,7 +434,7 @@ v9fs_file_write(struct file *filp, const char __user * data,
total += n;
} while (count > 0);

if (total > 0) {
if (invalidate && (total > 0)) {
pg_start = origin >> PAGE_CACHE_SHIFT;
pg_end = (origin + total - 1) >> PAGE_CACHE_SHIFT;
if (inode->i_mapping && inode->i_mapping->nrpages)
Expand All @@ -455,11 +444,42 @@ v9fs_file_write(struct file *filp, const char __user * data,
i_size_write(inode, i_size_read(inode) + total);
inode->i_blocks = (i_size_read(inode) + 512 - 1) >> 9;
}

if (n < 0)
retval = n;
else
retval = total;
return n;

return total;
}

/**
* 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(struct file *filp, const char __user * data,
size_t count, loff_t *offset)
{
ssize_t retval = 0;
loff_t origin = *offset;


retval = generic_write_checks(filp, &origin, &count, 0);
if (retval)
goto out;

retval = -EINVAL;
if ((ssize_t) count < 0)
goto out;
retval = 0;
if (!count)
goto out;

return v9fs_file_write_internal(filp->f_path.dentry->d_inode,
filp->private_data,
data, count, offset, 1);
out:
return retval;
}
Expand Down

0 comments on commit 1731177

Please sign in to comment.