From mboxrd@z Thu Jan 1 00:00:00 1970 From: Xiao Ni Subject: Re: [MDADM PATCH 2/2] Give enough time to udev to handle events Date: Sat, 30 Sep 2017 04:14:42 -0400 (EDT) Message-ID: <417094054.15847718.1506759282166.JavaMail.zimbra@redhat.com> References: <1505801207-10096-1-git-send-email-xni@redhat.com> <1505801207-10096-3-git-send-email-xni@redhat.com> <87r2v3qj2o.fsf@notabene.neil.brown.name> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <87r2v3qj2o.fsf@notabene.neil.brown.name> Sender: linux-raid-owner@vger.kernel.org To: NeilBrown Cc: linux-raid@vger.kernel.org, jes sorensen List-Id: linux-raid.ids ----- Original Message ----- > From: "NeilBrown" > To: "Xiao Ni" , linux-raid@vger.kernel.org > Cc: "jes sorensen" > 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