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
1b895840
Commit
1b895840
authored
Mar 31, 2006
by
Nathan Scott
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[XFS] Provide XFS support for the splice syscall.
Signed-off-by:
Nathan Scott
<
nathans@sgi.com
>
parent
3bbcc8e3
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
199 additions
and
62 deletions
+199
-62
fs/xfs/linux-2.6/xfs_file.c
fs/xfs/linux-2.6/xfs_file.c
+80
-33
fs/xfs/linux-2.6/xfs_linux.h
fs/xfs/linux-2.6/xfs_linux.h
+1
-0
fs/xfs/linux-2.6/xfs_lrw.c
fs/xfs/linux-2.6/xfs_lrw.c
+93
-27
fs/xfs/linux-2.6/xfs_lrw.h
fs/xfs/linux-2.6/xfs_lrw.h
+9
-2
fs/xfs/linux-2.6/xfs_vnode.h
fs/xfs/linux-2.6/xfs_vnode.h
+12
-0
fs/xfs/xfs_vnodeops.c
fs/xfs/xfs_vnodeops.c
+4
-0
No files found.
fs/xfs/linux-2.6/xfs_file.c
View file @
1b895840
...
@@ -69,7 +69,6 @@ __xfs_file_read(
...
@@ -69,7 +69,6 @@ __xfs_file_read(
return
rval
;
return
rval
;
}
}
STATIC
ssize_t
STATIC
ssize_t
xfs_file_aio_read
(
xfs_file_aio_read
(
struct
kiocb
*
iocb
,
struct
kiocb
*
iocb
,
...
@@ -90,7 +89,6 @@ xfs_file_aio_read_invis(
...
@@ -90,7 +89,6 @@ xfs_file_aio_read_invis(
return
__xfs_file_read
(
iocb
,
buf
,
IO_ISAIO
|
IO_INVIS
,
count
,
pos
);
return
__xfs_file_read
(
iocb
,
buf
,
IO_ISAIO
|
IO_INVIS
,
count
,
pos
);
}
}
STATIC
inline
ssize_t
STATIC
inline
ssize_t
__xfs_file_write
(
__xfs_file_write
(
struct
kiocb
*
iocb
,
struct
kiocb
*
iocb
,
...
@@ -113,7 +111,6 @@ __xfs_file_write(
...
@@ -113,7 +111,6 @@ __xfs_file_write(
return
rval
;
return
rval
;
}
}
STATIC
ssize_t
STATIC
ssize_t
xfs_file_aio_write
(
xfs_file_aio_write
(
struct
kiocb
*
iocb
,
struct
kiocb
*
iocb
,
...
@@ -134,7 +131,6 @@ xfs_file_aio_write_invis(
...
@@ -134,7 +131,6 @@ xfs_file_aio_write_invis(
return
__xfs_file_write
(
iocb
,
buf
,
IO_ISAIO
|
IO_INVIS
,
count
,
pos
);
return
__xfs_file_write
(
iocb
,
buf
,
IO_ISAIO
|
IO_INVIS
,
count
,
pos
);
}
}
STATIC
inline
ssize_t
STATIC
inline
ssize_t
__xfs_file_readv
(
__xfs_file_readv
(
struct
file
*
file
,
struct
file
*
file
,
...
@@ -179,7 +175,6 @@ xfs_file_readv_invis(
...
@@ -179,7 +175,6 @@ xfs_file_readv_invis(
return
__xfs_file_readv
(
file
,
iov
,
IO_INVIS
,
nr_segs
,
ppos
);
return
__xfs_file_readv
(
file
,
iov
,
IO_INVIS
,
nr_segs
,
ppos
);
}
}
STATIC
inline
ssize_t
STATIC
inline
ssize_t
__xfs_file_writev
(
__xfs_file_writev
(
struct
file
*
file
,
struct
file
*
file
,
...
@@ -204,7 +199,6 @@ __xfs_file_writev(
...
@@ -204,7 +199,6 @@ __xfs_file_writev(
return
rval
;
return
rval
;
}
}
STATIC
ssize_t
STATIC
ssize_t
xfs_file_writev
(
xfs_file_writev
(
struct
file
*
file
,
struct
file
*
file
,
...
@@ -228,7 +222,7 @@ xfs_file_writev_invis(
...
@@ -228,7 +222,7 @@ xfs_file_writev_invis(
STATIC
ssize_t
STATIC
ssize_t
xfs_file_sendfile
(
xfs_file_sendfile
(
struct
file
*
filp
,
struct
file
*
filp
,
loff_t
*
p
p
os
,
loff_t
*
pos
,
size_t
count
,
size_t
count
,
read_actor_t
actor
,
read_actor_t
actor
,
void
*
target
)
void
*
target
)
...
@@ -236,10 +230,80 @@ xfs_file_sendfile(
...
@@ -236,10 +230,80 @@ xfs_file_sendfile(
vnode_t
*
vp
=
vn_from_inode
(
filp
->
f_dentry
->
d_inode
);
vnode_t
*
vp
=
vn_from_inode
(
filp
->
f_dentry
->
d_inode
);
ssize_t
rval
;
ssize_t
rval
;
VOP_SENDFILE
(
vp
,
filp
,
p
p
os
,
0
,
count
,
actor
,
target
,
NULL
,
rval
);
VOP_SENDFILE
(
vp
,
filp
,
pos
,
0
,
count
,
actor
,
target
,
NULL
,
rval
);
return
rval
;
return
rval
;
}
}
STATIC
ssize_t
xfs_file_sendfile_invis
(
struct
file
*
filp
,
loff_t
*
pos
,
size_t
count
,
read_actor_t
actor
,
void
*
target
)
{
vnode_t
*
vp
=
vn_from_inode
(
filp
->
f_dentry
->
d_inode
);
ssize_t
rval
;
VOP_SENDFILE
(
vp
,
filp
,
pos
,
IO_INVIS
,
count
,
actor
,
target
,
NULL
,
rval
);
return
rval
;
}
STATIC
ssize_t
xfs_file_splice_read
(
struct
file
*
infilp
,
struct
inode
*
pipe
,
size_t
len
,
unsigned
int
flags
)
{
vnode_t
*
vp
=
vn_from_inode
(
infilp
->
f_dentry
->
d_inode
);
ssize_t
rval
;
VOP_SPLICE_READ
(
vp
,
infilp
,
pipe
,
len
,
flags
,
0
,
NULL
,
rval
);
return
rval
;
}
STATIC
ssize_t
xfs_file_splice_read_invis
(
struct
file
*
infilp
,
struct
inode
*
pipe
,
size_t
len
,
unsigned
int
flags
)
{
vnode_t
*
vp
=
vn_from_inode
(
infilp
->
f_dentry
->
d_inode
);
ssize_t
rval
;
VOP_SPLICE_READ
(
vp
,
infilp
,
pipe
,
len
,
flags
,
IO_INVIS
,
NULL
,
rval
);
return
rval
;
}
STATIC
ssize_t
xfs_file_splice_write
(
struct
inode
*
pipe
,
struct
file
*
outfilp
,
size_t
len
,
unsigned
int
flags
)
{
vnode_t
*
vp
=
vn_from_inode
(
outfilp
->
f_dentry
->
d_inode
);
ssize_t
rval
;
VOP_SPLICE_WRITE
(
vp
,
pipe
,
outfilp
,
len
,
flags
,
0
,
NULL
,
rval
);
return
rval
;
}
STATIC
ssize_t
xfs_file_splice_write_invis
(
struct
inode
*
pipe
,
struct
file
*
outfilp
,
size_t
len
,
unsigned
int
flags
)
{
vnode_t
*
vp
=
vn_from_inode
(
outfilp
->
f_dentry
->
d_inode
);
ssize_t
rval
;
VOP_SPLICE_WRITE
(
vp
,
pipe
,
outfilp
,
len
,
flags
,
IO_INVIS
,
NULL
,
rval
);
return
rval
;
}
STATIC
int
STATIC
int
xfs_file_open
(
xfs_file_open
(
...
@@ -251,13 +315,10 @@ xfs_file_open(
...
@@ -251,13 +315,10 @@ xfs_file_open(
if
(
!
(
filp
->
f_flags
&
O_LARGEFILE
)
&&
i_size_read
(
inode
)
>
MAX_NON_LFS
)
if
(
!
(
filp
->
f_flags
&
O_LARGEFILE
)
&&
i_size_read
(
inode
)
>
MAX_NON_LFS
)
return
-
EFBIG
;
return
-
EFBIG
;
ASSERT
(
vp
);
VOP_OPEN
(
vp
,
NULL
,
error
);
VOP_OPEN
(
vp
,
NULL
,
error
);
return
-
error
;
return
-
error
;
}
}
STATIC
int
STATIC
int
xfs_file_release
(
xfs_file_release
(
struct
inode
*
inode
,
struct
inode
*
inode
,
...
@@ -271,7 +332,6 @@ xfs_file_release(
...
@@ -271,7 +332,6 @@ xfs_file_release(
return
-
error
;
return
-
error
;
}
}
STATIC
int
STATIC
int
xfs_file_fsync
(
xfs_file_fsync
(
struct
file
*
filp
,
struct
file
*
filp
,
...
@@ -285,21 +345,11 @@ xfs_file_fsync(
...
@@ -285,21 +345,11 @@ xfs_file_fsync(
if
(
datasync
)
if
(
datasync
)
flags
|=
FSYNC_DATA
;
flags
|=
FSYNC_DATA
;
ASSERT
(
vp
);
VOP_FSYNC
(
vp
,
flags
,
NULL
,
(
xfs_off_t
)
0
,
(
xfs_off_t
)
-
1
,
error
);
VOP_FSYNC
(
vp
,
flags
,
NULL
,
(
xfs_off_t
)
0
,
(
xfs_off_t
)
-
1
,
error
);
return
-
error
;
return
-
error
;
}
}
/*
* xfs_file_readdir maps to VOP_READDIR().
* We need to build a uio, cred, ...
*/
#define nextdp(dp) ((struct xfs_dirent *)((char *)(dp) + (dp)->d_reclen))
#ifdef CONFIG_XFS_DMAPI
#ifdef CONFIG_XFS_DMAPI
STATIC
struct
page
*
STATIC
struct
page
*
xfs_vm_nopage
(
xfs_vm_nopage
(
struct
vm_area_struct
*
area
,
struct
vm_area_struct
*
area
,
...
@@ -319,10 +369,8 @@ xfs_vm_nopage(
...
@@ -319,10 +369,8 @@ xfs_vm_nopage(
return
filemap_nopage
(
area
,
address
,
type
);
return
filemap_nopage
(
area
,
address
,
type
);
}
}
#endif
/* CONFIG_XFS_DMAPI */
#endif
/* CONFIG_XFS_DMAPI */
STATIC
int
STATIC
int
xfs_file_readdir
(
xfs_file_readdir
(
struct
file
*
filp
,
struct
file
*
filp
,
...
@@ -330,7 +378,7 @@ xfs_file_readdir(
...
@@ -330,7 +378,7 @@ xfs_file_readdir(
filldir_t
filldir
)
filldir_t
filldir
)
{
{
int
error
=
0
;
int
error
=
0
;
vnode_t
*
vp
;
vnode_t
*
vp
=
vn_from_inode
(
filp
->
f_dentry
->
d_inode
)
;
uio_t
uio
;
uio_t
uio
;
iovec_t
iov
;
iovec_t
iov
;
int
eof
=
0
;
int
eof
=
0
;
...
@@ -340,9 +388,6 @@ xfs_file_readdir(
...
@@ -340,9 +388,6 @@ xfs_file_readdir(
xfs_off_t
start_offset
,
curr_offset
;
xfs_off_t
start_offset
,
curr_offset
;
xfs_dirent_t
*
dbp
=
NULL
;
xfs_dirent_t
*
dbp
=
NULL
;
vp
=
vn_from_inode
(
filp
->
f_dentry
->
d_inode
);
ASSERT
(
vp
);
/* Try fairly hard to get memory */
/* Try fairly hard to get memory */
do
{
do
{
if
((
read_buf
=
(
caddr_t
)
kmalloc
(
rlen
,
GFP_KERNEL
)))
if
((
read_buf
=
(
caddr_t
)
kmalloc
(
rlen
,
GFP_KERNEL
)))
...
@@ -387,7 +432,7 @@ xfs_file_readdir(
...
@@ -387,7 +432,7 @@ xfs_file_readdir(
}
}
size
-=
dbp
->
d_reclen
;
size
-=
dbp
->
d_reclen
;
curr_offset
=
(
loff_t
)
dbp
->
d_off
/* & 0x7fffffff */
;
curr_offset
=
(
loff_t
)
dbp
->
d_off
/* & 0x7fffffff */
;
dbp
=
nextdp
(
dbp
);
dbp
=
(
xfs_dirent_t
*
)((
char
*
)
dbp
+
dbp
->
d_reclen
);
}
}
}
}
done:
done:
...
@@ -402,7 +447,6 @@ xfs_file_readdir(
...
@@ -402,7 +447,6 @@ xfs_file_readdir(
return
-
error
;
return
-
error
;
}
}
STATIC
int
STATIC
int
xfs_file_mmap
(
xfs_file_mmap
(
struct
file
*
filp
,
struct
file
*
filp
,
...
@@ -457,11 +501,10 @@ xfs_file_ioctl_invis(
...
@@ -457,11 +501,10 @@ xfs_file_ioctl_invis(
unsigned
int
cmd
,
unsigned
int
cmd
,
unsigned
long
arg
)
unsigned
long
arg
)
{
{
int
error
;
struct
inode
*
inode
=
filp
->
f_dentry
->
d_inode
;
struct
inode
*
inode
=
filp
->
f_dentry
->
d_inode
;
vnode_t
*
vp
=
vn_from_inode
(
inode
);
vnode_t
*
vp
=
vn_from_inode
(
inode
);
int
error
;
ASSERT
(
vp
);
VOP_IOCTL
(
vp
,
inode
,
filp
,
IO_INVIS
,
cmd
,
(
void
__user
*
)
arg
,
error
);
VOP_IOCTL
(
vp
,
inode
,
filp
,
IO_INVIS
,
cmd
,
(
void
__user
*
)
arg
,
error
);
VMODIFY
(
vp
);
VMODIFY
(
vp
);
...
@@ -537,6 +580,8 @@ const struct file_operations xfs_file_operations = {
...
@@ -537,6 +580,8 @@ const struct file_operations xfs_file_operations = {
.
aio_read
=
xfs_file_aio_read
,
.
aio_read
=
xfs_file_aio_read
,
.
aio_write
=
xfs_file_aio_write
,
.
aio_write
=
xfs_file_aio_write
,
.
sendfile
=
xfs_file_sendfile
,
.
sendfile
=
xfs_file_sendfile
,
.
splice_read
=
xfs_file_splice_read
,
.
splice_write
=
xfs_file_splice_write
,
.
unlocked_ioctl
=
xfs_file_ioctl
,
.
unlocked_ioctl
=
xfs_file_ioctl
,
#ifdef CONFIG_COMPAT
#ifdef CONFIG_COMPAT
.
compat_ioctl
=
xfs_file_compat_ioctl
,
.
compat_ioctl
=
xfs_file_compat_ioctl
,
...
@@ -558,7 +603,9 @@ const struct file_operations xfs_invis_file_operations = {
...
@@ -558,7 +603,9 @@ const struct file_operations xfs_invis_file_operations = {
.
writev
=
xfs_file_writev_invis
,
.
writev
=
xfs_file_writev_invis
,
.
aio_read
=
xfs_file_aio_read_invis
,
.
aio_read
=
xfs_file_aio_read_invis
,
.
aio_write
=
xfs_file_aio_write_invis
,
.
aio_write
=
xfs_file_aio_write_invis
,
.
sendfile
=
xfs_file_sendfile
,
.
sendfile
=
xfs_file_sendfile_invis
,
.
splice_read
=
xfs_file_splice_read_invis
,
.
splice_write
=
xfs_file_splice_write_invis
,
.
unlocked_ioctl
=
xfs_file_ioctl_invis
,
.
unlocked_ioctl
=
xfs_file_ioctl_invis
,
#ifdef CONFIG_COMPAT
#ifdef CONFIG_COMPAT
.
compat_ioctl
=
xfs_file_compat_invis_ioctl
,
.
compat_ioctl
=
xfs_file_compat_invis_ioctl
,
...
...
fs/xfs/linux-2.6/xfs_linux.h
View file @
1b895840
...
@@ -103,6 +103,7 @@
...
@@ -103,6 +103,7 @@
*/
*/
#undef HAVE_REFCACHE
/* reference cache not needed for NFS in 2.6 */
#undef HAVE_REFCACHE
/* reference cache not needed for NFS in 2.6 */
#define HAVE_SENDFILE
/* sendfile(2) exists in 2.6, but not in 2.4 */
#define HAVE_SENDFILE
/* sendfile(2) exists in 2.6, but not in 2.4 */
#define HAVE_SPLICE
/* a splice(2) exists in 2.6, but not in 2.4 */
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
#define HAVE_PERCPU_SB
/* per cpu superblock counters are a 2.6 feature */
#define HAVE_PERCPU_SB
/* per cpu superblock counters are a 2.6 feature */
#else
#else
...
...
fs/xfs/linux-2.6/xfs_lrw.c
View file @
1b895840
...
@@ -301,36 +301,23 @@ xfs_sendfile(
...
@@ -301,36 +301,23 @@ xfs_sendfile(
void
*
target
,
void
*
target
,
cred_t
*
credp
)
cred_t
*
credp
)
{
{
xfs_inode_t
*
ip
=
XFS_BHVTOI
(
bdp
);
xfs_mount_t
*
mp
=
ip
->
i_mount
;
ssize_t
ret
;
ssize_t
ret
;
xfs_fsize_t
n
;
xfs_inode_t
*
ip
;
xfs_mount_t
*
mp
;
vnode_t
*
vp
;
ip
=
XFS_BHVTOI
(
bdp
);
vp
=
BHV_TO_VNODE
(
bdp
);
mp
=
ip
->
i_mount
;
XFS_STATS_INC
(
xs_read_calls
);
XFS_STATS_INC
(
xs_read_calls
);
if
(
XFS_FORCED_SHUTDOWN
(
mp
))
n
=
XFS_MAXIOFFSET
(
mp
)
-
*
offset
;
if
((
n
<=
0
)
||
(
count
==
0
))
return
0
;
if
(
n
<
count
)
count
=
n
;
if
(
XFS_FORCED_SHUTDOWN
(
ip
->
i_mount
))
return
-
EIO
;
return
-
EIO
;
xfs_ilock
(
ip
,
XFS_IOLOCK_SHARED
);
xfs_ilock
(
ip
,
XFS_IOLOCK_SHARED
);
if
(
DM_EVENT_ENABLED
(
vp
->
v_vfsp
,
ip
,
DM_EVENT_READ
)
&&
if
(
DM_EVENT_ENABLED
(
BHV_TO_VNODE
(
bdp
)
->
v_vfsp
,
ip
,
DM_EVENT_READ
)
&&
(
!
(
ioflags
&
IO_INVIS
)))
{
(
!
(
ioflags
&
IO_INVIS
)))
{
vrwlock_t
locktype
=
VRWLOCK_READ
;
vrwlock_t
locktype
=
VRWLOCK_READ
;
int
error
;
int
error
;
error
=
XFS_SEND_DATA
(
mp
,
DM_EVENT_READ
,
BHV_TO_VNODE
(
bdp
),
*
offset
,
count
,
error
=
XFS_SEND_DATA
(
mp
,
DM_EVENT_READ
,
BHV_TO_VNODE
(
bdp
),
*
offset
,
count
,
FILP_DELAY_FLAG
(
filp
),
&
locktype
);
FILP_DELAY_FLAG
(
filp
),
&
locktype
);
if
(
error
)
{
if
(
error
)
{
xfs_iunlock
(
ip
,
XFS_IOLOCK_SHARED
);
xfs_iunlock
(
ip
,
XFS_IOLOCK_SHARED
);
...
@@ -340,12 +327,96 @@ xfs_sendfile(
...
@@ -340,12 +327,96 @@ xfs_sendfile(
xfs_rw_enter_trace
(
XFS_SENDFILE_ENTER
,
&
ip
->
i_iocore
,
xfs_rw_enter_trace
(
XFS_SENDFILE_ENTER
,
&
ip
->
i_iocore
,
(
void
*
)(
unsigned
long
)
target
,
count
,
*
offset
,
ioflags
);
(
void
*
)(
unsigned
long
)
target
,
count
,
*
offset
,
ioflags
);
ret
=
generic_file_sendfile
(
filp
,
offset
,
count
,
actor
,
target
);
ret
=
generic_file_sendfile
(
filp
,
offset
,
count
,
actor
,
target
);
if
(
ret
>
0
)
XFS_STATS_ADD
(
xs_read_bytes
,
ret
);
xfs_iunlock
(
ip
,
XFS_IOLOCK_SHARED
);
xfs_iunlock
(
ip
,
XFS_IOLOCK_SHARED
);
return
ret
;
}
ssize_t
xfs_splice_read
(
bhv_desc_t
*
bdp
,
struct
file
*
infilp
,
struct
inode
*
pipe
,
size_t
count
,
int
flags
,
int
ioflags
,
cred_t
*
credp
)
{
xfs_inode_t
*
ip
=
XFS_BHVTOI
(
bdp
);
xfs_mount_t
*
mp
=
ip
->
i_mount
;
ssize_t
ret
;
XFS_STATS_INC
(
xs_read_calls
);
if
(
XFS_FORCED_SHUTDOWN
(
ip
->
i_mount
))
return
-
EIO
;
xfs_ilock
(
ip
,
XFS_IOLOCK_SHARED
);
if
(
DM_EVENT_ENABLED
(
BHV_TO_VNODE
(
bdp
)
->
v_vfsp
,
ip
,
DM_EVENT_READ
)
&&
(
!
(
ioflags
&
IO_INVIS
)))
{
vrwlock_t
locktype
=
VRWLOCK_READ
;
int
error
;
error
=
XFS_SEND_DATA
(
mp
,
DM_EVENT_READ
,
BHV_TO_VNODE
(
bdp
),
infilp
->
f_pos
,
count
,
FILP_DELAY_FLAG
(
infilp
),
&
locktype
);
if
(
error
)
{
xfs_iunlock
(
ip
,
XFS_IOLOCK_SHARED
);
return
-
error
;
}
}
xfs_rw_enter_trace
(
XFS_SPLICE_READ_ENTER
,
&
ip
->
i_iocore
,
pipe
,
count
,
infilp
->
f_pos
,
ioflags
);
ret
=
generic_file_splice_read
(
infilp
,
pipe
,
count
,
flags
);
if
(
ret
>
0
)
if
(
ret
>
0
)
XFS_STATS_ADD
(
xs_read_bytes
,
ret
);
XFS_STATS_ADD
(
xs_read_bytes
,
ret
);
xfs_iunlock
(
ip
,
XFS_IOLOCK_SHARED
);
return
ret
;
}
ssize_t
xfs_splice_write
(
bhv_desc_t
*
bdp
,
struct
inode
*
pipe
,
struct
file
*
outfilp
,
size_t
count
,
int
flags
,
int
ioflags
,
cred_t
*
credp
)
{
xfs_inode_t
*
ip
=
XFS_BHVTOI
(
bdp
);
xfs_mount_t
*
mp
=
ip
->
i_mount
;
ssize_t
ret
;
XFS_STATS_INC
(
xs_write_calls
);
if
(
XFS_FORCED_SHUTDOWN
(
ip
->
i_mount
))
return
-
EIO
;
xfs_ilock
(
ip
,
XFS_IOLOCK_EXCL
);
if
(
DM_EVENT_ENABLED
(
BHV_TO_VNODE
(
bdp
)
->
v_vfsp
,
ip
,
DM_EVENT_WRITE
)
&&
(
!
(
ioflags
&
IO_INVIS
)))
{
vrwlock_t
locktype
=
VRWLOCK_WRITE
;
int
error
;
error
=
XFS_SEND_DATA
(
mp
,
DM_EVENT_WRITE
,
BHV_TO_VNODE
(
bdp
),
outfilp
->
f_pos
,
count
,
FILP_DELAY_FLAG
(
outfilp
),
&
locktype
);
if
(
error
)
{
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
return
-
error
;
}
}
xfs_rw_enter_trace
(
XFS_SPLICE_WRITE_ENTER
,
&
ip
->
i_iocore
,
pipe
,
count
,
outfilp
->
f_pos
,
ioflags
);
ret
=
generic_file_splice_write
(
pipe
,
outfilp
,
count
,
flags
);
if
(
ret
>
0
)
XFS_STATS_ADD
(
xs_write_bytes
,
ret
);
xfs_iunlock
(
ip
,
XFS_IOLOCK_EXCL
);
return
ret
;
return
ret
;
}
}
...
@@ -363,7 +434,7 @@ xfs_zero_last_block(
...
@@ -363,7 +434,7 @@ xfs_zero_last_block(
xfs_fsize_t
end_size
)
xfs_fsize_t
end_size
)
{
{
xfs_fileoff_t
last_fsb
;
xfs_fileoff_t
last_fsb
;
xfs_mount_t
*
mp
;
xfs_mount_t
*
mp
=
io
->
io_mount
;
int
nimaps
;
int
nimaps
;
int
zero_offset
;
int
zero_offset
;
int
zero_len
;
int
zero_len
;
...
@@ -373,8 +444,6 @@ xfs_zero_last_block(
...
@@ -373,8 +444,6 @@ xfs_zero_last_block(
ASSERT
(
ismrlocked
(
io
->
io_lock
,
MR_UPDATE
)
!=
0
);
ASSERT
(
ismrlocked
(
io
->
io_lock
,
MR_UPDATE
)
!=
0
);
mp
=
io
->
io_mount
;
zero_offset
=
XFS_B_FSB_OFFSET
(
mp
,
isize
);
zero_offset
=
XFS_B_FSB_OFFSET
(
mp
,
isize
);
if
(
zero_offset
==
0
)
{
if
(
zero_offset
==
0
)
{
/*
/*
...
@@ -405,10 +474,9 @@ xfs_zero_last_block(
...
@@ -405,10 +474,9 @@ xfs_zero_last_block(
* don't deadlock when the buffer cache calls back to us.
* don't deadlock when the buffer cache calls back to us.
*/
*/
XFS_IUNLOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
XFS_IUNLOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
loff
=
XFS_FSB_TO_B
(
mp
,
last_fsb
);
loff
=
XFS_FSB_TO_B
(
mp
,
last_fsb
);
zero_len
=
mp
->
m_sb
.
sb_blocksize
-
zero_offset
;
zero_len
=
mp
->
m_sb
.
sb_blocksize
-
zero_offset
;
error
=
xfs_iozero
(
ip
,
loff
+
zero_offset
,
zero_len
,
end_size
);
error
=
xfs_iozero
(
ip
,
loff
+
zero_offset
,
zero_len
,
end_size
);
XFS_ILOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
XFS_ILOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
...
@@ -441,7 +509,7 @@ xfs_zero_eof(
...
@@ -441,7 +509,7 @@ xfs_zero_eof(
xfs_fileoff_t
zero_count_fsb
;
xfs_fileoff_t
zero_count_fsb
;
xfs_fileoff_t
last_fsb
;
xfs_fileoff_t
last_fsb
;
xfs_extlen_t
buf_len_fsb
;
xfs_extlen_t
buf_len_fsb
;
xfs_mount_t
*
mp
;
xfs_mount_t
*
mp
=
io
->
io_mount
;
int
nimaps
;
int
nimaps
;
int
error
=
0
;
int
error
=
0
;
xfs_bmbt_irec_t
imap
;
xfs_bmbt_irec_t
imap
;
...
@@ -450,8 +518,6 @@ xfs_zero_eof(
...
@@ -450,8 +518,6 @@ xfs_zero_eof(
ASSERT
(
ismrlocked
(
io
->
io_iolock
,
MR_UPDATE
));
ASSERT
(
ismrlocked
(
io
->
io_iolock
,
MR_UPDATE
));
ASSERT
(
offset
>
isize
);
ASSERT
(
offset
>
isize
);
mp
=
io
->
io_mount
;
/*
/*
* First handle zeroing the block on which isize resides.
* First handle zeroing the block on which isize resides.
* We only zero a part of that block so it is handled specially.
* We only zero a part of that block so it is handled specially.
...
...
fs/xfs/linux-2.6/xfs_lrw.h
View file @
1b895840
...
@@ -60,6 +60,8 @@ struct xfs_iomap;
...
@@ -60,6 +60,8 @@ struct xfs_iomap;
#define XFS_IOMAP_ALLOC_ENTER 25
#define XFS_IOMAP_ALLOC_ENTER 25
#define XFS_IOMAP_ALLOC_MAP 26
#define XFS_IOMAP_ALLOC_MAP 26
#define XFS_IOMAP_UNWRITTEN 27
#define XFS_IOMAP_UNWRITTEN 27
#define XFS_SPLICE_READ_ENTER 28
#define XFS_SPLICE_WRITE_ENTER 29
extern
void
xfs_rw_enter_trace
(
int
,
struct
xfs_iocore
*
,
extern
void
xfs_rw_enter_trace
(
int
,
struct
xfs_iocore
*
,
void
*
,
size_t
,
loff_t
,
int
);
void
*
,
size_t
,
loff_t
,
int
);
extern
void
xfs_inval_cached_trace
(
struct
xfs_iocore
*
,
extern
void
xfs_inval_cached_trace
(
struct
xfs_iocore
*
,
...
@@ -78,6 +80,7 @@ extern int xfs_bmap(struct bhv_desc *, xfs_off_t, ssize_t, int,
...
@@ -78,6 +80,7 @@ extern int xfs_bmap(struct bhv_desc *, xfs_off_t, ssize_t, int,
struct
xfs_iomap
*
,
int
*
);
struct
xfs_iomap
*
,
int
*
);
extern
int
xfsbdstrat
(
struct
xfs_mount
*
,
struct
xfs_buf
*
);
extern
int
xfsbdstrat
(
struct
xfs_mount
*
,
struct
xfs_buf
*
);
extern
int
xfs_bdstrat_cb
(
struct
xfs_buf
*
);
extern
int
xfs_bdstrat_cb
(
struct
xfs_buf
*
);
extern
int
xfs_dev_is_read_only
(
struct
xfs_mount
*
,
char
*
);
extern
int
xfs_zero_eof
(
struct
vnode
*
,
struct
xfs_iocore
*
,
xfs_off_t
,
extern
int
xfs_zero_eof
(
struct
vnode
*
,
struct
xfs_iocore
*
,
xfs_off_t
,
xfs_fsize_t
,
xfs_fsize_t
);
xfs_fsize_t
,
xfs_fsize_t
);
...
@@ -90,7 +93,11 @@ extern ssize_t xfs_write(struct bhv_desc *, struct kiocb *,
...
@@ -90,7 +93,11 @@ extern ssize_t xfs_write(struct bhv_desc *, struct kiocb *,
extern
ssize_t
xfs_sendfile
(
struct
bhv_desc
*
,
struct
file
*
,
extern
ssize_t
xfs_sendfile
(
struct
bhv_desc
*
,
struct
file
*
,
loff_t
*
,
int
,
size_t
,
read_actor_t
,
loff_t
*
,
int
,
size_t
,
read_actor_t
,
void
*
,
struct
cred
*
);
void
*
,
struct
cred
*
);
extern
ssize_t
xfs_splice_read
(
struct
bhv_desc
*
,
struct
file
*
,
extern
int
xfs_dev_is_read_only
(
struct
xfs_mount
*
,
char
*
);
struct
inode
*
,
size_t
,
int
,
int
,
struct
cred
*
);
extern
ssize_t
xfs_splice_write
(
struct
bhv_desc
*
,
struct
inode
*
,
struct
file
*
,
size_t
,
int
,
int
,
struct
cred
*
);
#endif
/* __XFS_LRW_H__ */
#endif
/* __XFS_LRW_H__ */
fs/xfs/linux-2.6/xfs_vnode.h
View file @
1b895840
...
@@ -173,6 +173,12 @@ typedef ssize_t (*vop_write_t)(bhv_desc_t *, struct kiocb *,
...
@@ -173,6 +173,12 @@ typedef ssize_t (*vop_write_t)(bhv_desc_t *, struct kiocb *,
typedef
ssize_t
(
*
vop_sendfile_t
)(
bhv_desc_t
*
,
struct
file
*
,
typedef
ssize_t
(
*
vop_sendfile_t
)(
bhv_desc_t
*
,
struct
file
*
,
loff_t
*
,
int
,
size_t
,
read_actor_t
,
loff_t
*
,
int
,
size_t
,
read_actor_t
,
void
*
,
struct
cred
*
);
void
*
,
struct
cred
*
);
typedef
ssize_t
(
*
vop_splice_read_t
)(
bhv_desc_t
*
,
struct
file
*
,
struct
inode
*
,
size_t
,
int
,
int
,
struct
cred
*
);
typedef
ssize_t
(
*
vop_splice_write_t
)(
bhv_desc_t
*
,
struct
inode
*
,
struct
file
*
,
size_t
,
int
,
int
,
struct
cred
*
);
typedef
int
(
*
vop_ioctl_t
)(
bhv_desc_t
*
,
struct
inode
*
,
struct
file
*
,
typedef
int
(
*
vop_ioctl_t
)(
bhv_desc_t
*
,
struct
inode
*
,
struct
file
*
,
int
,
unsigned
int
,
void
__user
*
);
int
,
unsigned
int
,
void
__user
*
);
typedef
int
(
*
vop_getattr_t
)(
bhv_desc_t
*
,
struct
vattr
*
,
int
,
typedef
int
(
*
vop_getattr_t
)(
bhv_desc_t
*
,
struct
vattr
*
,
int
,
...
@@ -231,6 +237,8 @@ typedef struct vnodeops {
...
@@ -231,6 +237,8 @@ typedef struct vnodeops {
vop_read_t
vop_read
;
vop_read_t
vop_read
;
vop_write_t
vop_write
;
vop_write_t
vop_write
;
vop_sendfile_t
vop_sendfile
;
vop_sendfile_t
vop_sendfile
;
vop_splice_read_t
vop_splice_read
;
vop_splice_write_t
vop_splice_write
;
vop_ioctl_t
vop_ioctl
;
vop_ioctl_t
vop_ioctl
;
vop_getattr_t
vop_getattr
;
vop_getattr_t
vop_getattr
;
vop_setattr_t
vop_setattr
;
vop_setattr_t
vop_setattr
;
...
@@ -276,6 +284,10 @@ typedef struct vnodeops {
...
@@ -276,6 +284,10 @@ typedef struct vnodeops {
rv = _VOP_(vop_write, vp)((vp)->v_fbhv,file,iov,segs,offset,ioflags,cr)
rv = _VOP_(vop_write, vp)((vp)->v_fbhv,file,iov,segs,offset,ioflags,cr)
#define VOP_SENDFILE(vp,f,off,ioflags,cnt,act,targ,cr,rv) \
#define VOP_SENDFILE(vp,f,off,ioflags,cnt,act,targ,cr,rv) \
rv = _VOP_(vop_sendfile, vp)((vp)->v_fbhv,f,off,ioflags,cnt,act,targ,cr)
rv = _VOP_(vop_sendfile, vp)((vp)->v_fbhv,f,off,ioflags,cnt,act,targ,cr)
#define VOP_SPLICE_READ(vp,f,pipe,cnt,fl,iofl,cr,rv) \
rv = _VOP_(vop_splice_read, vp)((vp)->v_fbhv,f,pipe,cnt,fl,iofl,cr)
#define VOP_SPLICE_WRITE(vp,f,pipe,cnt,fl,iofl,cr,rv) \
rv = _VOP_(vop_splice_write, vp)((vp)->v_fbhv,f,pipe,cnt,fl,iofl,cr)
#define VOP_BMAP(vp,of,sz,rw,b,n,rv) \
#define VOP_BMAP(vp,of,sz,rw,b,n,rv) \
rv = _VOP_(vop_bmap, vp)((vp)->v_fbhv,of,sz,rw,b,n)
rv = _VOP_(vop_bmap, vp)((vp)->v_fbhv,of,sz,rw,b,n)
#define VOP_OPEN(vp, cr, rv) \
#define VOP_OPEN(vp, cr, rv) \
...
...
fs/xfs/xfs_vnodeops.c
View file @
1b895840
...
@@ -4648,6 +4648,10 @@ vnodeops_t xfs_vnodeops = {
...
@@ -4648,6 +4648,10 @@ vnodeops_t xfs_vnodeops = {
.
vop_read
=
xfs_read
,
.
vop_read
=
xfs_read
,
#ifdef HAVE_SENDFILE
#ifdef HAVE_SENDFILE
.
vop_sendfile
=
xfs_sendfile
,
.
vop_sendfile
=
xfs_sendfile
,
#endif
#ifdef HAVE_SPLICE
.
vop_splice_read
=
xfs_splice_read
,
.
vop_splice_write
=
xfs_splice_write
,
#endif
#endif
.
vop_write
=
xfs_write
,
.
vop_write
=
xfs_write
,
.
vop_ioctl
=
xfs_ioctl
,
.
vop_ioctl
=
xfs_ioctl
,
...
...
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