git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vserver 1.9.3
[linux-2.6.git]
/
fs
/
nfs
/
direct.c
diff --git
a/fs/nfs/direct.c
b/fs/nfs/direct.c
index
77f051e
..
21c3c4d
100644
(file)
--- a/
fs/nfs/direct.c
+++ b/
fs/nfs/direct.c
@@
-110,7
+110,7
@@
nfs_free_user_pages(struct page **pages, int npages, int do_dirty)
* nfs_direct_read_seg - Read in one iov segment. Generate separate
* read RPCs for each "rsize" bytes.
* @inode: target inode
* 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
* 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
@@
-118,7
+118,7
@@
nfs_free_user_pages(struct page **pages, int npages, int do_dirty)
* nr_pages: size of pages array
*/
static int
* 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)
{
unsigned long user_addr, size_t count, loff_t file_offset,
struct page **pages, int nr_pages)
{
@@
-127,9
+127,10
@@
nfs_direct_read_seg(struct inode *inode, struct file *file,
int curpage = 0;
struct nfs_read_data rdata = {
.inode = inode,
int curpage = 0;
struct nfs_read_data rdata = {
.inode = inode,
+ .cred = ctx->cred,
.args = {
.fh = NFS_FH(inode),
.args = {
.fh = NFS_FH(inode),
- .
lockowner = current->files
,
+ .
context = ctx
,
},
.res = {
.fattr = &rdata.fattr,
},
.res = {
.fattr = &rdata.fattr,
@@
-151,7
+152,7
@@
nfs_direct_read_seg(struct inode *inode, struct file *file,
user_addr + tot_bytes, rdata.args.pgbase, curpage);
lock_kernel();
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) {
unlock_kernel();
if (result <= 0) {
@@
-183,7
+184,7
@@
nfs_direct_read_seg(struct inode *inode, struct file *file,
* nfs_direct_read - For each iov segment, map the user's buffer
* then generate read RPCs.
* @inode: target inode
* 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
* @iov: array of vectors that define I/O buffer
* file_offset: offset in file to begin the operation
* nr_segs: size of iovec array
@@
-193,7
+194,7
@@
nfs_direct_read_seg(struct inode *inode, struct file *file,
* server.
*/
static ssize_t
* 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)
{
const struct iovec *iov, loff_t file_offset,
unsigned long nr_segs)
{
@@
-216,7
+217,7
@@
nfs_direct_read(struct inode *inode, struct file *file,
return page_count;
}
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);
file_offset, pages, page_count);
nfs_free_user_pages(pages, page_count, 1);
@@
-239,7
+240,7
@@
nfs_direct_read(struct inode *inode, struct file *file,
* nfs_direct_write_seg - Write out one iov segment. Generate separate
* write RPCs for each "wsize" bytes, then commit.
* @inode: target inode
* 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
* 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
@@
-247,7
+248,7
@@
nfs_direct_read(struct inode *inode, struct file *file,
* nr_pages: size of pages array
*/
static int
* 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)
{
unsigned long user_addr, size_t count, loff_t file_offset,
struct page **pages, int nr_pages)
{
@@
-257,9
+258,10
@@
nfs_direct_write_seg(struct inode *inode, struct file *file,
struct nfs_writeverf first_verf;
struct nfs_write_data wdata = {
.inode = inode,
struct nfs_writeverf first_verf;
struct nfs_write_data wdata = {
.inode = inode,
+ .cred = ctx->cred,
.args = {
.fh = NFS_FH(inode),
.args = {
.fh = NFS_FH(inode),
- .
lockowner = current->files
,
+ .
context = ctx
,
},
.res = {
.fattr = &wdata.fattr,
},
.res = {
.fattr = &wdata.fattr,
@@
-290,7
+292,7
@@
retry:
user_addr + tot_bytes, wdata.args.pgbase, curpage);
lock_kernel();
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) {
unlock_kernel();
if (result <= 0) {
@@
-325,7
+327,7
@@
retry:
wdata.args.offset = file_offset;
lock_kernel();
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,
unlock_kernel();
if (result < 0 || memcmp(&first_verf.verifier,
@@
-349,7
+351,7
@@
sync_retry:
* nfs_direct_write - For each iov segment, map the user's buffer
* then generate write and commit RPCs.
* @inode: target inode
* 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
* @iov: array of vectors that define I/O buffer
* file_offset: offset in file to begin the operation
* nr_segs: size of iovec array
@@
-358,8
+360,7
@@
sync_retry:
* that non-direct readers might access, so they will pick up these
* writes immediately.
*/
* 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)
{
const struct iovec *iov, loff_t file_offset,
unsigned long nr_segs)
{
@@
-382,7
+383,7
@@
nfs_direct_write(struct inode *inode, struct file *file,
return page_count;
}
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);
file_offset, pages, page_count);
nfs_free_user_pages(pages, page_count, 0);
@@
-414,6
+415,7
@@
nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
{
ssize_t result = -EINVAL;
struct file *file = iocb->ki_filp;
{
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;
struct dentry *dentry = file->f_dentry;
struct inode *inode = dentry->d_inode;
@@
-423,19
+425,20
@@
nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
if (!is_sync_kiocb(iocb))
return result;
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);
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);
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:
file_offset, nr_segs);
break;
default:
@@
-471,11
+474,13
@@
nfs_file_direct_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t
ssize_t retval = -EINVAL;
loff_t *ppos = &iocb->ki_pos;
struct file *file = iocb->ki_filp;
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;
struct iovec iov = {
struct dentry *dentry = file->f_dentry;
struct address_space *mapping = file->f_mapping;
struct inode *inode = mapping->host;
struct iovec iov = {
- .iov_base =
(char *)
buf,
+ .iov_base = buf,
.iov_len = count,
};
.iov_len = count,
};
@@
-502,7
+507,7
@@
nfs_file_direct_read(struct kiocb *iocb, char __user *buf, size_t count, loff_t
goto out;
}
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;
if (retval > 0)
*ppos = pos + retval;
@@
-542,6
+547,8
@@
nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t count,
loff_t *ppos = &iocb->ki_pos;
unsigned long limit = current->rlim[RLIMIT_FSIZE].rlim_cur;
struct file *file = iocb->ki_filp;
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;
struct dentry *dentry = file->f_dentry;
struct address_space *mapping = file->f_mapping;
struct inode *inode = mapping->host;
@@
-589,7
+596,7
@@
nfs_file_direct_write(struct kiocb *iocb, const char __user *buf, size_t count,
goto out;
}
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)
if (mapping->nrpages)
invalidate_inode_pages2(mapping);
if (retval > 0)