RE: [PATCH v2] libnvdimm, pmem: Add sysfs notifications to badblocks

From: Kani, Toshimitsu
Date: Fri Jun 16 2017 - 20:36:20 EST


> On Mon, Jun 12, 2017 at 3:25 PM, Toshi Kani <toshi.kani@xxxxxxx> wrote:
> > Sysfs "badblocks" information may be updated during run-time that:
> > - MCE, SCI, and sysfs "scrub" may add new bad blocks
> > - Writes and ioctl() may clear bad blocks
> >
> > Add support to send sysfs notifications to sysfs "badblocks" file
> > under region and pmem directories when their badblocks information
> > is re-evaluated (but is not necessarily changed) during run-time.
> >
> > Signed-off-by: Toshi Kani <toshi.kani@xxxxxxx>
> > Cc: Dan Williams <dan.j.williams@xxxxxxxxx>
> > Cc: Vishal Verma <vishal.l.verma@xxxxxxxxx>
> > Cc: Linda Knippers <linda.knippers@xxxxxxx>
> > ---
> > v2: Send notifications for the clearing case
> > ---
>
> This looks good to me, I've applied it, but I also want to extend the
> ndctl unit tests to cover this mechanism.

Right. For the time being, would you mind to use the attached test
program for your sanity tests? It simply monitors sysfs notifications
and prints badblocks info... Sorry for inconvenience.

Since I am not familiar with the ndctl unit tests and I am traveling for
the rest of the month, I may have to look into it after I am back.

Thanks!
-Toshi


/*
* Copyright (C) 2017 Hewlett Packard Enterprise Development LP
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
int fd, ret;
fd_set fds;
char buf[256];

if (argc != 2) {
printf("USAGE: test_sysfs_notify badblocks-path\n");
exit(1);
}

if ((fd = open(argv[1], O_RDONLY)) < 0) {
printf("Unable to open %s\n", argv[1]);
exit(1);
}
printf("Monitoring %s - ctl-c to stop\n", argv[1]);

while (1) {
memset(buf, 0, sizeof(buf));
ret = lseek(fd, 0, SEEK_SET);
ret = read(fd, buf, sizeof(buf));
printf("%s\n", buf);

FD_ZERO(&fds);
FD_SET(fd, &fds);

ret = select(fd + 1, NULL, NULL, &fds, NULL);
if (ret <= 0) {
printf("error (%d)\n", ret);
exit(1);
} else if (FD_ISSET(fd, &fds)) {
printf("NOTIFIED!!\n");
}
}

close(fd);
}