Заставьте Inotify корректно генерировать событие IN_UNMOUNT

Привет, я пытался заставить Inotify выдать событие IN_UNMOUNT, но он вообще не сотрудничал со мной, поэтому я пошел и провел простой эксперимент с inotifywait, и вот результат ниже:

paul@imaskar ~ $ inotifywait -r /storage/test/ -m
Setting up watches.  Beware: since -r was given, this may take 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 

В основном происходит то, что он подберет все другие события, такие как создание, открытие и т. д.... но когда я размонтирую /storage/test/, он выдаст IGNORED для всех часов, которые он создал, но он никогда не генерирует событие UNMOUNT...

Таким образом, кажется, что я не могу получить событие IN_UNMOUNT, но во всей документации inotify, которую я прочитал, говорится, что ядро ​​добавит битовый флаг IN_UNMOUNT к событию, когда отслеживаемое резервное хранилище файлов/каталогов было размонтировано...

Вот простой код C из патча Inotify

#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;
}

В любом случае я сделал следующие шаги:

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

# Different shell
sudo umount mnt

И, наконец, вот что он излучает

read 16 bytes
event mask: 8000

Так что на данный момент я не уверен, проблема в коде или в чем-то еще?


person Pharaun    schedule 19.03.2011    source источник


Ответы (1)


Похоже, это ошибка ядра, которая была исправлена ​​в соответствии с LKML. Примерно начиная с ядра 2.6.31 событие IN_UNMOUNT не отправляется при размонтировании инодов... Этот патч был для "34-долгосрочных", также известных как ядро ​​2.6.35(?).

В любом случае я смог обновиться до ядра 2.6.37 и повторно запустить вышеуказанные тесты, и вот результаты:

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


# Different shell
sudo umount mnt

И вот результат:

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 

И в соответствии с примером кода C здесь вывод:

read 32 bytes
event mask: 2000

И глядя на заголовки inotify.h, это правильная маска события для флага IN_UNMOUNT, так что это означает, что он окончательно исправлен ~ 2.6.35 или новее...

person Pharaun    schedule 18.05.2011