|
@@ -41,8 +41,10 @@ static int nfs_file_release(struct inode *, struct file *);
|
|
|
static loff_t nfs_file_llseek(struct file *file, loff_t offset, int origin);
|
|
|
static int nfs_file_mmap(struct file *, struct vm_area_struct *);
|
|
|
static ssize_t nfs_file_sendfile(struct file *, loff_t *, size_t, read_actor_t, void *);
|
|
|
-static ssize_t nfs_file_read(struct kiocb *, char __user *, size_t, loff_t);
|
|
|
-static ssize_t nfs_file_write(struct kiocb *, const char __user *, size_t, loff_t);
|
|
|
+static ssize_t nfs_file_read(struct kiocb *, const struct iovec *iov,
|
|
|
+ unsigned long nr_segs, loff_t pos);
|
|
|
+static ssize_t nfs_file_write(struct kiocb *, const struct iovec *iov,
|
|
|
+ unsigned long nr_segs, loff_t pos);
|
|
|
static int nfs_file_flush(struct file *, fl_owner_t id);
|
|
|
static int nfs_fsync(struct file *, struct dentry *dentry, int datasync);
|
|
|
static int nfs_check_flags(int flags);
|
|
@@ -53,8 +55,8 @@ const struct file_operations nfs_file_operations = {
|
|
|
.llseek = nfs_file_llseek,
|
|
|
.read = do_sync_read,
|
|
|
.write = do_sync_write,
|
|
|
- .aio_read = nfs_file_read,
|
|
|
- .aio_write = nfs_file_write,
|
|
|
+ .aio_read = nfs_file_read,
|
|
|
+ .aio_write = nfs_file_write,
|
|
|
.mmap = nfs_file_mmap,
|
|
|
.open = nfs_file_open,
|
|
|
.flush = nfs_file_flush,
|
|
@@ -196,15 +198,17 @@ nfs_file_flush(struct file *file, fl_owner_t id)
|
|
|
}
|
|
|
|
|
|
static ssize_t
|
|
|
-nfs_file_read(struct kiocb *iocb, char __user * buf, size_t count, loff_t pos)
|
|
|
+nfs_file_read(struct kiocb *iocb, const struct iovec *iov,
|
|
|
+ unsigned long nr_segs, loff_t pos)
|
|
|
{
|
|
|
struct dentry * dentry = iocb->ki_filp->f_dentry;
|
|
|
struct inode * inode = dentry->d_inode;
|
|
|
ssize_t result;
|
|
|
+ size_t count = iov_length(iov, nr_segs);
|
|
|
|
|
|
#ifdef CONFIG_NFS_DIRECTIO
|
|
|
if (iocb->ki_filp->f_flags & O_DIRECT)
|
|
|
- return nfs_file_direct_read(iocb, buf, count, pos);
|
|
|
+ return nfs_file_direct_read(iocb, iov, nr_segs, pos);
|
|
|
#endif
|
|
|
|
|
|
dfprintk(VFS, "nfs: read(%s/%s, %lu@%lu)\n",
|
|
@@ -214,7 +218,7 @@ nfs_file_read(struct kiocb *iocb, char __user * buf, size_t count, loff_t pos)
|
|
|
result = nfs_revalidate_mapping(inode, iocb->ki_filp->f_mapping);
|
|
|
nfs_add_stats(inode, NFSIOS_NORMALREADBYTES, count);
|
|
|
if (!result)
|
|
|
- result = generic_file_aio_read(iocb, buf, count, pos);
|
|
|
+ result = generic_file_aio_read(iocb, iov, nr_segs, pos);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
@@ -336,24 +340,22 @@ const struct address_space_operations nfs_file_aops = {
|
|
|
#endif
|
|
|
};
|
|
|
|
|
|
-/*
|
|
|
- * Write to a file (through the page cache).
|
|
|
- */
|
|
|
-static ssize_t
|
|
|
-nfs_file_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t pos)
|
|
|
+static ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov,
|
|
|
+ unsigned long nr_segs, loff_t pos)
|
|
|
{
|
|
|
struct dentry * dentry = iocb->ki_filp->f_dentry;
|
|
|
struct inode * inode = dentry->d_inode;
|
|
|
ssize_t result;
|
|
|
+ size_t count = iov_length(iov, nr_segs);
|
|
|
|
|
|
#ifdef CONFIG_NFS_DIRECTIO
|
|
|
if (iocb->ki_filp->f_flags & O_DIRECT)
|
|
|
- return nfs_file_direct_write(iocb, buf, count, pos);
|
|
|
+ return nfs_file_direct_write(iocb, iov, nr_segs, pos);
|
|
|
#endif
|
|
|
|
|
|
- dfprintk(VFS, "nfs: write(%s/%s(%ld), %lu@%lu)\n",
|
|
|
+ dfprintk(VFS, "nfs: write(%s/%s(%ld), %lu@%Ld)\n",
|
|
|
dentry->d_parent->d_name.name, dentry->d_name.name,
|
|
|
- inode->i_ino, (unsigned long) count, (unsigned long) pos);
|
|
|
+ inode->i_ino, (unsigned long) count, (long long) pos);
|
|
|
|
|
|
result = -EBUSY;
|
|
|
if (IS_SWAPFILE(inode))
|
|
@@ -372,7 +374,7 @@ nfs_file_write(struct kiocb *iocb, const char __user *buf, size_t count, loff_t
|
|
|
goto out;
|
|
|
|
|
|
nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, count);
|
|
|
- result = generic_file_aio_write(iocb, buf, count, pos);
|
|
|
+ result = generic_file_aio_write(iocb, iov, nr_segs, pos);
|
|
|
out:
|
|
|
return result;
|
|
|
|