diff options
| author | Tejun Heo <tj@kernel.org> | 2013-01-11 13:06:37 -0800 | 
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2013-01-14 15:00:36 +0100 | 
| commit | 9fb0a7da0c528d9bd49b597aa63b1fe2216c7203 (patch) | |
| tree | 146b065709010fd41f4a48e8a494b65b965fc0e8 /fs/fs-writeback.c | |
| parent | 5305cb830834549b9203ad4d009ad5483c5e293f (diff) | |
| download | olio-linux-3.10-9fb0a7da0c528d9bd49b597aa63b1fe2216c7203.tar.xz olio-linux-3.10-9fb0a7da0c528d9bd49b597aa63b1fe2216c7203.zip  | |
writeback: add more tracepoints
Add tracepoints for page dirtying, writeback_single_inode start, inode
dirtying and writeback.  For the latter two inode events, a pair of
events are defined to denote start and end of the operations (the
starting one has _start suffix and the one w/o suffix happens after
the operation is complete).  These inode ops are FS specific and can
be non-trivial and having enclosing tracepoints is useful for external
tracers.
This is part of tracepoint additions to improve visiblity into
dirtying / writeback operations for io tracer and userland.
v2: writeback_dirty_inode[_start] TPs may be called for files on
    pseudo FSes w/ unregistered bdi.  Check whether bdi->dev is %NULL
    before dereferencing.
v3: buffer dirtying moved to a block TP.
Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'fs/fs-writeback.c')
| -rw-r--r-- | fs/fs-writeback.c | 16 | 
1 files changed, 14 insertions, 2 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 310972b72a6..359494ea1bd 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -318,8 +318,14 @@ static void queue_io(struct bdi_writeback *wb, struct wb_writeback_work *work)  static int write_inode(struct inode *inode, struct writeback_control *wbc)  { -	if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode)) -		return inode->i_sb->s_op->write_inode(inode, wbc); +	int ret; + +	if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode)) { +		trace_writeback_write_inode_start(inode, wbc); +		ret = inode->i_sb->s_op->write_inode(inode, wbc); +		trace_writeback_write_inode(inode, wbc); +		return ret; +	}  	return 0;  } @@ -450,6 +456,8 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)  	WARN_ON(!(inode->i_state & I_SYNC)); +	trace_writeback_single_inode_start(inode, wbc, nr_to_write); +  	ret = do_writepages(mapping, wbc);  	/* @@ -1150,8 +1158,12 @@ void __mark_inode_dirty(struct inode *inode, int flags)  	 * dirty the inode itself  	 */  	if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { +		trace_writeback_dirty_inode_start(inode, flags); +  		if (sb->s_op->dirty_inode)  			sb->s_op->dirty_inode(inode, flags); + +		trace_writeback_dirty_inode(inode, flags);  	}  	/*  |