af56e9bb39e4d216997435ac299e6b6cebf4a09e
[lttv.git] /
1 /* This file is part of the Linux Trace Toolkit viewer
2 * Copyright (C) 2005 Peter Ho
3 *
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;
7 *
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.
12 *
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,
16 * MA 02111-1307, USA.
17 */
18
19
20 #include <math.h>
21
22 #include <glib.h>
23 #include <gtk/gtk.h>
24 #include <gdk/gdk.h>
25 #include <stdio.h>
26 #include <stdlib.h>
27 #include <string.h>
28 #include <ltt/ltt.h>
29 #include <ltt/event.h>
30 #include <ltt/type.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>
39 #include <lttvwindow/lttv_plugin_tab.h>
40 #include <ltt/time.h>
41
42 #include "hDiskPerformanceInsert.xpm"
43
44
45 #define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format)
46 #define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format)
47 // fixed #define TRACE_NUMBER 0
48 #define NO_ITEMS 0
49
50 enum{
51 DISKNAME_COLUMN,
52 BYTES_RD_COLUMN,
53 BYTES_RD_SEC_COLUMN,
54 NUM_RD_COLUMN,
55 BYTES_WR_COLUMN,
56 BYTES_WR_SEC_COLUMN,
57 NUM_WR_COLUMN,
58 N_COLUMNS
59 };
60
61 enum operation_t {
62 LTTV_READ_OPERATION = 1,
63 LTTV_WRITE_OPERATION
64 };
65
66 typedef struct _DiskPerformanceData {
67
68 Tab * tab;
69
70 LttvPluginTab *ptab;
71
72 LttvHooks * hooks_trace_after;
73
74 LttvHooks * hooks_trace_before;
75 /* time window */
76 TimeWindow time_window;
77
78 GtkWidget * scroll_win;
79
80 /* Model containing list data */
81 GtkListStore *store_m;
82
83 GtkWidget *hbox_v;
84
85 /* Widget to display the data in a columned list */
86 GtkWidget *tree_v;
87
88 /* Selection handler */
89 GtkTreeSelection *select_c;
90
91 GArray *disk_array;
92
93 LttvHooksById * event_by_id_hooks;
94
95 } DiskPerformanceData;
96
97
98 typedef struct _lttv_block {
99 guint major_number;
100 guint minor_number;
101 guint size;
102 } lttv_block;
103
104 typedef struct _lttv_total_block {
105 char diskname[10];
106 guint64 total_bytes_read;
107 guint num_read_operations;
108 guint64 total_bytes_written;
109 guint num_write_operations;
110
111 } lttv_total_block;
112
113 GSList *g_disk_data_list = NULL ;
114
115
116
117 /* facility */
118 GQuark LTT_FACILITY_BLOCK;
119
120 /* events */
121 GQuark LTT_EVENT_BLOCK_READ;
122 GQuark LTT_EVENT_BLOCK_WRITE;
123
124 static DiskPerformanceData *disk_performance_data(LttvPluginTab *ptab);
125 static void disk_destroy_walk(gpointer data, gpointer user_data);
126 static gboolean disk_show(void *hook_data, void *call_data);
127 static gboolean trace_header(void *hook_data, void *call_data);
128 static gboolean disk_update_time_window(void * hook_data, void * call_data);
129 static void request_event( DiskPerformanceData *disk_performance);
130 void gui_disperformance_free(DiskPerformanceData *event_viewer_data);
131 static void get_event_detail(LttEvent *e, lttv_block* disk_data);
132 static char * major_minor_to_diskname( lttv_block* disk_data);
133 static void sum_data(char* diskname, guint size, enum operation_t opt, GArray *disk_array);
134 static GtkWidget *disk_performance(LttvPlugin *plugin);
135
136 static gboolean block_read_callback(void *hook_data, void *call_data);
137
138 static gboolean block_write_callback(void *hook_data, void *call_data);
139
140
141 static gboolean disk_show(void *hook_data, void *call_data){
142
143 guint i;
144 lttv_total_block element;
145 GtkTreeIter iter;
146 LttTime time_interval;
147 guint64 time_interval_64;
148 guint64 temp_variable;
149 guint64 bytes_read_per_sec, bytes_written_per_sec;
150 g_info(" diskperformance: disk_show() \n");
151 DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
152 GArray *disk_array = disk_performance->disk_array;
153 time_interval = ltt_time_sub(disk_performance->time_window.end_time, disk_performance->time_window.start_time);
154
155 time_interval_64 = time_interval.tv_sec;
156 time_interval_64 *= NANOSECONDS_PER_SECOND;
157 time_interval_64 += time_interval.tv_nsec;
158 gtk_list_store_clear(disk_performance->store_m);
159 for(i = 0; i < disk_array->len; i++){
160
161 element = g_array_index(disk_array,lttv_total_block,i);
162 temp_variable = element.total_bytes_read * NANOSECONDS_PER_SECOND;
163 bytes_read_per_sec = (guint64) temp_variable / time_interval_64;
164
165 temp_variable = element.total_bytes_written * NANOSECONDS_PER_SECOND;
166 bytes_written_per_sec = (guint64) temp_variable / time_interval_64;
167
168 gtk_list_store_append (disk_performance->store_m, &iter);
169 gtk_list_store_set (disk_performance->store_m, &iter,
170 DISKNAME_COLUMN, element.diskname,
171 BYTES_RD_COLUMN, element.total_bytes_read,
172 BYTES_RD_SEC_COLUMN,bytes_read_per_sec,
173 NUM_RD_COLUMN, element.num_read_operations,
174 BYTES_WR_COLUMN, element.total_bytes_written,
175 BYTES_WR_SEC_COLUMN, bytes_written_per_sec,
176 NUM_WR_COLUMN, element.num_write_operations,
177 -1);
178
179 }
180 if(disk_performance->disk_array->len)
181 g_array_remove_range (disk_performance->disk_array,0,disk_performance->disk_array->len);
182 return FALSE;
183 }
184
185 static gboolean trace_header(void *hook_data, void *call_data){
186 return FALSE;
187 }
188
189
190 static gboolean disk_update_time_window(void * hook_data, void * call_data){
191
192 DiskPerformanceData *disk_performance = (DiskPerformanceData *) hook_data;
193 const TimeWindowNotifyData *time_window_nofify_data = ((const TimeWindowNotifyData *)call_data);
194 disk_performance->time_window = *time_window_nofify_data->new_time_window;
195 Tab *tab = disk_performance->tab;
196 lttvwindow_events_request_remove_all(tab, disk_performance);
197 request_event( disk_performance);
198
199
200 return FALSE;
201 }
202
203 void gui_disperformance_free(DiskPerformanceData *eventdata){
204 Tab *tab = eventdata->tab;
205 g_info("disperformance.c : gui_disperformance_free, %p", eventdata);
206 g_info("%p, %p", eventdata, tab);
207 if(tab != NULL)
208 {
209 g_array_free (eventdata->disk_array, TRUE);
210
211 lttvwindow_unregister_time_window_notify(tab,
212 disk_update_time_window,
213 eventdata);
214
215 lttvwindow_events_request_remove_all(eventdata->tab,
216 eventdata);
217 g_disk_data_list = g_slist_remove(g_disk_data_list, eventdata);
218 }
219 g_free(eventdata);
220 g_info("disperformance.c : gui_disperformance_free end, %p", eventdata);
221 }
222
223
224
225
226
227
228 void disk_destructor_full(DiskPerformanceData *disk_data)
229 {
230
231 if(GTK_IS_WIDGET(disk_data->hbox_v))
232 gtk_widget_destroy(disk_data->hbox_v);
233
234 }
235
236 static void disk_destroy_walk(gpointer data, gpointer user_data)
237 {
238 g_info("Walk destroy GUI disk performance Viewer");
239 disk_destructor_full((DiskPerformanceData*)data);
240 }
241 /**
242 * init function
243 *
244 *
245 * This is the entry point of the viewer.
246 *
247 */
248 static void init()
249 {
250
251 g_info("Init diskPerformance.c");
252
253 LTT_FACILITY_BLOCK = g_quark_from_string("block");
254 LTT_EVENT_BLOCK_READ = g_quark_from_string("read");
255 LTT_EVENT_BLOCK_WRITE = g_quark_from_string("write");
256
257 lttvwindow_register_constructor("diskperformance",
258 "/",
259 "Insert Disk Performance",
260 hDiskPerformanceInsert_xpm,
261 "Insert Disk Performance",
262 disk_performance);
263 }
264
265 /**
266 * Constructor hook
267 *
268 */
269 GtkWidget *disk_performance(LttvPlugin *plugin)
270 {
271 LttvPluginTab *ptab = LTTV_PLUGIN_TAB(plugin);
272 DiskPerformanceData* disk_data = disk_performance_data(ptab);
273 if(disk_data)
274 return disk_data->hbox_v;
275 else
276 return NULL;
277 }
278
279 /**
280 * This function initializes the Event Viewer functionnality through the
281 * GTK API.
282 */
283 DiskPerformanceData *disk_performance_data(LttvPluginTab *ptab)
284 {
285 LttTime end;
286 GtkTreeViewColumn *column;
287 GtkCellRenderer *renderer;
288 DiskPerformanceData* disk_data = g_new(DiskPerformanceData,1) ;
289
290 g_info("enter disk_performance_data \n");
291 Tab *tab = ptab->tab;
292 disk_data->tab = tab;
293 disk_data->ptab = ptab;
294 disk_data->time_window = lttvwindow_get_time_window(tab);
295
296 disk_data->disk_array = g_array_new(FALSE, FALSE, sizeof(lttv_total_block ));
297
298 lttvwindow_register_time_window_notify(tab,
299 disk_update_time_window,
300 disk_data);
301
302 disk_data->scroll_win = gtk_scrolled_window_new (NULL, NULL);
303 gtk_widget_show (disk_data->scroll_win);
304 gtk_scrolled_window_set_policy(
305 GTK_SCROLLED_WINDOW(disk_data->scroll_win),
306 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
307
308 /* Create a model for storing the data list */
309 disk_data->store_m = gtk_list_store_new (
310 N_COLUMNS, /* Total number of columns */
311 G_TYPE_STRING, /* Diskname */
312 G_TYPE_INT64, /* Bytes read */
313 G_TYPE_INT64, /* Bytes read/sec */
314 G_TYPE_INT,
315 G_TYPE_INT64, /* bytes written */
316 G_TYPE_INT64, /* bytes written/sec */
317 G_TYPE_INT
318 );
319
320 disk_data->tree_v = gtk_tree_view_new_with_model (GTK_TREE_MODEL (disk_data->store_m));
321
322 g_object_unref (G_OBJECT (disk_data->store_m));
323
324 renderer = gtk_cell_renderer_text_new ();
325
326 column = gtk_tree_view_column_new_with_attributes ("DiskName",
327 renderer,
328 "text", DISKNAME_COLUMN,
329 NULL);
330 gtk_tree_view_column_set_alignment (column, 0.0);
331 gtk_tree_view_column_set_fixed_width (column, 45);
332 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
333
334 renderer = gtk_cell_renderer_text_new ();
335 column = gtk_tree_view_column_new_with_attributes ("BytesRead",
336 renderer,
337 "text", BYTES_RD_COLUMN,
338 NULL);
339 gtk_tree_view_column_set_alignment (column, 0.0);
340 gtk_tree_view_column_set_fixed_width (column, 220);
341 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
342
343 renderer = gtk_cell_renderer_text_new ();
344 column = gtk_tree_view_column_new_with_attributes ("BytesRead/sec",
345 renderer,
346 "text", BYTES_RD_SEC_COLUMN,
347 NULL);
348 gtk_tree_view_column_set_alignment (column, 1.0);
349 gtk_tree_view_column_set_fixed_width (column, 220);
350 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
351
352 renderer = gtk_cell_renderer_text_new ();
353 column = gtk_tree_view_column_new_with_attributes ("NumReadOperations",
354 renderer,
355 "text",NUM_RD_COLUMN,
356 NULL);
357 gtk_tree_view_column_set_alignment (column, 1.0);
358 gtk_tree_view_column_set_fixed_width (column, 220);
359 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
360
361 renderer = gtk_cell_renderer_text_new ();
362 column = gtk_tree_view_column_new_with_attributes ("BytesWritten",
363 renderer,
364 "text", BYTES_WR_COLUMN,
365 NULL);
366 gtk_tree_view_column_set_alignment (column, 0.0);
367 gtk_tree_view_column_set_fixed_width (column, 145);
368 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
369
370 renderer = gtk_cell_renderer_text_new ();
371 column = gtk_tree_view_column_new_with_attributes ("BytesWritten/sec",
372 renderer,
373 "text", BYTES_WR_SEC_COLUMN,
374 NULL);
375 gtk_tree_view_column_set_alignment (column, 1.0);
376 gtk_tree_view_column_set_fixed_width (column, 220);
377 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
378
379 renderer = gtk_cell_renderer_text_new ();
380 column = gtk_tree_view_column_new_with_attributes ("NumWriteOperations",
381 renderer,
382 "text",NUM_WR_COLUMN,
383 NULL);
384 gtk_tree_view_column_set_alignment (column, 0.0);
385 gtk_tree_view_column_set_fixed_width (column, 145);
386 gtk_tree_view_append_column (GTK_TREE_VIEW (disk_data->tree_v), column);
387
388 disk_data->select_c = gtk_tree_view_get_selection (GTK_TREE_VIEW (disk_data->tree_v));
389 gtk_tree_selection_set_mode (disk_data->select_c, GTK_SELECTION_SINGLE);
390
391 gtk_container_add (GTK_CONTAINER (disk_data->scroll_win), disk_data->tree_v);
392
393 disk_data->hbox_v = gtk_hbox_new(0, 0);
394 gtk_box_pack_start(GTK_BOX(disk_data->hbox_v), disk_data->scroll_win, TRUE, TRUE, 0);
395
396 gtk_widget_show(disk_data->hbox_v);
397 gtk_widget_show(disk_data->tree_v);
398
399
400 g_disk_data_list = g_slist_append(g_disk_data_list, disk_data);
401 g_object_set_data_full(G_OBJECT(disk_data->hbox_v),
402 "disk_data",
403 disk_data,
404 (GDestroyNotify)gui_disperformance_free);
405
406 request_event(disk_data);
407 return disk_data;
408 }
409
410 /**
411 *
412 * For each trace in the traceset, this function:
413 * - calls lttv_trace_find_hook() & registers a hook function to event_by_id_hooks
414 * - registers a callback function to each hook
415 * - calls lttvwindow_events_request() to request data in a specific
416 * time interval to the main window
417 *
418 */
419 static void request_event(DiskPerformanceData *disk_performance)
420 {
421 guint i, k, l, nb_trace;
422
423 GArray *hooks;
424
425 guint ret;
426
427 LttvTraceHook *hook;
428
429 LttvTraceState *ts;
430
431 LttvTraceHookByFacility *thf;
432
433 LttvTracesetContext *tsc = lttvwindow_get_traceset_context(disk_performance->tab);
434 /* Get the traceset */
435 LttvTraceset *traceset = tsc->ts;
436
437 nb_trace = lttv_traceset_number(traceset);
438
439 //for(i = 0; i<MIN(TRACE_NUMBER+1, nb_trace);i++) {
440 for(i = 0 ; i < nb_trace ; i++) {
441 EventsRequest *events_request = g_new(EventsRequest, 1);
442
443 hooks = g_array_new(FALSE, FALSE, sizeof(LttvTraceHook));
444
445 hooks = g_array_set_size(hooks, 2);
446
447 /* Get a trace state */
448 ts = (LttvTraceState *)tsc->traces[i];
449
450 disk_performance->event_by_id_hooks = lttv_hooks_by_id_new();
451 /* Register event_by_id_hooks with a callback function */
452 ret = lttv_trace_find_hook(ts->parent.t,
453 LTT_FACILITY_BLOCK, LTT_EVENT_BLOCK_READ,
454 0, 0, 0,
455 block_read_callback,
456 disk_performance,
457 &g_array_index(hooks, LttvTraceHook, 0));
458
459 ret = lttv_trace_find_hook(ts->parent.t,
460 LTT_FACILITY_BLOCK, LTT_EVENT_BLOCK_WRITE,
461 0, 0, 0,
462 block_write_callback,
463 disk_performance,
464 &g_array_index(hooks, LttvTraceHook, 1));
465
466 g_assert(!ret);
467
468 /*iterate through the facility list*/
469 for(k = 0 ; k < hooks->len; k++)
470 {
471 hook = &g_array_index(hooks, LttvTraceHook, k);
472 for(l=0; l<hook->fac_list->len; l++)
473 {
474 thf = g_array_index(hook->fac_list, LttvTraceHookByFacility*, l);
475 lttv_hooks_add(lttv_hooks_by_id_find(disk_performance->event_by_id_hooks, thf->id),
476 thf->h,
477 disk_performance,
478 LTTV_PRIO_DEFAULT);
479
480 }
481 }
482
483 disk_performance->hooks_trace_after = lttv_hooks_new();
484 /* Registers a hook function */
485 lttv_hooks_add(disk_performance->hooks_trace_after, disk_show, disk_performance, LTTV_PRIO_DEFAULT);
486
487 disk_performance->hooks_trace_before = lttv_hooks_new();
488 /* Registers a hook function */
489 lttv_hooks_add(disk_performance->hooks_trace_before, trace_header, disk_performance, LTTV_PRIO_DEFAULT);
490
491 /* Initalize the EventsRequest structure */
492 events_request->owner = disk_performance;
493 events_request->viewer_data = disk_performance;
494 events_request->servicing = FALSE;
495 events_request->start_time = disk_performance->time_window.start_time;
496 events_request->start_position = NULL;
497 events_request->stop_flag = FALSE;
498 events_request->end_time = disk_performance->time_window.end_time;
499 events_request->num_events = G_MAXUINT;
500 events_request->end_position = NULL;
501 events_request->trace = i;
502 events_request->hooks = hooks;
503 events_request->before_chunk_traceset = NULL;
504 events_request->before_chunk_trace = disk_performance->hooks_trace_before;
505 events_request->before_chunk_tracefile= NULL;
506 events_request->event = NULL;
507 events_request->event_by_id = disk_performance->event_by_id_hooks;
508 events_request->after_chunk_tracefile = NULL;
509 events_request->after_chunk_trace = NULL;
510 events_request->after_chunk_traceset = NULL;
511 events_request->before_request = NULL;
512 events_request->after_request = disk_performance->hooks_trace_after;
513
514 lttvwindow_events_request(disk_performance->tab, events_request);
515 }
516
517 }
518
519 /**
520 * This function is called whenever a read event occurs.
521 *
522 */
523 static gboolean block_read_callback(void *hook_data, void *call_data)
524 {
525 LttEvent *e;
526 LttTime event_time;
527 unsigned cpu_id;
528 lttv_block block_read;
529 char *diskname;
530
531 LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
532 LttvTracefileState *tfs = (LttvTracefileState *)call_data;
533 DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
534 GArray *disk_array = disk_performance->disk_array;
535 e = ltt_tracefile_get_event(tfc->tf);
536 event_time = ltt_event_time(e);
537 cpu_id = ltt_event_cpu_id(e);
538
539 get_event_detail(e, &block_read);
540 diskname = major_minor_to_diskname(&block_read);
541 sum_data(diskname, block_read.size,LTTV_READ_OPERATION, disk_array);
542
543 return FALSE;
544 }
545
546 /**
547 * This function is called whenever a write event occurs.
548 *
549 */
550 static gboolean block_write_callback(void *hook_data, void *call_data)
551 {
552 LttEvent *e;
553 LttTime event_time;
554 unsigned cpu_id;
555 lttv_block block_write;
556 char *diskname;
557 LttvTracefileContext *tfc = (LttvTracefileContext *)call_data;
558 LttvTracefileState *tfs = (LttvTracefileState *)call_data;
559 DiskPerformanceData *disk_performance = (DiskPerformanceData *)hook_data;
560 GArray *disk_array = disk_performance->disk_array;
561 e = ltt_tracefile_get_event(tfc->tf);
562 event_time = ltt_event_time(e);
563 cpu_id = ltt_event_cpu_id(e);
564
565 get_event_detail(e, &block_write);
566 diskname = major_minor_to_diskname(&block_write);
567 sum_data(diskname, block_write.size,LTTV_WRITE_OPERATION, disk_array);
568
569 return FALSE;
570 }
571
572 /**
573 * This function extracts the major, minor and size
574 *
575 */
576 static void get_event_detail(LttEvent *e, lttv_block* disk_data)
577 {
578 guint i, num_fields;
579 LttEventType *event_type;
580 LttField *element;
581 LttField *field;
582 event_type = ltt_event_eventtype(e);
583 num_fields = ltt_eventtype_num_fields(event_type);
584
585 for(i = 0 ; i < num_fields ; i++)
586 {
587 element = ltt_eventtype_field(event_type,i);
588 switch(i)
589 {
590 case 0:
591 disk_data->major_number = ltt_event_get_long_unsigned(e, element);
592 break;
593
594 case 1:
595 disk_data->minor_number = ltt_event_get_long_unsigned(e, element);
596 break;
597 case 2:
598 disk_data->size = ltt_event_get_long_unsigned(e, element);
599 break;
600 }
601
602 }
603
604 }
605
606
607
608 /**
609 * This function calculates: the number of operations, the total bytes read or written,
610 * the average number of bytes read or written by sec.
611 */
612 static void sum_data(char* diskname, guint size, enum operation_t operation, GArray *disk_array)
613 {
614
615 lttv_total_block data;
616 lttv_total_block *element;
617 guint i;
618 gboolean notFound = FALSE;
619
620 memset ((void*)&data, 0,sizeof(lttv_total_block));
621
622 if(disk_array->len == NO_ITEMS){
623 strcpy(data.diskname, diskname);
624 if(operation == LTTV_READ_OPERATION){
625 data.total_bytes_read = size;
626 data.num_read_operations++;
627 }
628 else{
629 data.total_bytes_written = size;
630 data.num_write_operations ++;
631 }
632 g_array_append_val (disk_array, data);
633 }
634 else{
635 for(i = 0; i < disk_array->len; i++){
636 element = &g_array_index(disk_array,lttv_total_block,i);
637 if(strcmp(element->diskname,diskname) == 0){
638 if(operation == LTTV_READ_OPERATION){
639 element->num_read_operations++;
640 element->total_bytes_read += size;
641 }
642 else{
643 element->num_write_operations ++;
644 element->total_bytes_written += size;
645 }
646 notFound = TRUE;
647 }
648 }
649 if(!notFound){
650 strcpy(data.diskname, diskname);
651 if(operation == LTTV_READ_OPERATION){
652 data.total_bytes_read = size;
653 data.num_read_operations ++;
654 }
655 else{
656 data.total_bytes_written = size;
657 data.num_write_operations ++;
658 }
659 g_array_append_val (disk_array, data);
660 }
661 }
662 }
663
664
665 static void destroy()
666 {
667 g_info("Destroy diskPerformance");
668 g_slist_foreach(g_disk_data_list, disk_destroy_walk, NULL );
669 g_slist_free(g_disk_data_list);
670
671 lttvwindow_unregister_constructor(disk_performance);
672
673 }
674
675 /**
676 * This function convert the major and minor number to the corresponding disk.
677 * Data taken from Documentation/devices.txt of the kernel tree.
678 */
679 static char * major_minor_to_diskname( lttv_block* disk_data)
680 {
681 switch(disk_data->major_number)
682 {
683 /* IDE Disks */
684 case 3: /* First MFM, RLL and IDE hard disk/CD-ROM interface */
685 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
686 return "/dev/hda";
687 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
688 return "/dev/hdb";
689 break;
690
691 case 22: /*Second IDE hard disk/CD-ROM interface */
692 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
693 return "/dev/hdc";
694 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
695 return "/dev/hdd";
696 break;
697
698 case 33: /* Third IDE hard disk/CD-ROM interface */
699 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
700 return "/dev/hde";
701 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
702 return "/dev/hdf";
703 break;
704
705 case 34: /* Fourth IDE hard disk/CD-ROM interface */
706 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
707 return "/dev/hdg";
708 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
709 return "/dev/hdh";
710 break;
711
712 case 56: /* Fifth IDE hard disk/CD-ROM interface */
713 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
714 return "/dev/hdi";
715 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
716 return "/dev/hdj";
717 break;
718
719 case 57: /* Sixth IDE hard disk/CD-ROM interface */
720 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
721 return "/dev/hdk";
722 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
723 return "/dev/hdl";
724 break;
725
726 case 88: /* Seventh IDE hard disk/CD-ROM interface */
727 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
728 return "/dev/hdm";
729 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
730 return "/dev/hdn";
731 break;
732
733 case 89: /* Eighth IDE hard disk/CD-ROM interface */
734 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
735 return "/dev/hdo";
736 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
737 return "/dev/hdp";
738 break;
739
740 case 90: /* Ninth IDE hard disk/CD-ROM interface */
741 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
742 return "/dev/hdq";
743 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
744 return "/dev/hdr";
745 break;
746
747 case 91: /* Tenth IDE hard disk/CD-ROM interface */
748 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 64))
749 return "/dev/hds";
750 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 128))
751 return "/dev/hdt";
752 break;
753
754 /* SCSI Disks */
755 case 8: /* SCSI disk devices */
756 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
757 return "/dev/sda"; // First SCSI disk whole disk
758
759 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
760 return "/dev/sdb";// Second SCSI disk whole disk
761
762 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
763 return "/dev/sdc";// Third SCSI disk whole disk
764
765 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
766 return "/dev/sdd";// Fourth SCSI disk whole disk
767
768 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
769 return "/dev/sde";// Fifth SCSI disk whole disk
770
771 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
772 return "/dev/sdf";// Sixth SCSI disk whole disk
773
774 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
775 return "/dev/sdg";// seventh SCSI disk whole disk
776
777 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
778 return "/dev/sdh";// eighth SCSI disk whole disk
779
780 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
781 return "/dev/sdi";// 9th SCSI disk whole disk
782
783 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
784 return "/dev/sdj";// 10th SCSI disk whole disk
785
786 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
787 return "/dev/sdk";// 11th SCSI disk whole disk
788
789 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
790 return "/dev/sdl";// 12th SCSI disk whole disk
791
792 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
793 return "/dev/sdm";// 13th SCSI disk whole disk
794
795 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
796 return "/dev/sdn";// 14th SCSI disk whole disk
797
798 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
799 return "/dev/sdo";// 15th SCSI disk whole disk
800
801 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
802 return "/dev/sdp";// 16th SCSI disk whole disk
803 break;
804
805 case 65: /* SCSI disk devices */
806 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
807 return "/dev/sdq";
808
809 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
810 return "/dev/sdr";
811
812 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
813 return "/dev/sds";
814
815 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
816 return "/dev/sdt";
817
818 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
819 return "/dev/sdu";
820
821 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
822 return "/dev/sdv";
823
824 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
825 return "/dev/sdw";
826
827 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
828 return "/dev/sdy";
829
830 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
831 return "/dev/sdx";
832
833 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
834 return "/dev/sdz";
835
836 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
837 return "/dev/sdaa";
838
839 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
840 return "/dev/sdab";
841
842 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
843 return "/dev/sdac";
844
845 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
846 return "/dev/sdad";
847
848 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
849 return "/dev/sdae";
850
851 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
852 return "/dev/sdaf";
853 break;
854
855 case 66: /* SCSI disk devices */
856 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
857 return "/dev/sdag";
858
859 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
860 return "/dev/sdah";
861
862 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
863 return "/dev/sdai";
864
865 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
866 return "/dev/sdaj";
867
868 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
869 return "/dev/sdak";
870
871 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
872 return "/dev/sdal";
873
874 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
875 return "/dev/sdam";
876
877 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
878 return "/dev/sdan";
879
880 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
881 return "/dev/sdao";
882
883 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
884 return "/dev/sdap";
885
886 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
887 return "/dev/sdaq";
888
889 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
890 return "/dev/sdar";
891
892 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
893 return "/dev/sdas";
894
895 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
896 return "/dev/sdat";
897
898 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
899 return "/dev/sdau";
900
901 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
902 return "/dev/sdav";
903 break;
904
905
906 case 67: /* SCSI disk devices */
907 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
908 return "/dev/sdaw";
909
910 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
911 return "/dev/sdax";
912
913 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
914 return "/dev/sday";
915
916 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
917 return "/dev/sdaz";
918
919 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
920 return "/dev/sdba";
921
922 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
923 return "/dev/sdbb";
924
925 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
926 return "/dev/sdbc";
927
928 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
929 return "/dev/sdbd";
930
931 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
932 return "/dev/sdbe";
933
934 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
935 return "/dev/sdbf";
936
937 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
938 return "/dev/sdbg";
939
940 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
941 return "/dev/sdbh";
942
943 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
944 return "/dev/sdbi";
945
946 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
947 return "/dev/sdbj";
948
949 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
950 return "/dev/sdbk";
951
952 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
953 return "/dev/sdbl";
954 break;
955
956 case 68 : /* SCSI disk devices */
957 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
958 return "/dev/sdbm";
959
960 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
961 return "/dev/sdbm";
962
963 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
964 return "/dev/sdbo";
965
966 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
967 return "/dev/sdbp";
968
969 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
970 return "/dev/sdbq";
971
972 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
973 return "/dev/sdbr";
974
975 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
976 return "/dev/sdbs";
977
978 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
979 return "/dev/sdbt";
980
981 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
982 return "/dev/sdbu";
983
984 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
985 return "/dev/sdbv";
986
987 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
988 return "/dev/sdbw";
989
990 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
991 return "/dev/sdbx";
992
993 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
994 return "/dev/sdby";
995
996 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
997 return "/dev/sdbz";
998
999 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1000 return "/dev/sdca";
1001
1002 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1003 return "/dev/sdcb";
1004 break;
1005 case 69 : /* SCSI disk devices */
1006 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1007 return "/dev/sdcc";
1008
1009 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1010 return "/dev/sdcd";
1011
1012 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1013 return "/dev/sdce";
1014
1015 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1016 return "/dev/sdcf";
1017
1018 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1019 return "/dev/sdcg";
1020
1021 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1022 return "/dev/sdch";
1023
1024 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1025 return "/dev/sdci";
1026
1027 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1028 return "/dev/sdcj";
1029
1030 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1031 return "/dev/sdck";
1032
1033 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1034 return "/dev/sdcl";
1035
1036 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1037 return "/dev/sdcm";
1038
1039 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1040 return "/dev/sdcn";
1041
1042 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1043 return "/dev/sdco";
1044
1045 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1046 return "/dev/sdcp";
1047
1048 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1049 return "/dev/sdcq";
1050
1051 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1052 return "/dev/sdcr";
1053 break;
1054
1055
1056 case 70 : /* SCSI disk devices */
1057 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1058 return "/dev/sdcs";
1059
1060 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1061 return "/dev/sdct";
1062
1063 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1064 return "/dev/sdcu";
1065
1066 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1067 return "/dev/sdcv";
1068
1069 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1070 return "/dev/sdcw";
1071
1072 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1073 return "/dev/sdcx";
1074
1075 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1076 return "/dev/sdcy";
1077
1078 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1079 return "/dev/sdcz";
1080
1081 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1082 return "/dev/sdda";
1083
1084 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1085 return "/dev/sddb";
1086
1087 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1088 return "/dev/sddc";
1089
1090 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1091 return "/dev/sddd";
1092
1093 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1094 return "/dev/sdde";
1095
1096 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1097 return "/dev/sddf";
1098
1099 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1100 return "/dev/sddg";
1101
1102 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1103 return "/dev/sddh";
1104 break;
1105
1106 case 71: /* SCSI disk devices */
1107 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1108 return "/dev/sddi";
1109
1110 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1111 return "/dev/sddj";
1112
1113 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1114 return "/dev/sddk";
1115
1116 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1117 return "/dev/sddl";
1118
1119 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1120 return "/dev/sddm";
1121
1122 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1123 return "/dev/sddn";
1124
1125 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1126 return "/dev/sddo";
1127
1128 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1129 return "/dev/sddp";
1130
1131 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1132 return "/dev/sddq";
1133
1134 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1135 return "/dev/sddr";
1136
1137 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1138 return "/dev/sdds";
1139
1140 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1141 return "/dev/sddt";
1142
1143 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1144 return "/dev/sddu";
1145
1146 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1147 return "/dev/sddv";
1148
1149 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1150 return "/dev/sddw";
1151
1152 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1153 return "/dev/sddx";
1154 break;
1155
1156 case 128: /* SCSI disk devices */
1157 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1158 return "/dev/sddy";
1159
1160 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1161 return "/dev/sddz";
1162
1163 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1164 return "/dev/sdea";
1165
1166 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1167 return "/dev/sdeb";
1168
1169 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1170 return "/dev/sdec";
1171
1172 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1173 return "/dev/sded";
1174
1175 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1176 return "/dev/sdee";
1177
1178 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1179 return "/dev/sdef";
1180
1181 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1182 return "/dev/sdeg";
1183
1184 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1185 return "/dev/sdeh";
1186
1187 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1188 return "/dev/sdei";
1189
1190 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1191 return "/dev/sdej";
1192
1193 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1194 return "/dev/sdek";
1195
1196 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1197 return "/dev/sdel";
1198
1199 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1200 return "/dev/sdem";
1201
1202 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1203 return "/dev/sden";
1204 break;
1205
1206 case 129: /* SCSI disk devices */
1207 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 16))
1208 return "/dev/sdeo";
1209
1210 if((disk_data->minor_number >= 16) && (disk_data->minor_number < 32))
1211 return "/dev/sdep";
1212
1213 if((disk_data->minor_number >= 32) && (disk_data->minor_number < 48))
1214 return "/dev/sdeq";
1215
1216 if((disk_data->minor_number >= 48) && (disk_data->minor_number < 64))
1217 return "/dev/sder";
1218
1219 if((disk_data->minor_number >= 64) && (disk_data->minor_number < 80))
1220 return "/dev/sdes";
1221
1222 if((disk_data->minor_number >= 80) && (disk_data->minor_number < 96))
1223 return "/dev/sdet";
1224
1225 if((disk_data->minor_number >= 96) && (disk_data->minor_number < 112))
1226 return "/dev/sdeu";
1227
1228 if((disk_data->minor_number >= 112) && (disk_data->minor_number < 128))
1229 return "/dev/sdev";
1230
1231 if((disk_data->minor_number >= 128) && (disk_data->minor_number < 144))
1232 return "/dev/sdew";
1233
1234 if((disk_data->minor_number >= 144) && (disk_data->minor_number < 160))
1235 return "/dev/sdez";
1236
1237 if((disk_data->minor_number >= 160) && (disk_data->minor_number < 176))
1238 return "/dev/sdey";
1239
1240 if((disk_data->minor_number >= 176) && (disk_data->minor_number < 192))
1241 return "/dev/sdez";
1242
1243 if((disk_data->minor_number >= 192) && (disk_data->minor_number < 208))
1244 return "/dev/sdfa";
1245
1246 if((disk_data->minor_number >= 208) && (disk_data->minor_number < 224))
1247 return "/dev/sdfb";
1248
1249 if((disk_data->minor_number >= 224) && (disk_data->minor_number < 240))
1250 return "/dev/sdfc";
1251
1252 if((disk_data->minor_number >= 240) && (disk_data->minor_number < 256))
1253 return "/dev/sdfd";
1254 break;
1255 /*USB block devices*/
1256 case 180:
1257 if( (disk_data->minor_number >= 0) && (disk_data->minor_number < 8))
1258 return "/dev/uba";
1259 if( (disk_data->minor_number >= 8) && (disk_data->minor_number < 16))
1260 return "/dev/ubb";
1261 if( (disk_data->minor_number >= 16) && (disk_data->minor_number < 24))
1262 return "/dev/ubc";
1263 break;
1264
1265 }
1266
1267
1268 }
1269 LTTV_MODULE("diskperformance", "disk info view", \
1270 "Produce disk I/O performance", \
1271 init, destroy, "lttvwindow")
1272
This page took 0.049949 seconds and 3 git commands to generate.