Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
619d30b4
Commit
619d30b4
authored
Mar 04, 2014
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
convert the guts of nfs_direct_IO() to iov_iter
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
d8d3d94b
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
33 deletions
+35
-33
fs/nfs/direct.c
fs/nfs/direct.c
+21
-25
fs/nfs/file.c
fs/nfs/file.c
+12
-6
include/linux/nfs_fs.h
include/linux/nfs_fs.h
+2
-2
No files found.
fs/nfs/direct.c
View file @
619d30b4
...
...
@@ -132,9 +132,9 @@ ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t
VM_BUG_ON
(
iocb
->
ki_nbytes
!=
PAGE_SIZE
);
if
(
rw
==
READ
||
rw
==
KERNEL_READ
)
return
nfs_file_direct_read
(
iocb
,
iter
->
iov
,
iter
->
nr_segs
,
pos
,
return
nfs_file_direct_read
(
iocb
,
iter
,
pos
,
rw
==
READ
?
true
:
false
);
return
nfs_file_direct_write
(
iocb
,
iter
->
iov
,
iter
->
nr_segs
,
pos
,
return
nfs_file_direct_write
(
iocb
,
iter
,
pos
,
rw
==
WRITE
?
true
:
false
);
#endif
/* CONFIG_NFS_SWAP */
}
...
...
@@ -414,8 +414,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_pageio_descriptor *de
}
static
ssize_t
nfs_direct_read_schedule_iovec
(
struct
nfs_direct_req
*
dreq
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
struct
iov_iter
*
iter
,
loff_t
pos
,
bool
uio
)
{
struct
nfs_pageio_descriptor
desc
;
...
...
@@ -430,8 +429,8 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
desc
.
pg_dreq
=
dreq
;
atomic_inc
(
&
inode
->
i_dio_count
);
for
(
seg
=
0
;
seg
<
nr_segs
;
seg
++
)
{
const
struct
iovec
*
vec
=
&
iov
[
seg
];
for
(
seg
=
0
;
seg
<
iter
->
nr_segs
;
seg
++
)
{
const
struct
iovec
*
vec
=
&
i
ter
->
i
ov
[
seg
];
result
=
nfs_direct_read_schedule_segment
(
&
desc
,
vec
,
pos
,
uio
);
if
(
result
<
0
)
break
;
...
...
@@ -461,8 +460,7 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
/**
* nfs_file_direct_read - file direct read operation for NFS files
* @iocb: target I/O control block
* @iov: vector of user buffers into which to read data
* @nr_segs: size of iov vector
* @iter: vector of user buffers into which to read data
* @pos: byte offset in file where reading starts
*
* We use this function for direct reads instead of calling
...
...
@@ -479,8 +477,8 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
* client must read the updated atime from the server back into its
* cache.
*/
ssize_t
nfs_file_direct_read
(
struct
kiocb
*
iocb
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
loff_t
pos
,
bool
uio
)
ssize_t
nfs_file_direct_read
(
struct
kiocb
*
iocb
,
struct
iov_iter
*
iter
,
loff_t
pos
,
bool
uio
)
{
struct
file
*
file
=
iocb
->
ki_filp
;
struct
address_space
*
mapping
=
file
->
f_mapping
;
...
...
@@ -490,7 +488,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov,
ssize_t
result
=
-
EINVAL
;
size_t
count
;
count
=
iov_length
(
i
ov
,
nr_segs
);
count
=
iov_length
(
i
ter
->
iov
,
iter
->
nr_segs
);
nfs_add_stats
(
mapping
->
host
,
NFSIOS_DIRECTREADBYTES
,
count
);
dfprintk
(
FILE
,
"NFS: direct read(%pD2, %zd@%Ld)
\n
"
,
...
...
@@ -513,7 +511,7 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov,
goto
out_unlock
;
dreq
->
inode
=
inode
;
dreq
->
bytes_left
=
iov_length
(
iov
,
nr_segs
)
;
dreq
->
bytes_left
=
count
;
dreq
->
ctx
=
get_nfs_open_context
(
nfs_file_open_context
(
iocb
->
ki_filp
));
l_ctx
=
nfs_get_lock_context
(
dreq
->
ctx
);
if
(
IS_ERR
(
l_ctx
))
{
...
...
@@ -524,8 +522,8 @@ ssize_t nfs_file_direct_read(struct kiocb *iocb, const struct iovec *iov,
if
(
!
is_sync_kiocb
(
iocb
))
dreq
->
iocb
=
iocb
;
NFS_I
(
inode
)
->
read_io
+=
iov_length
(
iov
,
nr_segs
)
;
result
=
nfs_direct_read_schedule_iovec
(
dreq
,
i
ov
,
nr_segs
,
pos
,
uio
);
NFS_I
(
inode
)
->
read_io
+=
count
;
result
=
nfs_direct_read_schedule_iovec
(
dreq
,
i
ter
,
pos
,
uio
);
mutex_unlock
(
&
inode
->
i_mutex
);
...
...
@@ -864,8 +862,7 @@ static const struct nfs_pgio_completion_ops nfs_direct_write_completion_ops = {
};
static
ssize_t
nfs_direct_write_schedule_iovec
(
struct
nfs_direct_req
*
dreq
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
struct
iov_iter
*
iter
,
loff_t
pos
,
bool
uio
)
{
struct
nfs_pageio_descriptor
desc
;
...
...
@@ -880,9 +877,9 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
get_dreq
(
dreq
);
atomic_inc
(
&
inode
->
i_dio_count
);
NFS_I
(
dreq
->
inode
)
->
write_io
+=
iov_length
(
i
ov
,
nr_segs
);
for
(
seg
=
0
;
seg
<
nr_segs
;
seg
++
)
{
const
struct
iovec
*
vec
=
&
iov
[
seg
];
NFS_I
(
dreq
->
inode
)
->
write_io
+=
iov_length
(
i
ter
->
iov
,
iter
->
nr_segs
);
for
(
seg
=
0
;
seg
<
iter
->
nr_segs
;
seg
++
)
{
const
struct
iovec
*
vec
=
&
i
ter
->
i
ov
[
seg
];
result
=
nfs_direct_write_schedule_segment
(
&
desc
,
vec
,
pos
,
uio
);
if
(
result
<
0
)
break
;
...
...
@@ -911,8 +908,7 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
/**
* nfs_file_direct_write - file direct write operation for NFS files
* @iocb: target I/O control block
* @iov: vector of user buffers from which to write data
* @nr_segs: size of iov vector
* @iter: vector of user buffers from which to write data
* @pos: byte offset in file where writing starts
*
* We use this function for direct writes instead of calling
...
...
@@ -930,8 +926,8 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
* Note that O_APPEND is not supported for NFS direct writes, as there
* is no atomic O_APPEND write facility in the NFS protocol.
*/
ssize_t
nfs_file_direct_write
(
struct
kiocb
*
iocb
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
loff_t
pos
,
bool
uio
)
ssize_t
nfs_file_direct_write
(
struct
kiocb
*
iocb
,
struct
iov_iter
*
iter
,
loff_t
pos
,
bool
uio
)
{
ssize_t
result
=
-
EINVAL
;
struct
file
*
file
=
iocb
->
ki_filp
;
...
...
@@ -942,7 +938,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
loff_t
end
;
size_t
count
;
count
=
iov_length
(
i
ov
,
nr_segs
);
count
=
iov_length
(
i
ter
->
iov
,
iter
->
nr_segs
);
end
=
(
pos
+
count
-
1
)
>>
PAGE_CACHE_SHIFT
;
nfs_add_stats
(
mapping
->
host
,
NFSIOS_DIRECTWRITTENBYTES
,
count
);
...
...
@@ -993,7 +989,7 @@ ssize_t nfs_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
if
(
!
is_sync_kiocb
(
iocb
))
dreq
->
iocb
=
iocb
;
result
=
nfs_direct_write_schedule_iovec
(
dreq
,
i
ov
,
nr_segs
,
pos
,
uio
);
result
=
nfs_direct_write_schedule_iovec
(
dreq
,
i
ter
,
pos
,
uio
);
if
(
mapping
->
nrpages
)
{
invalidate_inode_pages2_range
(
mapping
,
...
...
fs/nfs/file.c
View file @
619d30b4
...
...
@@ -169,14 +169,18 @@ nfs_file_read(struct kiocb *iocb, const struct iovec *iov,
unsigned
long
nr_segs
,
loff_t
pos
)
{
struct
inode
*
inode
=
file_inode
(
iocb
->
ki_filp
);
size_t
count
=
iov_length
(
iov
,
nr_segs
);
ssize_t
result
;
struct
iov_iter
to
;
iov_iter_init
(
&
to
,
iov
,
nr_segs
,
count
,
0
);
if
(
iocb
->
ki_filp
->
f_flags
&
O_DIRECT
)
return
nfs_file_direct_read
(
iocb
,
iov
,
nr_segs
,
pos
,
true
);
return
nfs_file_direct_read
(
iocb
,
&
to
,
pos
,
true
);
dprintk
(
"NFS: read(%pD2, %
l
u@%lu)
\n
"
,
dprintk
(
"NFS: read(%pD2, %
z
u@%lu)
\n
"
,
iocb
->
ki_filp
,
(
unsigned
long
)
iov_length
(
iov
,
nr_segs
)
,
(
unsigned
long
)
pos
);
count
,
(
unsigned
long
)
pos
);
result
=
nfs_revalidate_mapping
(
inode
,
iocb
->
ki_filp
->
f_mapping
);
if
(
!
result
)
{
...
...
@@ -643,16 +647,18 @@ ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov,
unsigned
long
written
=
0
;
ssize_t
result
;
size_t
count
=
iov_length
(
iov
,
nr_segs
);
struct
iov_iter
from
;
iov_iter_init
(
&
from
,
iov
,
nr_segs
,
count
,
0
);
result
=
nfs_key_timeout_notify
(
file
,
inode
);
if
(
result
)
return
result
;
if
(
file
->
f_flags
&
O_DIRECT
)
return
nfs_file_direct_write
(
iocb
,
iov
,
nr_segs
,
pos
,
true
);
return
nfs_file_direct_write
(
iocb
,
&
from
,
pos
,
true
);
dprintk
(
"NFS: write(%pD2, %
l
u@%Ld)
\n
"
,
file
,
(
unsigned
long
)
count
,
(
long
long
)
pos
);
dprintk
(
"NFS: write(%pD2, %
z
u@%Ld)
\n
"
,
file
,
count
,
(
long
long
)
pos
);
result
=
-
EBUSY
;
if
(
IS_SWAPFILE
(
inode
))
...
...
include/linux/nfs_fs.h
View file @
619d30b4
...
...
@@ -461,10 +461,10 @@ extern int nfs3_removexattr (struct dentry *, const char *name);
*/
extern
ssize_t
nfs_direct_IO
(
int
,
struct
kiocb
*
,
struct
iov_iter
*
,
loff_t
);
extern
ssize_t
nfs_file_direct_read
(
struct
kiocb
*
iocb
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
struct
iov_iter
*
iter
,
loff_t
pos
,
bool
uio
);
extern
ssize_t
nfs_file_direct_write
(
struct
kiocb
*
iocb
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
struct
iov_iter
*
iter
,
loff_t
pos
,
bool
uio
);
/*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment