Hi, I would like to use TAILQ_FOREACH to traverse the disk list. Code is easier to read.
ok? bluhm Index: kern/kern_sysctl.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/kern/kern_sysctl.c,v retrieving revision 1.396 diff -u -p -r1.396 kern_sysctl.c --- kern/kern_sysctl.c 30 Oct 2021 23:24:48 -0000 1.396 +++ kern/kern_sysctl.c 21 Dec 2021 14:23:02 -0000 @@ -121,7 +121,6 @@ extern struct forkstat forkstat; extern struct nchstats nchstats; extern int nselcoll, fscale; -extern struct disklist_head disklist; extern fixpt_t ccpu; extern long numvnodes; extern int allowdt; @@ -2132,14 +2131,14 @@ sysctl_diskinit(int update, struct proc struct diskstats *sdk; struct disk *dk; const char *duid; - int i, tlen, l; + int error, tlen, l; - if ((i = rw_enter(&sysctl_disklock, RW_WRITE|RW_INTR)) != 0) - return i; + if ((error = rw_enter(&sysctl_disklock, RW_WRITE|RW_INTR)) != 0) + return error; if (disk_change) { - for (dk = TAILQ_FIRST(&disklist), tlen = 0; dk; - dk = TAILQ_NEXT(dk, dk_link)) { + tlen = 0; + TAILQ_FOREACH(dk, &disklist, dk_link) { if (dk->dk_name) tlen += strlen(dk->dk_name); tlen += 18; /* label uid + separators */ @@ -2159,8 +2158,9 @@ sysctl_diskinit(int update, struct proc disknameslen = tlen; disknames[0] = '\0'; - for (dk = TAILQ_FIRST(&disklist), i = 0, l = 0; dk; - dk = TAILQ_NEXT(dk, dk_link), i++) { + l = 0; + sdk = diskstats; + TAILQ_FOREACH(dk, &disklist, dk_link) { duid = NULL; if (dk->dk_label && !duid_iszero(dk->dk_label->d_uid)) duid = duid_format(dk->dk_label->d_uid); @@ -2168,7 +2168,6 @@ sysctl_diskinit(int update, struct proc dk->dk_name ? dk->dk_name : "", duid ? duid : ""); l += strlen(disknames + l); - sdk = diskstats + i; strlcpy(sdk->ds_name, dk->dk_name, sizeof(sdk->ds_name)); mtx_enter(&dk->dk_mtx); @@ -2182,6 +2181,7 @@ sysctl_diskinit(int update, struct proc sdk->ds_timestamp = dk->dk_timestamp; sdk->ds_time = dk->dk_time; mtx_leave(&dk->dk_mtx); + sdk++; } /* Eliminate trailing comma */ @@ -2190,9 +2190,8 @@ sysctl_diskinit(int update, struct proc disk_change = 0; } else if (update) { /* Just update, number of drives hasn't changed */ - for (dk = TAILQ_FIRST(&disklist), i = 0; dk; - dk = TAILQ_NEXT(dk, dk_link), i++) { - sdk = diskstats + i; + sdk = diskstats; + TAILQ_FOREACH(dk, &disklist, dk_link) { strlcpy(sdk->ds_name, dk->dk_name, sizeof(sdk->ds_name)); mtx_enter(&dk->dk_mtx); @@ -2206,6 +2205,7 @@ sysctl_diskinit(int update, struct proc sdk->ds_timestamp = dk->dk_timestamp; sdk->ds_time = dk->dk_time; mtx_leave(&dk->dk_mtx); + sdk++; } } rw_exit_write(&sysctl_disklock);