----- Original Message ----- > From: "NeilBrown" <neilb@xxxxxxxx> > To: "Xiao Ni" <xni@xxxxxxxxxx>, linux-raid@xxxxxxxxxxxxxxx > Cc: "jes sorensen" <jes.sorensen@xxxxxxxxx> > Sent: Tuesday, September 19, 2017 2:49:19 PM > Subject: Re: [MDADM PATCH 2/2] Give enough time to udev to handle events > > On Tue, Sep 19 2017, Xiao Ni wrote: > > > After mdadm -S /dev/md0, the device node /dev/md0 still exists. The Remove > > events are generated by md_free() -> del_gendisk() -> > > blk_unregister_queue(). > > After calling close(mdfd) the Remove events is generated. We should give > > udev > > a little time to handle the event. > > > > I tried usleep(100*1000), but the problem still can be reproduced sometime. > > So I choose to sleep(1). Because after close(mdfd) it can be generated > > CHANGE > > events too. So it's ok to choose to sleep(1) to wait udev to handle CHANGE > > events. > > I really don't like this approach. The fact that 1 second works for you > is no guarantee that it will work for everybody. > We have a few sleeps in the code already, but I don't like them either. > Let's try not to add more. Hi Neil Yes, there are already some sleeps during STOP_ARRAY count = 25; err = 0; while (count && fd >= 0 && (err = ioctl(fd, STOP_ARRAY, NULL)) < 0 && errno == EBUSY) { usleep(200000); count --; } But it doesn't give time to wait for handling udev event which is generated by close(mdfd). Because they are asynchronous, so there is a possibility that the device node still exist after mdadm command exist. > > If there is some event that you want to wait for, wait for that event. > e.g. if you want to wait for /dev/md0 to disappear then write a loop: > > while /dev/md0 exists > usleep(1000) Ok, I'll try this. > > But I'm still not convinced that this is really needed. If it is, then > maybe some sort of kernel fix would be better. > Hmm the reason I focus on this is that there are some bugs about this. After some investigation I know it's that we don't wait for udev remove event. Because the event is generated by mdadm, so we should guarantee the udev event finishes, right? Do you have a better solution for this? The REMOVE event is created by close(mdfd). I don't know how to wait for remove event in kernel space. Best Regards Xiao -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html