Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 288

kernel-2.6.18-238.el5.src.rpm

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