|
@@ -323,25 +323,22 @@ out_err:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 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;
|
|
@@ -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
|
|
@@ -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)
|
|
@@ -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)
|
|
@@ -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;
|
|
|
}
|