1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2005 Peter Ho
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License Version 2 as
6 * published by the Free Software Foundation;
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
29 #include <ltt/event.h>
31 #include <ltt/trace.h>
32 #include <ltt/facility.h>
33 #include <lttv/module.h>
34 #include <lttv/hook.h>
35 #include <lttv/tracecontext.h>
36 #include <lttv/state.h>
37 #include <lttv/filter.h>
38 #include <lttvwindow/lttvwindow.h>
41 #include "hDiskPerformanceInsert.xpm"
44 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
45 #define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
46 #define TRACE_NUMBER 0
61 LTTV_READ_OPERATION
= 1,
65 typedef struct _DiskPerformanceData
{
69 LttvHooks
* hooks_trace_after
;
71 LttvHooks
* hooks_trace_before
;
73 TimeWindow time_window
;
75 GtkWidget
* scroll_win
;
77 /* Model containing list data */
78 GtkListStore
*store_m
;
82 /* Widget to display the data in a columned list */
85 /* Selection handler */
86 GtkTreeSelection
*select_c
;
90 LttvHooksById
* event_by_id_hooks
;
92 } DiskPerformanceData
;
95 typedef struct _lttv_block
{
101 typedef struct _lttv_total_block
{
103 guint64 total_bytes_read
;
104 guint num_read_operations
;
105 guint64 total_bytes_written
;
106 guint num_write_operations
;
110 GSList
*g_disk_data_list
= NULL
;
115 GQuark LTT_FACILITY_BLOCK
;
118 GQuark LTT_EVENT_BLOCK_READ
;
119 GQuark LTT_EVENT_BLOCK_WRITE
;
121 static DiskPerformanceData
*disk_performance_data(Tab
*tab
);
122 static void disk_destroy_walk(gpointer data
, gpointer user_data
);
123 static gboolean
disk_show(void *hook_data
, void *call_data
);
124 static gboolean
trace_header(void *hook_data
, void *call_data
);
125 static gboolean
disk_update_time_window(void * hook_data
, void * call_data
);
126 static void request_event( DiskPerformanceData
*disk_performance
);
127 void gui_disperformance_free(DiskPerformanceData
*event_viewer_data
);
128 static void get_event_detail(LttEvent
*e
, lttv_block
* disk_data
);
129 static char * major_minor_to_diskname( lttv_block
* disk_data
);
130 static void sum_data(char* diskname
, guint size
, enum operation_t opt
, GArray
*disk_array
);
131 static GtkWidget
*disk_performance(Tab
* tab
);
133 static gboolean
block_read_callback(void *hook_data
, void *call_data
);
135 static gboolean
block_write_callback(void *hook_data
, void *call_data
);
138 static gboolean
disk_show(void *hook_data
, void *call_data
){
141 lttv_total_block element
;
143 LttTime time_interval
;
144 guint64 time_interval_64
;
145 guint64 temp_variable
;
146 guint64 bytes_read_per_sec
, bytes_written_per_sec
;
147 g_info(" diskperformance: disk_show() \n");
148 DiskPerformanceData
*disk_performance
= (DiskPerformanceData
*)hook_data
;
149 GArray
*disk_array
= disk_performance
->disk_array
;
150 time_interval
= ltt_time_sub(disk_performance
->time_window
.end_time
, disk_performance
->time_window
.start_time
);
152 time_interval_64
= time_interval
.tv_sec
;
153 time_interval_64
*= NANOSECONDS_PER_SECOND
;
154 time_interval_64
+= time_interval
.tv_nsec
;
155 gtk_list_store_clear(disk_performance
->store_m
);
156 for(i
= 0; i
< disk_array
->len
; i
++){
158 element
= g_array_index(disk_array
,lttv_total_block
,i
);
159 temp_variable
= element
.total_bytes_read
* NANOSECONDS_PER_SECOND
;
160 bytes_read_per_sec
= (guint64
) temp_variable
/ time_interval_64
;
162 temp_variable
= element
.total_bytes_written
* NANOSECONDS_PER_SECOND
;
163 bytes_written_per_sec
= (guint64
) temp_variable
/ time_interval_64
;
165 gtk_list_store_append (disk_performance
->store_m
, &iter
);
166 gtk_list_store_set (disk_performance
->store_m
, &iter
,
167 DISKNAME_COLUMN
, element
.diskname
,
168 BYTES_RD_COLUMN
, element
.total_bytes_read
,
169 BYTES_RD_SEC_COLUMN
,bytes_read_per_sec
,
170 NUM_RD_COLUMN
, element
.num_read_operations
,
171 BYTES_WR_COLUMN
, element
.total_bytes_written
,
172 BYTES_WR_SEC_COLUMN
, bytes_written_per_sec
,
173 NUM_WR_COLUMN
, element
.num_write_operations
,
177 if(disk_performance
->disk_array
->len
)
178 g_array_remove_range (disk_performance
->disk_array
,0,disk_performance
->disk_array
->len
);
182 static gboolean
trace_header(void *hook_data
, void *call_data
){
187 static gboolean
disk_update_time_window(void * hook_data
, void * call_data
){
189 DiskPerformanceData
*disk_performance
= (DiskPerformanceData
*) hook_data
;
190 const TimeWindowNotifyData
*time_window_nofify_data
= ((const TimeWindowNotifyData
*)call_data
);
191 disk_performance
->time_window
= *time_window_nofify_data
->new_time_window
;
192 Tab
*tab
= disk_performance
->tab
;
193 lttvwindow_events_request_remove_all(tab
, disk_performance
);
194 request_event( disk_performance
);
200 void gui_disperformance_free(DiskPerformanceData
*eventdata
){
201 Tab
*tab
= eventdata
->tab
;
202 g_info("disperformance.c : gui_disperformance_free, %p", eventdata
);
203 g_info("%p, %p", eventdata
, tab
);
206 g_array_free (eventdata
->disk_array
, TRUE
);
208 lttvwindow_unregister_time_window_notify(tab
,
209 disk_update_time_window
,
212 lttvwindow_events_request_remove_all(eventdata
->tab
,
214 g_disk_data_list
= g_slist_remove(g_disk_data_list
, eventdata
);
217 g_info("disperformance.c : gui_disperformance_free end, %p", eventdata
);
225 void disk_destructor_full(DiskPerformanceData
*disk_data
)
228 if(GTK_IS_WIDGET(disk_data
->hbox_v
))
229 gtk_widget_destroy(disk_data
->hbox_v
);
233 static void disk_destroy_walk(gpointer data
, gpointer user_data
)
235 g_info("Walk destroy GUI disk performance Viewer");
236 disk_destructor_full((DiskPerformanceData
*)data
);
242 * This is the entry point of the viewer.
248 g_info("Init diskPerformance.c");
250 LTT_FACILITY_BLOCK
= g_quark_from_string("block");
251 LTT_EVENT_BLOCK_READ
= g_quark_from_string("read");
252 LTT_EVENT_BLOCK_WRITE
= g_quark_from_string("write");
254 lttvwindow_register_constructor("diskperformance",
256 "Insert Disk Performance",
257 hDiskPerformanceInsert_xpm
,
258 "Insert Disk Performance",
266 GtkWidget
*disk_performance(Tab
* tab
)
269 DiskPerformanceData
* disk_data
= disk_performance_data(tab
);
271 return disk_data
->hbox_v
;
277 * This function initializes the Event Viewer functionnality through the
280 DiskPerformanceData
*disk_performance_data(Tab
*tab
)
283 GtkTreeViewColumn
*column
;
284 GtkCellRenderer
*renderer
;
285 DiskPerformanceData
* disk_data
= g_new(DiskPerformanceData
,1) ;
287 g_info("enter disk_performance_data \n");
289 disk_data
->tab
= tab
;
290 disk_data
->time_window
= lttvwindow_get_time_window(tab
);
292 disk_data
->disk_array
= g_array_new(FALSE
, FALSE
, sizeof(lttv_total_block
));
294 lttvwindow_register_time_window_notify(tab
,
295 disk_update_time_window
,
298 disk_data
->scroll_win
= gtk_scrolled_window_new (NULL
, NULL
);
299 gtk_widget_show (disk_data
->scroll_win
);
300 gtk_scrolled_window_set_policy(
301 GTK_SCROLLED_WINDOW(disk_data
->scroll_win
),
302 GTK_POLICY_AUTOMATIC
, GTK_POLICY_AUTOMATIC
);
304 /* Create a model for storing the data list */
305 disk_data
->store_m
= gtk_list_store_new (
306 N_COLUMNS
, /* Total number of columns */
307 G_TYPE_STRING
, /* Diskname */
308 G_TYPE_INT64
, /* Bytes read */
309 G_TYPE_INT64
, /* Bytes read/sec */
311 G_TYPE_INT64
, /* bytes written */
312 G_TYPE_INT64
, /* bytes written/sec */
316 disk_data
->tree_v
= gtk_tree_view_new_with_model (GTK_TREE_MODEL (disk_data
->store_m
));
318 g_object_unref (G_OBJECT (disk_data
->store_m
));
320 renderer
= gtk_cell_renderer_text_new ();
322 column
= gtk_tree_view_column_new_with_attributes ("DiskName",
324 "text", DISKNAME_COLUMN
,
326 gtk_tree_view_column_set_alignment (column
, 0.0);
327 gtk_tree_view_column_set_fixed_width (column
, 45);
328 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data
->tree_v
), column
);
330 renderer
= gtk_cell_renderer_text_new ();
331 column
= gtk_tree_view_column_new_with_attributes ("BytesRead",
333 "text", BYTES_RD_COLUMN
,
335 gtk_tree_view_column_set_alignment (column
, 0.0);
336 gtk_tree_view_column_set_fixed_width (column
, 220);
337 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data
->tree_v
), column
);
339 renderer
= gtk_cell_renderer_text_new ();
340 column
= gtk_tree_view_column_new_with_attributes ("BytesRead/sec",
342 "text", BYTES_RD_SEC_COLUMN
,
344 gtk_tree_view_column_set_alignment (column
, 1.0);
345 gtk_tree_view_column_set_fixed_width (column
, 220);
346 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data
->tree_v
), column
);
348 renderer
= gtk_cell_renderer_text_new ();
349 column
= gtk_tree_view_column_new_with_attributes ("NumReadOperations",
351 "text",NUM_RD_COLUMN
,
353 gtk_tree_view_column_set_alignment (column
, 1.0);
354 gtk_tree_view_column_set_fixed_width (column
, 220);
355 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data
->tree_v
), column
);
357 renderer
= gtk_cell_renderer_text_new ();
358 column
= gtk_tree_view_column_new_with_attributes ("BytesWritten",
360 "text", BYTES_WR_COLUMN
,
362 gtk_tree_view_column_set_alignment (column
, 0.0);
363 gtk_tree_view_column_set_fixed_width (column
, 145);
364 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data
->tree_v
), column
);
366 renderer
= gtk_cell_renderer_text_new ();
367 column
= gtk_tree_view_column_new_with_attributes ("BytesWritten/sec",
369 "text", BYTES_WR_SEC_COLUMN
,
371 gtk_tree_view_column_set_alignment (column
, 1.0);
372 gtk_tree_view_column_set_fixed_width (column
, 220);
373 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data
->tree_v
), column
);
375 renderer
= gtk_cell_renderer_text_new ();
376 column
= gtk_tree_view_column_new_with_attributes ("NumWriteOperations",
378 "text",NUM_WR_COLUMN
,
380 gtk_tree_view_column_set_alignment (column
, 0.0);
381 gtk_tree_view_column_set_fixed_width (column
, 145);
382 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data
->tree_v
), column
);
384 disk_data
->select_c
= gtk_tree_view_get_selection (GTK_TREE_VIEW (disk_data
->tree_v
));
385 gtk_tree_selection_set_mode (disk_data
->select_c
, GTK_SELECTION_SINGLE
);
387 gtk_container_add (GTK_CONTAINER (disk_data
->scroll_win
), disk_data
->tree_v
);
389 disk_data
->hbox_v
= gtk_hbox_new(0, 0);
390 gtk_box_pack_start(GTK_BOX(disk_data
->hbox_v
), disk_data
->scroll_win
, TRUE
, TRUE
, 0);
392 gtk_widget_show(disk_data
->hbox_v
);
393 gtk_widget_show(disk_data
->tree_v
);
396 g_disk_data_list
= g_slist_append(g_disk_data_list
, disk_data
);
397 g_object_set_data_full(G_OBJECT(disk_data
->hbox_v
),
400 (GDestroyNotify
)gui_disperformance_free
);
402 request_event(disk_data
);
408 * For each trace in the traceset, this function:
409 * - calls lttv_trace_find_hook() & registers a hook function to event_by_id_hooks
410 * - registers a callback function to each hook
411 * - calls lttvwindow_events_request() to request data in a specific
412 * time interval to the main window
415 static void request_event(DiskPerformanceData
*disk_performance
)
417 guint i
, k
, l
, nb_trace
;
427 LttvTraceHookByFacility
*thf
;
429 LttvTracesetContext
*tsc
= lttvwindow_get_traceset_context(disk_performance
->tab
);
430 /* Get the traceset */
431 LttvTraceset
*traceset
= tsc
->ts
;
433 nb_trace
= lttv_traceset_number(traceset
);
435 for(i
= 0; i
<MIN(TRACE_NUMBER
+1, nb_trace
);i
++)
437 EventsRequest
*events_request
= g_new(EventsRequest
, 1);
439 hooks
= g_array_new(FALSE
, FALSE
, sizeof(LttvTraceHook
));
441 hooks
= g_array_set_size(hooks
, 2);
443 /* Get a trace state */
444 ts
= (LttvTraceState
*)tsc
->traces
[i
];
446 disk_performance
->event_by_id_hooks
= lttv_hooks_by_id_new();
447 /* Register event_by_id_hooks with a callback function */
448 ret
= lttv_trace_find_hook(ts
->parent
.t
,
449 LTT_FACILITY_BLOCK
, LTT_EVENT_BLOCK_READ
,
453 &g_array_index(hooks
, LttvTraceHook
, 0));
455 ret
= lttv_trace_find_hook(ts
->parent
.t
,
456 LTT_FACILITY_BLOCK
, LTT_EVENT_BLOCK_WRITE
,
458 block_write_callback
,
460 &g_array_index(hooks
, LttvTraceHook
, 1));
464 /*iterate through the facility list*/
465 for(k
= 0 ; k
< hooks
->len
; k
++)
467 hook
= &g_array_index(hooks
, LttvTraceHook
, k
);
468 for(l
=0; l
<hook
->fac_list
->len
; l
++)
470 thf
= g_array_index(hook
->fac_list
, LttvTraceHookByFacility
*, l
);
471 lttv_hooks_add(lttv_hooks_by_id_find(disk_performance
->event_by_id_hooks
, thf
->id
),
479 disk_performance
->hooks_trace_after
= lttv_hooks_new();
480 /* Registers a hook function */
481 lttv_hooks_add(disk_performance
->hooks_trace_after
, disk_show
, disk_performance
, LTTV_PRIO_DEFAULT
);
483 disk_performance
->hooks_trace_before
= lttv_hooks_new();
484 /* Registers a hook function */
485 lttv_hooks_add(disk_performance
->hooks_trace_before
, trace_header
, disk_performance
, LTTV_PRIO_DEFAULT
);
487 /* Initalize the EventsRequest structure */
488 events_request
->owner
= disk_performance
;
489 events_request
->viewer_data
= disk_performance
;
490 events_request
->servicing
= FALSE
;
491 events_request
->start_time
= disk_performance
->time_window
.start_time
;
492 events_request
->start_position
= NULL
;
493 events_request
->stop_flag
= FALSE
;
494 events_request
->end_time
= disk_performance
->time_window
.end_time
;
495 events_request
->num_events
= G_MAXUINT
;
496 events_request
->end_position
= NULL
;
497 events_request
->trace
= i
;
498 events_request
->hooks
= hooks
;
499 events_request
->before_chunk_traceset
= NULL
;
500 events_request
->before_chunk_trace
= disk_performance
->hooks_trace_before
;
501 events_request
->before_chunk_tracefile
= NULL
;
502 events_request
->event
= NULL
;
503 events_request
->event_by_id
= disk_performance
->event_by_id_hooks
;
504 events_request
->after_chunk_tracefile
= NULL
;
505 events_request
->after_chunk_trace
= NULL
;
506 events_request
->after_chunk_traceset
= NULL
;
507 events_request
->before_request
= NULL
;
508 events_request
->after_request
= disk_performance
->hooks_trace_after
;
510 lttvwindow_events_request(disk_performance
->tab
, events_request
);
516 * This function is called whenever a read event occurs.
519 static gboolean
block_read_callback(void *hook_data
, void *call_data
)
524 lttv_block block_read
;
527 LttvTracefileContext
*tfc
= (LttvTracefileContext
*)call_data
;
528 LttvTracefileState
*tfs
= (LttvTracefileState
*)call_data
;
529 DiskPerformanceData
*disk_performance
= (DiskPerformanceData
*)hook_data
;
530 GArray
*disk_array
= disk_performance
->disk_array
;
531 e
= ltt_tracefile_get_event(tfc
->tf
);
532 event_time
= ltt_event_time(e
);
533 cpu_id
= ltt_event_cpu_id(e
);
535 get_event_detail(e
, &block_read
);
536 diskname
= major_minor_to_diskname(&block_read
);
537 sum_data(diskname
, block_read
.size
,LTTV_READ_OPERATION
, disk_array
);
543 * This function is called whenever a write event occurs.
546 static gboolean
block_write_callback(void *hook_data
, void *call_data
)
551 lttv_block block_write
;
553 LttvTracefileContext
*tfc
= (LttvTracefileContext
*)call_data
;
554 LttvTracefileState
*tfs
= (LttvTracefileState
*)call_data
;
555 DiskPerformanceData
*disk_performance
= (DiskPerformanceData
*)hook_data
;
556 GArray
*disk_array
= disk_performance
->disk_array
;
557 e
= ltt_tracefile_get_event(tfc
->tf
);
558 event_time
= ltt_event_time(e
);
559 cpu_id
= ltt_event_cpu_id(e
);
561 get_event_detail(e
, &block_write
);
562 diskname
= major_minor_to_diskname(&block_write
);
563 sum_data(diskname
, block_write
.size
,LTTV_WRITE_OPERATION
, disk_array
);
569 * This function extracts the major, minor and size
572 static void get_event_detail(LttEvent
*e
, lttv_block
* disk_data
)
575 LttEventType
*event_type
;
578 event_type
= ltt_event_eventtype(e
);
579 num_fields
= ltt_eventtype_num_fields(event_type
);
581 for(i
= 0 ; i
< num_fields
; i
++)
583 element
= ltt_eventtype_field(event_type
,i
);
587 disk_data
->major_number
= ltt_event_get_long_unsigned(e
, element
);
591 disk_data
->minor_number
= ltt_event_get_long_unsigned(e
, element
);
594 disk_data
->size
= ltt_event_get_long_unsigned(e
, element
);
605 * This function calculates: the number of operations, the total bytes read or written,
606 * the average number of bytes read or written by sec.
608 static void sum_data(char* diskname
, guint size
, enum operation_t operation
, GArray
*disk_array
)
611 lttv_total_block data
;
612 lttv_total_block
*element
;
614 gboolean notFound
= FALSE
;
616 memset ((void*)&data
, 0,sizeof(lttv_total_block
));
618 if(disk_array
->len
== NO_ITEMS
){
619 strcpy(data
.diskname
, diskname
);
620 if(operation
== LTTV_READ_OPERATION
){
621 data
.total_bytes_read
= size
;
622 data
.num_read_operations
++;
625 data
.total_bytes_written
= size
;
626 data
.num_write_operations
++;
628 g_array_append_val (disk_array
, data
);
631 for(i
= 0; i
< disk_array
->len
; i
++){
632 element
= &g_array_index(disk_array
,lttv_total_block
,i
);
633 if(strcmp(element
->diskname
,diskname
) == 0){
634 if(operation
== LTTV_READ_OPERATION
){
635 element
->num_read_operations
++;
636 element
->total_bytes_read
+= size
;
639 element
->num_write_operations
++;
640 element
->total_bytes_written
+= size
;
646 strcpy(data
.diskname
, diskname
);
647 if(operation
== LTTV_READ_OPERATION
){
648 data
.total_bytes_read
= size
;
649 data
.num_read_operations
++;
652 data
.total_bytes_written
= size
;
653 data
.num_write_operations
++;
655 g_array_append_val (disk_array
, data
);
661 static void destroy()
663 g_info("Destroy diskPerformance");
664 g_slist_foreach(g_disk_data_list
, disk_destroy_walk
, NULL
);
665 g_slist_free(g_disk_data_list
);
667 lttvwindow_unregister_constructor(disk_performance
);
672 * This function convert the major and minor number to the corresponding disk.
673 * Data taken from Documentation/devices.txt of the kernel tree.
675 static char * major_minor_to_diskname( lttv_block
* disk_data
)
677 switch(disk_data
->major_number
)
680 case 3: /* First MFM, RLL and IDE hard disk/CD-ROM interface */
681 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
683 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
687 case 22: /*Second IDE hard disk/CD-ROM interface */
688 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
690 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
694 case 33: /* Third IDE hard disk/CD-ROM interface */
695 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
697 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
701 case 34: /* Fourth IDE hard disk/CD-ROM interface */
702 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
704 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
708 case 56: /* Fifth IDE hard disk/CD-ROM interface */
709 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
711 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
715 case 57: /* Sixth IDE hard disk/CD-ROM interface */
716 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
718 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
722 case 88: /* Seventh IDE hard disk/CD-ROM interface */
723 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
725 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
729 case 89: /* Eighth IDE hard disk/CD-ROM interface */
730 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
732 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
736 case 90: /* Ninth IDE hard disk/CD-ROM interface */
737 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
739 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
743 case 91: /* Tenth IDE hard disk/CD-ROM interface */
744 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 64))
746 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 128))
751 case 8: /* SCSI disk devices */
752 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
753 return "/dev/sda"; // First SCSI disk whole disk
755 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
756 return "/dev/sdb";// Second SCSI disk whole disk
758 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
759 return "/dev/sdc";// Third SCSI disk whole disk
761 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
762 return "/dev/sdd";// Fourth SCSI disk whole disk
764 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
765 return "/dev/sde";// Fifth SCSI disk whole disk
767 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
768 return "/dev/sdf";// Sixth SCSI disk whole disk
770 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
771 return "/dev/sdg";// seventh SCSI disk whole disk
773 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
774 return "/dev/sdh";// eighth SCSI disk whole disk
776 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
777 return "/dev/sdi";// 9th SCSI disk whole disk
779 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
780 return "/dev/sdj";// 10th SCSI disk whole disk
782 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
783 return "/dev/sdk";// 11th SCSI disk whole disk
785 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
786 return "/dev/sdl";// 12th SCSI disk whole disk
788 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
789 return "/dev/sdm";// 13th SCSI disk whole disk
791 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
792 return "/dev/sdn";// 14th SCSI disk whole disk
794 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
795 return "/dev/sdo";// 15th SCSI disk whole disk
797 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
798 return "/dev/sdp";// 16th SCSI disk whole disk
801 case 65: /* SCSI disk devices */
802 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
805 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
808 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
811 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
814 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
817 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
820 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
823 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
826 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
829 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
832 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
835 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
838 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
841 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
844 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
847 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
851 case 66: /* SCSI disk devices */
852 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
855 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
858 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
861 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
864 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
867 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
870 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
873 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
876 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
879 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
882 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
885 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
888 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
891 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
894 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
897 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
902 case 67: /* SCSI disk devices */
903 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
906 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
909 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
912 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
915 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
918 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
921 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
924 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
927 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
930 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
933 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
936 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
939 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
942 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
945 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
948 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
952 case 68 : /* SCSI disk devices */
953 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
956 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
959 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
962 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
965 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
968 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
971 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
974 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
977 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
980 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
983 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
986 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
989 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
992 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
995 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
998 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
1001 case 69 : /* SCSI disk devices */
1002 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
1005 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
1008 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
1011 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
1014 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
1017 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
1020 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
1023 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
1026 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
1029 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
1032 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
1035 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
1038 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
1041 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
1044 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
1047 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
1052 case 70 : /* SCSI disk devices */
1053 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
1056 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
1059 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
1062 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
1065 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
1068 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
1071 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
1074 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
1077 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
1080 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
1083 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
1086 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
1089 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
1092 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
1095 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
1098 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
1102 case 71: /* SCSI disk devices */
1103 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
1106 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
1109 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
1112 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
1115 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
1118 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
1121 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
1124 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
1127 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
1130 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
1133 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
1136 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
1139 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
1142 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
1145 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
1148 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
1152 case 128: /* SCSI disk devices */
1153 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
1156 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
1159 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
1162 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
1165 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
1168 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
1171 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
1174 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
1177 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
1180 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
1183 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
1186 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
1189 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
1192 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
1195 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
1198 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
1202 case 129: /* SCSI disk devices */
1203 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 16))
1206 if((disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 32))
1209 if((disk_data
->minor_number
>= 32) && (disk_data
->minor_number
< 48))
1212 if((disk_data
->minor_number
>= 48) && (disk_data
->minor_number
< 64))
1215 if((disk_data
->minor_number
>= 64) && (disk_data
->minor_number
< 80))
1218 if((disk_data
->minor_number
>= 80) && (disk_data
->minor_number
< 96))
1221 if((disk_data
->minor_number
>= 96) && (disk_data
->minor_number
< 112))
1224 if((disk_data
->minor_number
>= 112) && (disk_data
->minor_number
< 128))
1227 if((disk_data
->minor_number
>= 128) && (disk_data
->minor_number
< 144))
1230 if((disk_data
->minor_number
>= 144) && (disk_data
->minor_number
< 160))
1233 if((disk_data
->minor_number
>= 160) && (disk_data
->minor_number
< 176))
1236 if((disk_data
->minor_number
>= 176) && (disk_data
->minor_number
< 192))
1239 if((disk_data
->minor_number
>= 192) && (disk_data
->minor_number
< 208))
1242 if((disk_data
->minor_number
>= 208) && (disk_data
->minor_number
< 224))
1245 if((disk_data
->minor_number
>= 224) && (disk_data
->minor_number
< 240))
1248 if((disk_data
->minor_number
>= 240) && (disk_data
->minor_number
< 256))
1251 /*USB block devices*/
1253 if( (disk_data
->minor_number
>= 0) && (disk_data
->minor_number
< 8))
1255 if( (disk_data
->minor_number
>= 8) && (disk_data
->minor_number
< 16))
1257 if( (disk_data
->minor_number
>= 16) && (disk_data
->minor_number
< 24))
1265 LTTV_MODULE("diskperformance", "disk info view", \
1266 "Produce disk I/O performance", \
1267 init
, destroy
, "lttvwindow")