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
00d9eb99
Commit
00d9eb99
authored
Jan 09, 2004
by
Nathan Scott
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[XFS] Add some IO path tracing, move inval_cached_pages to a better home to help.
SGI Modid: 2.5.x-xfs:slinx:160171a
parent
d01cc5eb
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
164 additions
and
109 deletions
+164
-109
fs/xfs/linux/xfs_lrw.c
fs/xfs/linux/xfs_lrw.c
+124
-3
fs/xfs/linux/xfs_lrw.h
fs/xfs/linux/xfs_lrw.h
+38
-0
fs/xfs/xfs_rw.c
fs/xfs/xfs_rw.c
+1
-52
fs/xfs/xfs_rw.h
fs/xfs/xfs_rw.h
+1
-54
No files found.
fs/xfs/linux/xfs_lrw.c
View file @
00d9eb99
...
...
@@ -75,6 +75,71 @@
#include <linux/capability.h>
#if defined(XFS_RW_TRACE)
void
xfs_rw_enter_trace
(
int
tag
,
xfs_iocore_t
*
io
,
const
struct
iovec
*
iovp
,
size_t
segs
,
loff_t
offset
,
int
ioflags
)
{
xfs_inode_t
*
ip
=
XFS_IO_INODE
(
io
);
if
(
ip
->
i_rwtrace
==
NULL
)
return
;
ktrace_enter
(
ip
->
i_rwtrace
,
(
void
*
)(
unsigned
long
)
tag
,
(
void
*
)
ip
,
(
void
*
)((
unsigned
long
)((
ip
->
i_d
.
di_size
>>
32
)
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)(
ip
->
i_d
.
di_size
&
0xffffffff
)),
(
void
*
)(
__psint_t
)
iovp
,
(
void
*
)((
unsigned
long
)
segs
),
(
void
*
)((
unsigned
long
)((
offset
>>
32
)
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)(
offset
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)
ioflags
),
(
void
*
)((
unsigned
long
)((
io
->
io_new_size
>>
32
)
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)(
io
->
io_new_size
&
0xffffffff
)),
(
void
*
)
NULL
,
(
void
*
)
NULL
,
(
void
*
)
NULL
,
(
void
*
)
NULL
,
(
void
*
)
NULL
);
}
void
xfs_inval_cached_trace
(
xfs_iocore_t
*
io
,
xfs_off_t
offset
,
xfs_off_t
len
,
xfs_off_t
first
,
xfs_off_t
last
)
{
xfs_inode_t
*
ip
=
XFS_IO_INODE
(
io
);
if
(
ip
->
i_rwtrace
==
NULL
)
return
;
ktrace_enter
(
ip
->
i_rwtrace
,
(
void
*
)(
__psint_t
)
XFS_INVAL_CACHED
,
(
void
*
)
ip
,
(
void
*
)((
unsigned
long
)((
offset
>>
32
)
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)(
offset
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)((
len
>>
32
)
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)(
len
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)((
first
>>
32
)
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)(
first
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)((
last
>>
32
)
&
0xffffffff
)),
(
void
*
)((
unsigned
long
)(
last
&
0xffffffff
)),
(
void
*
)
NULL
,
(
void
*
)
NULL
,
(
void
*
)
NULL
,
(
void
*
)
NULL
,
(
void
*
)
NULL
,
(
void
*
)
NULL
);
}
#endif
/*
* xfs_iozero
*
...
...
@@ -142,6 +207,59 @@ xfs_iozero(
return
(
-
status
);
}
/*
* xfs_inval_cached_pages
*
* This routine is responsible for keeping direct I/O and buffered I/O
* somewhat coherent. From here we make sure that we're at least
* temporarily holding the inode I/O lock exclusively and then call
* the page cache to flush and invalidate any cached pages. If there
* are no cached pages this routine will be very quick.
*/
void
xfs_inval_cached_pages
(
vnode_t
*
vp
,
xfs_iocore_t
*
io
,
xfs_off_t
offset
,
int
write
,
int
relock
)
{
xfs_mount_t
*
mp
;
if
(
!
VN_CACHED
(
vp
))
{
return
;
}
mp
=
io
->
io_mount
;
/*
* We need to get the I/O lock exclusively in order
* to safely invalidate pages and mappings.
*/
if
(
relock
)
{
XFS_IUNLOCK
(
mp
,
io
,
XFS_IOLOCK_SHARED
);
XFS_ILOCK
(
mp
,
io
,
XFS_IOLOCK_EXCL
);
}
/* Writing beyond EOF creates a hole that must be zeroed */
if
(
write
&&
(
offset
>
XFS_SIZE
(
mp
,
io
)))
{
xfs_fsize_t
isize
;
XFS_ILOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
isize
=
XFS_SIZE
(
mp
,
io
);
if
(
offset
>
isize
)
{
xfs_zero_eof
(
vp
,
io
,
offset
,
isize
,
offset
);
}
XFS_IUNLOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
}
xfs_inval_cached_trace
(
io
,
offset
,
-
1
,
ctooff
(
offtoct
(
offset
)),
-
1
);
VOP_FLUSHINVAL_PAGES
(
vp
,
ctooff
(
offtoct
(
offset
)),
-
1
,
FI_REMAPF_LOCKED
);
if
(
relock
)
{
XFS_ILOCK_DEMOTE
(
mp
,
io
,
XFS_IOLOCK_EXCL
);
}
}
ssize_t
/* bytes read, or (-) error */
xfs_read
(
bhv_desc_t
*
bdp
,
...
...
@@ -684,9 +802,13 @@ xfs_write(
retry:
if
(
ioflags
&
IO_ISDIRECT
)
{
xfs_inval_cached_pages
(
vp
,
&
xip
->
i_iocore
,
*
offset
,
1
,
1
);
xfs_inval_cached_pages
(
vp
,
io
,
*
offset
,
1
,
1
);
xfs_rw_enter_trace
(
XFS_DIOWR_ENTER
,
io
,
iovp
,
segs
,
*
offset
,
ioflags
);
}
else
{
xfs_rw_enter_trace
(
XFS_WRITE_ENTER
,
io
,
iovp
,
segs
,
*
offset
,
ioflags
);
}
ret
=
generic_file_aio_write_nolock
(
iocb
,
iovp
,
segs
,
offset
);
if
((
ret
==
-
ENOSPC
)
&&
...
...
@@ -702,7 +824,6 @@ xfs_write(
xfs_rwlock
(
bdp
,
locktype
);
*
offset
=
xip
->
i_d
.
di_size
;
goto
retry
;
}
if
(
*
offset
>
xip
->
i_d
.
di_size
)
{
...
...
fs/xfs/linux/xfs_lrw.h
View file @
00d9eb99
...
...
@@ -41,7 +41,43 @@ struct xfs_bmbt_irec;
struct
page_buf_s
;
struct
page_buf_bmap_s
;
#if defined(XFS_RW_TRACE)
/*
* Defines for the trace mechanisms in xfs_lrw.c.
*/
#define XFS_RW_KTRACE_SIZE 64
#define XFS_STRAT_KTRACE_SIZE 64
#define XFS_STRAT_GTRACE_SIZE 512
#define XFS_READ_ENTER 1
#define XFS_WRITE_ENTER 2
#define XFS_IOMAP_READ_ENTER 3
#define XFS_IOMAP_WRITE_ENTER 4
#define XFS_IOMAP_READ_MAP 5
#define XFS_IOMAP_WRITE_MAP 6
#define XFS_IOMAP_WRITE_NOSPACE 7
#define XFS_ITRUNC_START 8
#define XFS_ITRUNC_FINISH1 9
#define XFS_ITRUNC_FINISH2 10
#define XFS_CTRUNC1 11
#define XFS_CTRUNC2 12
#define XFS_CTRUNC3 13
#define XFS_CTRUNC4 14
#define XFS_CTRUNC5 15
#define XFS_CTRUNC6 16
#define XFS_BUNMAPI 17
#define XFS_INVAL_CACHED 18
#define XFS_DIORD_ENTER 19
#define XFS_DIOWR_ENTER 20
extern
void
xfs_rw_enter_trace
(
int
,
struct
xfs_iocore
*
,
const
struct
iovec
*
,
int
,
loff_t
,
int
);
extern
void
xfs_inval_cached_trace
(
struct
xfs_iocore
*
,
xfs_off_t
,
xfs_off_t
,
xfs_off_t
,
xfs_off_t
);
#else
#define xfs_rw_enter_trace(tag, io, iovec, segs, offset, ioflags)
#define xfs_inval_cached_trace(io, offset, len, first, last)
#endif
/*
* Maximum count of bmaps used by read and write paths.
*/
...
...
@@ -54,6 +90,8 @@ extern int xfs_bdstrat_cb(struct page_buf_s *);
extern
int
xfs_zero_eof
(
struct
vnode
*
,
struct
xfs_iocore
*
,
xfs_off_t
,
xfs_fsize_t
,
xfs_fsize_t
);
extern
void
xfs_inval_cached_pages
(
struct
vnode
*
,
struct
xfs_iocore
*
,
xfs_off_t
,
int
,
int
);
extern
ssize_t
xfs_read
(
struct
bhv_desc
*
,
struct
kiocb
*
,
const
struct
iovec
*
,
unsigned
int
,
loff_t
*
,
int
,
struct
cred
*
);
...
...
fs/xfs/xfs_rw.c
View file @
00d9eb99
/*
* Copyright (c) 2000-200
2
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 2000-200
3
Silicon Graphics, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
...
...
@@ -351,54 +351,3 @@ xfs_bwrite(
}
return
(
error
);
}
/*
* xfs_inval_cached_pages()
* This routine is responsible for keeping direct I/O and buffered I/O
* somewhat coherent. From here we make sure that we're at least
* temporarily holding the inode I/O lock exclusively and then call
* the page cache to flush and invalidate any cached pages. If there
* are no cached pages this routine will be very quick.
*/
void
xfs_inval_cached_pages
(
vnode_t
*
vp
,
xfs_iocore_t
*
io
,
xfs_off_t
offset
,
int
write
,
int
relock
)
{
xfs_mount_t
*
mp
;
if
(
!
VN_CACHED
(
vp
))
{
return
;
}
mp
=
io
->
io_mount
;
/*
* We need to get the I/O lock exclusively in order
* to safely invalidate pages and mappings.
*/
if
(
relock
)
{
XFS_IUNLOCK
(
mp
,
io
,
XFS_IOLOCK_SHARED
);
XFS_ILOCK
(
mp
,
io
,
XFS_IOLOCK_EXCL
);
}
/* Writing beyond EOF creates a hole that must be zeroed */
if
(
write
&&
(
offset
>
XFS_SIZE
(
mp
,
io
)))
{
xfs_fsize_t
isize
;
XFS_ILOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
isize
=
XFS_SIZE
(
mp
,
io
);
if
(
offset
>
isize
)
{
xfs_zero_eof
(
vp
,
io
,
offset
,
isize
,
offset
);
}
XFS_IUNLOCK
(
mp
,
io
,
XFS_ILOCK_EXCL
|
XFS_EXTSIZE_RD
);
}
VOP_FLUSHINVAL_PAGES
(
vp
,
ctooff
(
offtoct
(
offset
)),
-
1
,
FI_REMAPF_LOCKED
);
if
(
relock
)
{
XFS_ILOCK_DEMOTE
(
mp
,
io
,
XFS_IOLOCK_EXCL
);
}
}
fs/xfs/xfs_rw.h
View file @
00d9eb99
/*
* Copyright (c) 2000-200
2
Silicon Graphics, Inc. All Rights Reserved.
* Copyright (c) 2000-200
3
Silicon Graphics, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
...
...
@@ -32,16 +32,9 @@
#ifndef __XFS_RW_H__
#define __XFS_RW_H__
struct
bhv_desc
;
struct
bmapval
;
struct
xfs_buf
;
struct
cred
;
struct
uio
;
struct
vnode
;
struct
xfs_inode
;
struct
xfs_iocore
;
struct
xfs_mount
;
struct
xfs_trans
;
/*
* Maximum count of bmaps used by read and write paths.
...
...
@@ -90,44 +83,6 @@ xfs_daddr_t xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb);
XFS_FSB_TO_BB((io)->io_mount, (fsb)) : \
XFS_FSB_TO_DADDR((io)->io_mount, (fsb)))
/*
* Defines for the trace mechanisms in xfs_rw.c.
*/
#define XFS_RW_KTRACE_SIZE 64
#define XFS_STRAT_KTRACE_SIZE 64
#define XFS_STRAT_GTRACE_SIZE 512
#define XFS_READ_ENTER 1
#define XFS_WRITE_ENTER 2
#define XFS_IOMAP_READ_ENTER 3
#define XFS_IOMAP_WRITE_ENTER 4
#define XFS_IOMAP_READ_MAP 5
#define XFS_IOMAP_WRITE_MAP 6
#define XFS_IOMAP_WRITE_NOSPACE 7
#define XFS_ITRUNC_START 8
#define XFS_ITRUNC_FINISH1 9
#define XFS_ITRUNC_FINISH2 10
#define XFS_CTRUNC1 11
#define XFS_CTRUNC2 12
#define XFS_CTRUNC3 13
#define XFS_CTRUNC4 14
#define XFS_CTRUNC5 15
#define XFS_CTRUNC6 16
#define XFS_BUNMAPI 17
#define XFS_INVAL_CACHED 18
#define XFS_DIORD_ENTER 19
#define XFS_DIOWR_ENTER 20
#if defined(XFS_ALL_TRACE)
#define XFS_RW_TRACE
#define XFS_STRAT_TRACE
#endif
#if !defined(DEBUG)
#undef XFS_RW_TRACE
#undef XFS_STRAT_TRACE
#endif
/*
* Prototypes for functions in xfs_rw.c.
*/
...
...
@@ -141,14 +96,6 @@ xfs_bwrite(
struct
xfs_mount
*
mp
,
struct
xfs_buf
*
bp
);
void
xfs_inval_cached_pages
(
struct
vnode
*
vp
,
struct
xfs_iocore
*
io
,
xfs_off_t
offset
,
int
write
,
int
relock
);
int
xfs_bioerror
(
struct
xfs_buf
*
b
);
...
...
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