disk performance metrics optimization and cleanup of removed disks
Costa Tsaousis (ktsaou) committed
Mar 5, 2017 at 22:13 UTC
8fb6baa19f6646a076d16bc3b722838fb204f9f6
1 file changed
+265
-115
src/proc_diskstats.c
+265
-115
@@ -25,9 +25,24 @@ static struct disk {
25
int do_util;
26
int do_backlog;
27
28
+ int updated;
29
+
30
+ RRDSET *st_avgsz;
31
+ RRDSET *st_await;
32
+ RRDSET *st_backlog;
33
+ RRDSET *st_io;
34
+ RRDSET *st_iotime;
35
+ RRDSET *st_mops;
36
+ RRDSET *st_ops;
37
+ RRDSET *st_qops;
38
+ RRDSET *st_svctm;
39
+ RRDSET *st_util;
40
+
41
struct disk *next;
42
} *disk_root = NULL;
43
44
+#define rrdset_obsolete_and_pointer_null(st) do { if(st) { rrdset_flag_set(st, RRDSET_FLAG_OBSOLETE); st = NULL; } } while(st)
45
+
46
static struct disk *get_disk(unsigned long major, unsigned long minor, char *disk) {
47
static char path_to_get_hw_sector_size[FILENAME_MAX + 1] = "";
48
static char path_to_get_hw_sector_size_partitions[FILENAME_MAX + 1] = "";
@@ -316,7 +331,7 @@ int do_proc_diskstats(int update_every, usec_t dt) {
331
// get a disk structure for the disk
332
333
struct disk *d = get_disk(major, minor, disk);
319
-
334
+ d->updated = 1;
335
336
// --------------------------------------------------------------------------
337
// Set its family based on mount point
@@ -409,27 +424,34 @@ int do_proc_diskstats(int update_every, usec_t dt) {
424
d->configured = 1;
425
}
426
412
- RRDSET *st;
413
-
427
// --------------------------------------------------------------------------
428
// Do performance metrics
429
430
if(d->do_io == CONFIG_BOOLEAN_YES || (d->do_io == CONFIG_BOOLEAN_AUTO && (readsectors || writesectors))) {
431
d->do_io = CONFIG_BOOLEAN_YES;
432
420
- st = rrdset_find_bytype_localhost(RRD_TYPE_DISK, disk);
421
- if(unlikely(!st)) {
422
- st = rrdset_create_localhost(RRD_TYPE_DISK, disk, NULL, family, "disk.io", "Disk I/O Bandwidth"
423
- , "kilobytes/s", 2000, update_every, RRDSET_TYPE_AREA);
424
-
425
- rrddim_add(st, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_INCREMENTAL);
426
- rrddim_add(st, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_INCREMENTAL);
433
+ if(unlikely(!d->st_io)) {
434
+ d->st_io = rrdset_create_localhost(
435
+ RRD_TYPE_DISK
436
+ , disk
437
+ , NULL
438
+ , family
439
+ , "disk.io"
440
+ , "Disk I/O Bandwidth"
441
+ , "kilobytes/s"
442
+ , 2000
443
+ , update_every
444
+ , RRDSET_TYPE_AREA
445
+ );
446
+
447
+ rrddim_add(d->st_io, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_INCREMENTAL);
448
+ rrddim_add(d->st_io, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_INCREMENTAL);
449
}
428
- else rrdset_next(st);
450
+ else rrdset_next(d->st_io);
451
430
- last_readsectors = rrddim_set(st, "reads", readsectors);
431
- last_writesectors = rrddim_set(st, "writes", writesectors);
432
- rrdset_done(st);
452
+ last_readsectors = rrddim_set(d->st_io, "reads", readsectors);
453
+ last_writesectors = rrddim_set(d->st_io, "writes", writesectors);
454
+ rrdset_done(d->st_io);
455
}
456
457
// --------------------------------------------------------------------
@@ -437,20 +459,30 @@ int do_proc_diskstats(int update_every, usec_t dt) {
459
if(d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes))) {
460
d->do_ops = CONFIG_BOOLEAN_YES;
461
440
- st = rrdset_find_bytype_localhost("disk_ops", disk);
441
- if(unlikely(!st)) {
442
- st = rrdset_create_localhost("disk_ops", disk, NULL, family, "disk.ops", "Disk Completed I/O Operations"
443
- , "operations/s", 2001, update_every, RRDSET_TYPE_LINE);
444
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
445
-
446
- rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
447
- rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
462
+ if(unlikely(!d->st_ops)) {
463
+ d->st_ops = rrdset_create_localhost(
464
+ "disk_ops"
465
+ , disk
466
+ , NULL
467
+ , family
468
+ , "disk.ops"
469
+ , "Disk Completed I/O Operations"
470
+ , "operations/s"
471
+ , 2001
472
+ , update_every
473
+ , RRDSET_TYPE_LINE
474
+ );
475
+
476
+ rrdset_flag_set(d->st_ops, RRDSET_FLAG_DETAIL);
477
+
478
+ rrddim_add(d->st_ops, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
479
+ rrddim_add(d->st_ops, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
480
}
449
- else rrdset_next(st);
481
+ else rrdset_next(d->st_ops);
482
451
- last_reads = rrddim_set(st, "reads", reads);
452
- last_writes = rrddim_set(st, "writes", writes);
453
- rrdset_done(st);
483
+ last_reads = rrddim_set(d->st_ops, "reads", reads);
484
+ last_writes = rrddim_set(d->st_ops, "writes", writes);
485
+ rrdset_done(d->st_ops);
486
}
487
488
// --------------------------------------------------------------------
@@ -458,18 +490,28 @@ int do_proc_diskstats(int update_every, usec_t dt) {
490
if(d->do_qops == CONFIG_BOOLEAN_YES || (d->do_qops == CONFIG_BOOLEAN_AUTO && queued_ios)) {
491
d->do_qops = CONFIG_BOOLEAN_YES;
492
461
- st = rrdset_find_bytype_localhost("disk_qops", disk);
462
- if(unlikely(!st)) {
463
- st = rrdset_create_localhost("disk_qops", disk, NULL, family, "disk.qops", "Disk Current I/O Operations"
464
- , "operations", 2002, update_every, RRDSET_TYPE_LINE);
465
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
466
-
467
- rrddim_add(st, "operations", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
493
+ if(unlikely(!d->st_qops)) {
494
+ d->st_qops = rrdset_create_localhost(
495
+ "disk_qops"
496
+ , disk
497
+ , NULL
498
+ , family
499
+ , "disk.qops"
500
+ , "Disk Current I/O Operations"
501
+ , "operations"
502
+ , 2002
503
+ , update_every
504
+ , RRDSET_TYPE_LINE
505
+ );
506
+
507
+ rrdset_flag_set(d->st_qops, RRDSET_FLAG_DETAIL);
508
+
509
+ rrddim_add(d->st_qops, "operations", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
510
}
469
- else rrdset_next(st);
511
+ else rrdset_next(d->st_qops);
512
471
- rrddim_set(st, "operations", queued_ios);
472
- rrdset_done(st);
513
+ rrddim_set(d->st_qops, "operations", queued_ios);
514
+ rrdset_done(d->st_qops);
515
}
516
517
// --------------------------------------------------------------------
@@ -477,18 +519,28 @@ int do_proc_diskstats(int update_every, usec_t dt) {
519
if(d->do_backlog == CONFIG_BOOLEAN_YES || (d->do_backlog == CONFIG_BOOLEAN_AUTO && backlog_ms)) {
520
d->do_backlog = CONFIG_BOOLEAN_YES;
521
480
- st = rrdset_find_bytype_localhost("disk_backlog", disk);
481
- if(unlikely(!st)) {
482
- st = rrdset_create_localhost("disk_backlog", disk, NULL, family, "disk.backlog", "Disk Backlog"
483
- , "backlog (ms)", 2003, update_every, RRDSET_TYPE_AREA);
484
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
485
-
486
- rrddim_add(st, "backlog", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
522
+ if(unlikely(!d->st_backlog)) {
523
+ d->st_backlog = rrdset_create_localhost(
524
+ "disk_backlog"
525
+ , disk
526
+ , NULL
527
+ , family
528
+ , "disk.backlog"
529
+ , "Disk Backlog"
530
+ , "backlog (ms)"
531
+ , 2003
532
+ , update_every
533
+ , RRDSET_TYPE_AREA
534
+ );
535
+
536
+ rrdset_flag_set(d->st_backlog, RRDSET_FLAG_DETAIL);
537
+
538
+ rrddim_add(d->st_backlog, "backlog", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
539
}
488
- else rrdset_next(st);
540
+ else rrdset_next(d->st_backlog);
541
490
- rrddim_set(st, "backlog", backlog_ms);
491
- rrdset_done(st);
542
+ rrddim_set(d->st_backlog, "backlog", backlog_ms);
543
+ rrdset_done(d->st_backlog);
544
}
545
546
// --------------------------------------------------------------------
@@ -496,18 +548,28 @@ int do_proc_diskstats(int update_every, usec_t dt) {
548
if(d->do_util == CONFIG_BOOLEAN_YES || (d->do_util == CONFIG_BOOLEAN_AUTO && busy_ms)) {
549
d->do_util = CONFIG_BOOLEAN_YES;
550
499
- st = rrdset_find_bytype_localhost("disk_util", disk);
500
- if(unlikely(!st)) {
501
- st = rrdset_create_localhost("disk_util", disk, NULL, family, "disk.util", "Disk Utilization Time"
502
- , "% of time working", 2004, update_every, RRDSET_TYPE_AREA);
503
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
504
-
505
- rrddim_add(st, "utilization", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
551
+ if(unlikely(!d->st_util)) {
552
+ d->st_util = rrdset_create_localhost(
553
+ "disk_util"
554
+ , disk
555
+ , NULL
556
+ , family
557
+ , "disk.util"
558
+ , "Disk Utilization Time"
559
+ , "% of time working"
560
+ , 2004
561
+ , update_every
562
+ , RRDSET_TYPE_AREA
563
+ );
564
+
565
+ rrdset_flag_set(d->st_util, RRDSET_FLAG_DETAIL);
566
+
567
+ rrddim_add(d->st_util, "utilization", NULL, 1, 10, RRD_ALGORITHM_INCREMENTAL);
568
}
507
- else rrdset_next(st);
569
+ else rrdset_next(d->st_util);
570
509
- last_busy_ms = rrddim_set(st, "utilization", busy_ms);
510
- rrdset_done(st);
571
+ last_busy_ms = rrddim_set(d->st_util, "utilization", busy_ms);
572
+ rrdset_done(d->st_util);
573
}
574
575
// --------------------------------------------------------------------
@@ -515,20 +577,30 @@ int do_proc_diskstats(int update_every, usec_t dt) {
577
if(d->do_mops == CONFIG_BOOLEAN_YES || (d->do_mops == CONFIG_BOOLEAN_AUTO && (mreads || mwrites))) {
578
d->do_mops = CONFIG_BOOLEAN_YES;
579
518
- st = rrdset_find_bytype_localhost("disk_mops", disk);
519
- if(unlikely(!st)) {
520
- st = rrdset_create_localhost("disk_mops", disk, NULL, family, "disk.mops", "Disk Merged Operations"
521
- , "merged operations/s", 2021, update_every, RRDSET_TYPE_LINE);
522
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
523
-
524
- rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
525
- rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
580
+ if(unlikely(!d->st_mops)) {
581
+ d->st_mops = rrdset_create_localhost(
582
+ "disk_mops"
583
+ , disk
584
+ , NULL
585
+ , family
586
+ , "disk.mops"
587
+ , "Disk Merged Operations"
588
+ , "merged operations/s"
589
+ , 2021
590
+ , update_every
591
+ , RRDSET_TYPE_LINE
592
+ );
593
+
594
+ rrdset_flag_set(d->st_mops, RRDSET_FLAG_DETAIL);
595
+
596
+ rrddim_add(d->st_mops, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
597
+ rrddim_add(d->st_mops, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
598
}
527
- else rrdset_next(st);
599
+ else rrdset_next(d->st_mops);
600
529
- rrddim_set(st, "reads", mreads);
530
- rrddim_set(st, "writes", mwrites);
531
- rrdset_done(st);
601
+ rrddim_set(d->st_mops, "reads", mreads);
602
+ rrddim_set(d->st_mops, "writes", mwrites);
603
+ rrdset_done(d->st_mops);
604
}
605
606
// --------------------------------------------------------------------
@@ -536,20 +608,30 @@ int do_proc_diskstats(int update_every, usec_t dt) {
608
if(d->do_iotime == CONFIG_BOOLEAN_YES || (d->do_iotime == CONFIG_BOOLEAN_AUTO && (readms || writems))) {
609
d->do_iotime = CONFIG_BOOLEAN_YES;
610
539
- st = rrdset_find_bytype_localhost("disk_iotime", disk);
540
- if(unlikely(!st)) {
541
- st = rrdset_create_localhost("disk_iotime", disk, NULL, family, "disk.iotime", "Disk Total I/O Time"
542
- , "milliseconds/s", 2022, update_every, RRDSET_TYPE_LINE);
543
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
544
-
545
- rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
546
- rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
611
+ if(unlikely(!d->st_iotime)) {
612
+ d->st_iotime = rrdset_create_localhost(
613
+ "disk_iotime"
614
+ , disk
615
+ , NULL
616
+ , family
617
+ , "disk.iotime"
618
+ , "Disk Total I/O Time"
619
+ , "milliseconds/s"
620
+ , 2022
621
+ , update_every
622
+ , RRDSET_TYPE_LINE
623
+ );
624
+
625
+ rrdset_flag_set(d->st_iotime, RRDSET_FLAG_DETAIL);
626
+
627
+ rrddim_add(d->st_iotime, "reads", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
628
+ rrddim_add(d->st_iotime, "writes", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
629
}
548
- else rrdset_next(st);
630
+ else rrdset_next(d->st_iotime);
631
550
- last_readms = rrddim_set(st, "reads", readms);
551
- last_writems = rrddim_set(st, "writes", writems);
552
- rrdset_done(st);
632
+ last_readms = rrddim_set(d->st_iotime, "reads", readms);
633
+ last_writems = rrddim_set(d->st_iotime, "writes", writems);
634
+ rrdset_done(d->st_iotime);
635
}
636
637
// --------------------------------------------------------------------
@@ -559,57 +641,125 @@ int do_proc_diskstats(int update_every, usec_t dt) {
641
if(likely(dt)) {
642
if( (d->do_iotime == CONFIG_BOOLEAN_YES || (d->do_iotime == CONFIG_BOOLEAN_AUTO && (readms || writems))) &&
643
(d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes)))) {
562
- st = rrdset_find_bytype_localhost("disk_await", disk);
563
- if(unlikely(!st)) {
564
- st = rrdset_create_localhost("disk_await", disk, NULL, family, "disk.await"
565
- , "Average Completed I/O Operation Time", "ms per operation", 2005
566
- , update_every, RRDSET_TYPE_LINE);
567
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
568
-
569
- rrddim_add(st, "reads", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
570
- rrddim_add(st, "writes", NULL, -1, 1, RRD_ALGORITHM_ABSOLUTE);
644
+
645
+ if(unlikely(!d->st_await)) {
646
+ d->st_await = rrdset_create_localhost(
647
+ "disk_await"
648
+ , disk
649
+ , NULL
650
+ , family
651
+ , "disk.await"
652
+ , "Average Completed I/O Operation Time"
653
+ , "ms per operation"
654
+ , 2005
655
+ , update_every
656
+ , RRDSET_TYPE_LINE
657
+ );
658
+
659
+ rrdset_flag_set(d->st_await, RRDSET_FLAG_DETAIL);
660
+
661
+ rrddim_add(d->st_await, "reads", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
662
+ rrddim_add(d->st_await, "writes", NULL, -1, 1, RRD_ALGORITHM_ABSOLUTE);
663
}
572
- else rrdset_next(st);
664
+ else rrdset_next(d->st_await);
665
574
- rrddim_set(st, "reads", (reads - last_reads) ? (readms - last_readms) / (reads - last_reads) : 0);
575
- rrddim_set(st, "writes", (writes - last_writes) ? (writems - last_writems) / (writes - last_writes) : 0);
576
- rrdset_done(st);
666
+ rrddim_set(d->st_await, "reads", (reads - last_reads) ? (readms - last_readms) / (reads - last_reads) : 0);
667
+ rrddim_set(d->st_await, "writes", (writes - last_writes) ? (writems - last_writems) / (writes - last_writes) : 0);
668
+ rrdset_done(d->st_await);
669
}
670
671
if( (d->do_io == CONFIG_BOOLEAN_YES || (d->do_io == CONFIG_BOOLEAN_AUTO && (readsectors || writesectors))) &&
672
(d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes)))) {
581
- st = rrdset_find_bytype_localhost("disk_avgsz", disk);
582
- if(unlikely(!st)) {
583
- st = rrdset_create_localhost("disk_avgsz", disk, NULL, family, "disk.avgsz"
584
- , "Average Completed I/O Operation Bandwidth"
585
- , "kilobytes per operation", 2006, update_every, RRDSET_TYPE_AREA);
586
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
587
-
588
- rrddim_add(st, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_ABSOLUTE);
589
- rrddim_add(st, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_ABSOLUTE);
673
+
674
+ if(unlikely(!d->st_avgsz)) {
675
+ d->st_avgsz = rrdset_create_localhost(
676
+ "disk_avgsz"
677
+ , disk
678
+ , NULL
679
+ , family
680
+ , "disk.avgsz"
681
+ , "Average Completed I/O Operation Bandwidth"
682
+ , "kilobytes per operation"
683
+ , 2006
684
+ , update_every
685
+ , RRDSET_TYPE_AREA
686
+ );
687
+
688
+ rrdset_flag_set(d->st_avgsz, RRDSET_FLAG_DETAIL);
689
+
690
+ rrddim_add(d->st_avgsz, "reads", NULL, d->sector_size, 1024, RRD_ALGORITHM_ABSOLUTE);
691
+ rrddim_add(d->st_avgsz, "writes", NULL, d->sector_size * -1, 1024, RRD_ALGORITHM_ABSOLUTE);
692
}
591
- else rrdset_next(st);
693
+ else rrdset_next(d->st_avgsz);
694
593
- rrddim_set(st, "reads", (reads - last_reads) ? (readsectors - last_readsectors) / (reads - last_reads) : 0);
594
- rrddim_set(st, "writes", (writes - last_writes) ? (writesectors - last_writesectors) / (writes - last_writes) : 0);
595
- rrdset_done(st);
695
+ rrddim_set(d->st_avgsz, "reads", (reads - last_reads) ? (readsectors - last_readsectors) / (reads - last_reads) : 0);
696
+ rrddim_set(d->st_avgsz, "writes", (writes - last_writes) ? (writesectors - last_writesectors) / (writes - last_writes) : 0);
697
+ rrdset_done(d->st_avgsz);
698
}
699
700
if( (d->do_util == CONFIG_BOOLEAN_YES || (d->do_util == CONFIG_BOOLEAN_AUTO && busy_ms)) &&
701
(d->do_ops == CONFIG_BOOLEAN_YES || (d->do_ops == CONFIG_BOOLEAN_AUTO && (reads || writes)))) {
600
- st = rrdset_find_bytype_localhost("disk_svctm", disk);
601
- if(unlikely(!st)) {
602
- st = rrdset_create_localhost("disk_svctm", disk, NULL, family, "disk.svctm", "Average Service Time"
603
- , "ms per operation", 2007, update_every, RRDSET_TYPE_LINE);
604
- rrdset_flag_set(st, RRDSET_FLAG_DETAIL);
702
606
- rrddim_add(st, "svctm", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
703
+ if(unlikely(!d->st_svctm)) {
704
+ d->st_svctm = rrdset_create_localhost(
705
+ "disk_svctm"
706
+ , disk
707
+ , NULL
708
+ , family
709
+ , "disk.svctm"
710
+ , "Average Service Time"
711
+ , "ms per operation"
712
+ , 2007
713
+ , update_every
714
+ , RRDSET_TYPE_LINE
715
+ );
716
+
717
+ rrdset_flag_set(d->st_svctm, RRDSET_FLAG_DETAIL);
718
+
719
+ rrddim_add(d->st_svctm, "svctm", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
720
}
608
- else rrdset_next(st);
721
+ else rrdset_next(d->st_svctm);
722
+
723
+ rrddim_set(d->st_svctm, "svctm", ((reads - last_reads) + (writes - last_writes)) ? (busy_ms - last_busy_ms) / ((reads - last_reads) + (writes - last_writes)) : 0);
724
+ rrdset_done(d->st_svctm);
725
+ }
726
+ }
727
+ }
728
610
- rrddim_set(st, "svctm", ((reads - last_reads) + (writes - last_writes)) ? (busy_ms - last_busy_ms) / ((reads - last_reads) + (writes - last_writes)) : 0);
611
- rrdset_done(st);
729
+ // cleanup removed disks
730
+
731
+ struct disk *d = disk_root, *last = NULL;
732
+ while(d) {
733
+ if(unlikely(!d->updated)) {
734
+ struct disk *t = d;
735
+
736
+ rrdset_obsolete_and_pointer_null(d->st_avgsz);
737
+ rrdset_obsolete_and_pointer_null(d->st_await);
738
+ rrdset_obsolete_and_pointer_null(d->st_backlog);
739
+ rrdset_obsolete_and_pointer_null(d->st_io);
740
+ rrdset_obsolete_and_pointer_null(d->st_iotime);
741
+ rrdset_obsolete_and_pointer_null(d->st_mops);
742
+ rrdset_obsolete_and_pointer_null(d->st_ops);
743
+ rrdset_obsolete_and_pointer_null(d->st_qops);
744
+ rrdset_obsolete_and_pointer_null(d->st_svctm);
745
+ rrdset_obsolete_and_pointer_null(d->st_util);
746
+
747
+ if(d == disk_root) {
748
+ disk_root = d = d->next;
749
+ last = NULL;
750
+ }
751
+ else if(last) {
752
+ last->next = d = d->next;
753
}
754
+
755
+ freez(t->disk);
756
+ freez(t->mount_point);
757
+ freez(t);
758
+ }
759
+ else {
760
+ d->updated = 0;
761
+ last = d;
762
+ d = d->next;
763
}
764
}
765