Package: release.debian.org
Severity: normal
X-Debbugs-Cc: ioto...@packages.debian.org
Control: affects -1 + src:iotop-c
User: release.debian....@packages.debian.org
Usertags: unblock

Please unblock package iotop-c

[ Reason ]
Kernel 6.14 introduced an incompatibility in struct taskstats [1][2]

iotop-c 1.29 wrongly assumes that the newer kernels will use the
broken struct from 6.14 but the change was fixed in mainline [3]
and there is a plan to backport it to 6.14 as well.

[ Impact ]
iotop-c 1.29 will be non-functional on all 6.14 kernels that include
the fix and all kernels newer that 6.14

[ Tests ]
iotop-c 1.30 was manually tested by compiling against both fixed and
unfixed kernel headers and then running the binary on older than 6.14,
broken 6.14 and fixed 6.14.

[ Risks ]
iotop-c is a leaf package, all the changes between 1.29 and 1.30 are
small and trivial. Hence the risk of unblocking the update is zero.

Both alternatives - iotop-py and htop are non-functional on 6.14
kernels before the fix gets applied. Also htop will not work on any
other kernel if it is compiled against the unfixed 6.14 headers.

[ Checklist ]
  [x] all changes are documented in the d/changelog
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

[ Other info ]
[1] https://github.com/Tomas-M/iotop/issues/82
[2] https://bugzilla.kernel.org/show_bug.cgi?id=220102
[3] 
https://lore.kernel.org/all/CAHk-=wilrw8dn8-4jmeczh0opo8skxoc5e6fwmfspwgmpqy...@mail.gmail.com/

unblock iotop-c/1.30-1
diff -Nru iotop-c-1.29/debian/changelog iotop-c-1.30/debian/changelog
--- iotop-c-1.29/debian/changelog       2025-05-06 22:09:06.000000000 +0000
+++ iotop-c-1.30/debian/changelog       2025-05-26 20:24:48.000000000 +0000
@@ -1,3 +1,14 @@
+iotop-c (1.30-1) unstable; urgency=medium
+
+  * Update to new upstream release of 1.30
+    - kernel commit 0bf2d83 fixes the problem with struct taskstats
+      now iotop 1.30 handles only v15 of the struct in a different
+      way, retaining compatibility with both old and new kernels
+    - show zero current values for exited processes
+    - flush stdout after each batch run
+
+ -- Boian Bonev <bbo...@ipacct.com>  Mon, 26 May 2025 20:24:48 +0000
+
 iotop-c (1.29-1) unstable; urgency=medium
 
   * Update to new upstream release of 1.29
diff -Nru iotop-c-1.29/fedora/iotop-c.spec iotop-c-1.30/fedora/iotop-c.spec
--- iotop-c-1.29/fedora/iotop-c.spec    2025-05-06 22:11:46.000000000 +0000
+++ iotop-c-1.30/fedora/iotop-c.spec    2025-05-26 20:36:11.000000000 +0000
@@ -1,5 +1,5 @@
 Name:           iotop-c
-Version:        1.29
+Version:        1.30
 Release:        1%{?dist}
 Summary:        Simple top-like I/O monitor (implemented in C)
 
@@ -53,6 +53,9 @@
 %{_mandir}/man8/iotop.8*
 
 %changelog
+* Mon May 26 2025 Boian Bonev <bbo...@ipacct.com> - 1.30-1
+- Update to latest ver 1.30
+
 * Tue May  6 2025 Boian Bonev <bbo...@ipacct.com> - 1.29-1
 - Update to latest ver 1.29
 
diff -Nru iotop-c-1.29/src/iotop.h iotop-c-1.30/src/iotop.h
--- iotop-c-1.29/src/iotop.h    2025-05-06 22:08:49.000000000 +0000
+++ iotop-c-1.30/src/iotop.h    2025-05-26 20:36:11.000000000 +0000
@@ -30,7 +30,7 @@
 
 #include "ucell.h"
 
-#define VERSION "1.29"
+#define VERSION "1.30"
 
 typedef enum {
        E_GR_IO,
@@ -96,6 +96,7 @@
 extern int maxpidlen;
 extern unsigned taskstats_ver;
 
+#define IOTOP_TASKSTATS_MINVER 4
 #define IOTOP_TASKSTATS_VERSION 15
 
 #define HISTORY_POS 60
diff -Nru iotop-c-1.29/src/view_batch.c iotop-c-1.30/src/view_batch.c
--- iotop-c-1.29/src/view_batch.c       2025-05-02 15:12:39.000000000 +0000
+++ iotop-c-1.30/src/view_batch.c       2025-05-26 20:36:05.000000000 +0000
@@ -136,6 +136,7 @@
 
                if ((params.iter>-1)&&((--params.iter)==0))
                        break;
+               fflush(stdout);
                sleep(params.delay);
        }
        arr_free(cs);
diff -Nru iotop-c-1.29/src/view_curses.c iotop-c-1.30/src/view_curses.c
--- iotop-c-1.29/src/view_curses.c      2025-05-06 22:08:49.000000000 +0000
+++ iotop-c-1.30/src/view_curses.c      2025-05-26 20:36:05.000000000 +0000
@@ -1190,8 +1190,13 @@
                                
read_val=config.f.processes?s->read_val_acc_p:s->read_val_acc;
                                
write_val=config.f.processes?s->write_val_acc_p:s->write_val_acc;
                        } else {
-                               
read_val=config.f.processes?s->read_val_p:s->read_val;
-                               
write_val=config.f.processes?s->write_val_p:s->write_val;
+                               if (s->exited) {
+                                       read_val=0.0;
+                                       write_val=0.0;
+                               } else {
+                                       
read_val=config.f.processes?s->read_val_p:s->read_val;
+                                       
write_val=config.f.processes?s->write_val_p:s->write_val;
+                               }
                        }
 
                        humanize_val(&read_val,read_str,1);
@@ -1325,16 +1330,24 @@
                                        
attron(config.f.nocolor?A_ITALIC:COLOR_PAIR(RED_PAIR));
                                        printw("  Error  ");
                                        
attroff(config.f.nocolor?A_ITALIC:COLOR_PAIR(RED_PAIR));
-                               } else
-                                       
color_print_pc(config.f.processes?s->swapin_val_p:s->swapin_val);
+                               } else {
+                                       if (s->exited)
+                                               color_print_pc(0);
+                                       else
+                                               
color_print_pc(config.f.processes?s->swapin_val_p:s->swapin_val);
+                               }
                        }
                        if (!config.f.hideio&&has_tda) {
                                if (s->error_x) {
                                        
attron(config.f.nocolor?A_ITALIC:COLOR_PAIR(RED_PAIR));
                                        printw("  Error  ");
                                        
attroff(config.f.nocolor?A_ITALIC:COLOR_PAIR(RED_PAIR));
-                               } else
-                                       
color_print_pc(config.f.processes?s->blkio_val_p:s->blkio_val);
+                               } else {
+                                       if (s->exited)
+                                               color_print_pc(0);
+                                       else
+                                               
color_print_pc(config.f.processes?s->blkio_val_p:s->blkio_val);
+                               }
                        }
                        if (!config.f.hidegraph&&hrevpos>0) {
                                if (config.f.reverse_graph) {
@@ -2603,12 +2616,12 @@
                                "\tto restore it to its previous value and save 
some CPU cycles.\n"
                        );
                }
-       if (taskstats_ver)
+       if (taskstats_ver&&taskstats_ver<IOTOP_TASKSTATS_MINVER)
                printf(
                        "WARNING:\n"
                        "\tThis kernel provides struct taskstats with version 
%u.\n"
-                       "\tThat may not be compatible with the currently 
supported version %u.\n",
-                       taskstats_ver,IOTOP_TASKSTATS_VERSION
+                       "\tThat does not contain the required data and should 
be %u or greater.\n",
+                       taskstats_ver,IOTOP_TASKSTATS_MINVER
                );
 }
 
diff -Nru iotop-c-1.29/src/xxxid_info.c iotop-c-1.30/src/xxxid_info.c
--- iotop-c-1.29/src/xxxid_info.c       2025-05-06 22:08:49.000000000 +0000
+++ iotop-c-1.30/src/xxxid_info.c       2025-05-26 20:36:05.000000000 +0000
@@ -191,29 +191,32 @@
                        na=(struct nlattr *)NLA_DATA(na);
                        while (len2<aggr_len) {
                                if (na->nla_type==TASKSTATS_TYPE_STATS) {
+                                       // NOTE: we use the build system kernel 
headers for the version field only
+                                       // all the data access is done by using 
copies of the respective versions
+                                       // of the kernel headers
+                                       // A patch that will fix the problem is 
proposed to be included in the kernel
+                                       // and the only broken struct taskstats 
will be the one with v15. But we can
+                                       // not rely on the build system kernel 
headers for universal access and have
+                                       // to keep the copies.
+                                       // In this way a build with any kernel 
headers will work everywhere
                                        struct taskstats *ts=NLA_DATA(na);
                                        struct taskstats_v14 *t14=NLA_DATA(na);
                                        struct taskstats_v15 *t15=NLA_DATA(na);
 
-                                       // add a compile time check to raise 
awareness
-                                       #if TASKSTATS_VERSION > 
IOTOP_TASKSTATS_VERSION
-                                       #warning Current kernel implements 
newer struct taskstats, maybe we need a fix for that too
-                                       #endif
-
-                                       if (ts->version<15) { // use v14 for 14 
and below
+                                       if (ts->version<IOTOP_TASKSTATS_MINVER) 
// v3 and below does not have the data we require
+                                               taskstats_ver=ts->version;
+                                       else if (ts->version!=15) { // use v14 
for v4..v14 & v16 onwards
                                                
stats->read_bytes=t14->read_bytes;
                                                
stats->write_bytes=t14->write_bytes;
                                                
stats->swapin_delay_total=t14->swapin_delay_total;
                                                
stats->blkio_delay_total=t14->blkio_delay_total;
                                                stats->euid=t14->ac_uid;
-                                       } else {
+                                       } else { // exception for v15 only
                                                
stats->read_bytes=t15->read_bytes;
                                                
stats->write_bytes=t15->write_bytes;
                                                
stats->swapin_delay_total=t15->swapin_delay_total;
                                                
stats->blkio_delay_total=t15->blkio_delay_total;
                                                stats->euid=t15->ac_uid;
-                                               if 
(ts->version>IOTOP_TASKSTATS_VERSION) // print a warning about running on a 
kernel with maybe incompatible struct taskstats
-                                                       
taskstats_ver=ts->version;
                                        }
                                }
                                len2+=NLA_ALIGN(na->nla_len);

Reply via email to