* nfs_direct_read_seg - Read in one iov segment. Generate separate
* read RPCs for each "rsize" bytes.
* @inode: target inode
- * @file: target file (may be NULL)
+ * @ctx: target file open context
* user_addr: starting address of this segment of user's buffer
* count: size of this segment
* file_offset: offset in file to begin the operation
* nr_pages: size of pages array
*/
static int
-nfs_direct_read_seg(struct inode *inode, struct file *file,
+nfs_direct_read_seg(struct inode *inode, struct nfs_open_context *ctx,
unsigned long user_addr, size_t count, loff_t file_offset,
struct page **pages, int nr_pages)
{
int curpage = 0;
struct nfs_read_data rdata = {
.inode = inode,
+ .cred = ctx->cred,
.args = {
.fh = NFS_FH(inode),
- .lockowner = current->files,
+ .context = ctx,
},
.res = {
.fattr = &rdata.fattr,
user_addr + tot_bytes, rdata.args.pgbase, curpage);
lock_kernel();
- result = NFS_PROTO(inode)->read(&rdata, file);
+ result = NFS_PROTO(inode)->read(&rdata);
unlock_kernel();
if (result <= 0) {
* nfs_direct_read - For each iov segment, map the user's buffer
* then generate read RPCs.
* @inode: target inode
- * @file: target file (may be NULL)
+ * @ctx: target file open context
* @iov: array of vectors that define I/O buffer
* file_offset: offset in file to begin the operation
* nr_segs: size of iovec array
* server.
*/
static ssize_t
-nfs_direct_read(struct inode *inode, struct file *file,
+nfs_direct_read(struct inode *inode, struct nfs_open_context *ctx,
const struct iovec *iov, loff_t file_offset,
unsigned long nr_segs)
{
return page_count;
}
- result = nfs_direct_read_seg(inode, file, user_addr, size,
+ result = nfs_direct_read_seg(inode, ctx, user_addr, size,
file_offset, pages, page_count);
nfs_free_user_pages(pages, page_count, 1);
* nfs_direct_write_seg - Write out one iov segment. Generate separate
* write RPCs for each "wsize" bytes, then commit.
* @inode: target inode
- * @file: target file (may be NULL)
+ * @ctx: target file open context
* user_addr: starting address of this segment of user's buffer
* count: size of this segment
* file_offset: offset in file to begin the operation
* nr_pages: size of pages array
*/
static int
-nfs_direct_write_seg(struct inode *inode, struct file *file,
+nfs_direct_write_seg(struct inode *inode, struct nfs_open_context *ctx,
unsigned long user_addr, size_t count, loff_t file_offset,
struct page **pages, int nr_pages)
{
struct nfs_writeverf first_verf;
struct nfs_write_data wdata = {
.inode = inode,
+ .cred = ctx->cred,
.args = {
.fh = NFS_FH(inode),
- .lockowner = current->files,
+ .context = ctx,
},
.res = {
.fattr = &wdata.fattr,
user_addr + tot_bytes, wdata.args.pgbase, curpage);
lock_kernel();
- result = NFS_PROTO(inode)->write(&wdata, file);
+ result = NFS_PROTO(inode)->write(&wdata);
unlock_kernel();
if (result <= 0) {
wdata.args.offset = file_offset;
lock_kernel();
- result = NFS_PROTO(inode)->commit(&wdata, file);
+ result = NFS_PROTO(inode)->commit(&wdata);
unlock_kernel();
if (result < 0 || memcmp(&first_verf.verifier,
* nfs_direct_write - For each iov segment, map the user's buffer
* then generate write and commit RPCs.
* @inode: target inode
- * @file: target file (may be NULL)
+ * @ctx: target file open context
* @iov: array of vectors that define I/O buffer
* file_offset: offset in file to begin the operation
* nr_segs: size of iovec array
* that non-direct readers might access, so they will pick up these
* writes immediately.
*/
-static ssize_t
-nfs_direct_write(struct inode *inode, struct file *file,
+static int nfs_direct_write(struct inode *inode, struct nfs_open_context *ctx,
const struct iovec *iov, loff_t file_offset,
unsigned long nr_segs)
{
return page_count;
}
- result = nfs_direct_write_seg(inode, file, user_addr, size,
+ result = nfs_direct_write_seg(inode, ctx, user_addr, size,
file_offset, pages, page_count);
nfs_free_user_pages(pages, page_count, 0);
{
ssize_t result = -EINVAL;
struct file *file = iocb->ki_filp;
+ struct nfs_open_context *ctx;
struct dentry *dentry = file->f_dentry;
struct inode *inode = dentry->d_inode;
if (!is_sync_kiocb(iocb))
return result;
+ ctx = (struct nfs_open_context *)file->private_data;
switch (rw) {
case READ:
dprintk("NFS: direct_IO(read) (%s) off/no(%Lu/%lu)\n",
dentry->d_name.name, file_offset, nr_segs);
- result = nfs_direct_read(inode, file, iov,
+ result = nfs_direct_read(inode, ctx, iov,
file_offset, nr_segs);
break;
case WRITE:
dprintk("NFS: direct_IO(write) (%s) off/no(%Lu/%lu)\n",
dentry->d_name.name, file_offset, nr_segs);
- result = nfs_direct_write(inode, file, iov,
+ result = nfs_direct_write(inode, ctx, iov,
file_offset, nr_segs);
break;
default:
ssize_t retval = -EINVAL;
loff_t *ppos = &iocb->ki_pos;
struct file *file = iocb->ki_filp;
+ struct nfs_open_context *ctx =
+ (struct nfs_open_context *) file->private_data;
struct dentry *dentry = file->f_dentry;
struct address_space *mapping = file->f_mapping;
struct inode *inode = mapping->host;
goto out;
}
- retval = nfs_direct_read(inode, file, &iov, pos, 1);
+ retval = nfs_direct_read(inode, ctx, &iov, pos, 1);
if (retval > 0)
*ppos = pos + retval;
loff_t *ppos = &iocb->ki_pos;
unsigned long limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
struct file *file = iocb->ki_filp;
+ struct nfs_open_context *ctx =
+ (struct nfs_open_context *) file->private_data;
struct dentry *dentry = file->f_dentry;
struct address_space *mapping = file->f_mapping;
struct inode *inode = mapping->host;
goto out;
}
- retval = nfs_direct_write(inode, file, &iov, pos, 1);
+ retval = nfs_direct_write(inode, ctx, &iov, pos, 1);
if (mapping->nrpages)
invalidate_inode_pages2(mapping);
if (retval > 0)