开发者

Get Inotify to properly emit an IN_UNMOUNT event

Hello I have been trying to get Inotify to yield up a IN_UNMOUNT event but its not cooperating with me at all so I went and did a simple experiment with inotifywait and this is the result below:

paul@imaskar ~ $ inotifywait -r /storage/test/ -m
Setting up watches.  Beware: since -r was given, this may t开发者_StackOverflow中文版ake a while!
Watches established.
/storage/test/ CREATE,ISDIR a
/storage/test/ OPEN,ISDIR a
/storage/test/ CLOSE_NOWRITE,CLOSE,ISDIR a
/storage/test/ DELETE,ISDIR a
/storage/test/a/ DELETE_SELF 
/storage/test/a/ IGNORED 
/storage/test/ IGNORED 

Basically what happens is It will pick up all of the other events such as create, open, etc.... but when I unmounted /storage/test/ it will emit a IGNORED for all watches that it had created, but it never emits a UNMOUNT event...

So it seems like I'm unable to get a IN_UNMOUNT event but all of the inotify documentation that I've read said that the kernel will add a IN_UNMOUNT bitflag to the event when a monitored file/directory backing storage was unmounted...

Here's a simple C code from - Inotify patch

#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>

int main(int argc, char **argv)
{
        char buf[1024];
        struct inotify_event *ie;
        char *p;
        int i;
        ssize_t l;

        p = argv[1];
        i = inotify_init();
        inotify_add_watch(i, p, ~0);

        l = read(i, buf, sizeof(buf));
        printf("read %d bytes\n", l);
        ie = (struct inotify_event *) buf;
        printf("event mask: %x\n", ie->mask);
    return 0;
}

Anyway I did the following steps:

gcc -oinotify inotify.c
mkdir mnt
sudo mount -ttmpfs none mnt
mkdir mnt/d
./inotify mnt/d/

# Different shell
sudo umount mnt

And finally here is what it emits

read 16 bytes
event mask: 8000

So at this point in time I'm not sure if the problem is in the code or something else?


This appears to be a kernel bug which has been fixed as per LKML. Roughly since Kernel 2.6.31 the IN_UNMOUNT event has not been sent when inodes are umounted... This patch was for "34-longterm" aka Kernel 2.6.35(?).

Anyway I was able to upgrade to Kernel 2.6.37 and re-ran the above tests and here's the results:

mkdir mnt
sudo mount -ttmpfs none mnt
mkdir mnt/d
inotifywait -r mnt/d/ -m


# Different shell
sudo umount mnt

And here's the output:

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/tmp/test/d/ UNMOUNT 
/tmp/test/d/ IGNORED 
/tmp/test/ UNMOUNT 
/tmp/test/ IGNORED 

And as per the sample C code here's the output:

read 32 bytes
event mask: 2000

And looking at the inotify.h headers, this is the correct event mask for the IN_UNMOUNT flag so that means its finally fixed ~2.6.35 or latter...

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜