From: Jason Baron <jbaron@redhat.com> Date: Tue, 30 Jun 2009 11:15:57 -0400 Subject: [block] blktrace: fix recursive block remap tracepoint Message-id: 20090630151557.GC3128@redhat.com O-Subject: Re: [RHEL5.4 PATCH] blktrace: fix recursive block remap tracepoint Bugzilla: 502573 RH-Acked-by: Eric Sandeen <sandeen@redhat.com> RH-Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> RH-Acked-by: Jeff Moyer <jmoyer@redhat.com> hi, During 5.4 development, we introduced a block remap tracepoint, whose register function inlucded that remap tracpoint embedded in it. Thus, we got into a loop. This patch simply removes that loop by registering the proper function with the block remap tracepoint. I've verified the fix with some basic blktrace testing. Prior to the fix the kernel panic'd, with the fix blktrace ran to completion as expected. Resolves bz #502573. thanks, -Jason diff --git a/block/blktrace.c b/block/blktrace.c index 6f190d2..13f17ec 100644 --- a/block/blktrace.c +++ b/block/blktrace.c @@ -793,8 +793,8 @@ static void blk_add_trace_split(struct request_queue *q, struct bio *bio, * it spans a stripe (or similar). Add a trace for that action. * **/ -static void __blk_add_trace_remap(struct request_queue *q, struct bio *bio, - dev_t dev, sector_t from, sector_t to) +void blk_add_trace_remap(struct request_queue *q, struct bio *bio, + dev_t dev, sector_t from, sector_t to) { struct blk_trace *bt = q->blk_trace; struct blk_io_trace_remap r; @@ -809,6 +809,8 @@ static void __blk_add_trace_remap(struct request_queue *q, struct bio *bio, !bio_flagged(bio, BIO_UPTODATE), sizeof(r), &r); } +EXPORT_SYMBOL_GPL(blk_add_trace_remap); + void blk_add_trace_bio(struct request_queue *q, struct bio *bio, u32 what) { /* @@ -997,7 +999,7 @@ error: static void blk_unregister_tracepoints(void) { - unregister_trace_block_remap(__blk_add_trace_remap); + unregister_trace_block_remap(blk_add_trace_remap); unregister_trace_block_split(blk_add_trace_split); unregister_trace_block_unplug_io(blk_add_trace_unplug_io); unregister_trace_block_unplug_timer(blk_add_trace_unplug_timer); diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h index 399c8cc..c173e38 100644 --- a/include/linux/blktrace_api.h +++ b/include/linux/blktrace_api.h @@ -147,11 +147,8 @@ extern void blk_add_trace_generic(struct request_queue *q, struct bio *bio, int rw, u32 what); extern void blk_add_trace_pdu_int(struct request_queue *q, u32 what, struct bio *bio, unsigned int pdu); -static inline void blk_add_trace_remap(struct request_queue *q, struct bio *bio, - dev_t dev, sector_t from, sector_t to) -{ - trace_block_remap(q, bio, dev, from, to); -} +extern void blk_add_trace_remap(struct request_queue *q, struct bio *bio, + dev_t dev, sector_t from, sector_t to); /** * blk_add_driver_data - Add binary message with driver-specific data