From f1f0be2d20511e5ebf454c145aa7cbef205fc383 Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov Date: Mon, 14 Jan 2013 20:48:07 +0400 Subject: [PATCH] fsnotify: fanotify -- Add collecting of fanotify objects No real restore yet, but only collecting of file entries and marks for simplicity. Ideally, once everything will be ready and tested we will unitfy generic fsnotify restore engine. But for a while for debug reason inotify and fanotify kept separated. Signed-off-by: Cyrill Gorcunov Signed-off-by: Pavel Emelyanov --- fsnotify.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/fsnotify.c b/fsnotify.c index 00c93c45f..069335153 100644 --- a/fsnotify.c +++ b/fsnotify.c @@ -61,6 +61,7 @@ struct fsnotify_file_info { }; static LIST_HEAD(inotify_info_head); +static LIST_HEAD(fanotify_info_head); /* Checks if file desciptor @lfd is inotify */ int is_inotify_link(int lfd) @@ -249,11 +250,22 @@ static int open_inotify_fd(struct file_desc *d) return tmp; } +static int open_fanotify_fd(struct file_desc *d) +{ + /* Stub */ + return -1; +} + static struct file_desc_ops inotify_desc_ops = { .type = FD_TYPES__INOTIFY, .open = open_inotify_fd, }; +static struct file_desc_ops fanotify_desc_ops = { + .type = FD_TYPES__FANOTIFY, + .open = open_fanotify_fd, +}; + static int collect_inotify_mark(struct fsnotify_mark_info *mark) { struct fsnotify_file_info *p; @@ -270,6 +282,22 @@ static int collect_inotify_mark(struct fsnotify_mark_info *mark) return -1; } +static int collect_fanotify_mark(struct fsnotify_mark_info *mark) +{ + struct fsnotify_file_info *p; + + list_for_each_entry(p, &fanotify_info_head, list) { + if (p->ffe->id == mark->fme->id) { + list_add(&mark->list, &p->marks); + mark->remap = lookup_ghost_remap(mark->fme->s_dev, mark->fme->i_ino); + return 0; + } + } + + pr_err("Can't find fanotify with id 0x%08x\n", mark->fme->id); + return -1; +} + static int collect_one_inotify(void *o, ProtobufCMessage *msg) { struct fsnotify_file_info *info = o; @@ -283,6 +311,19 @@ static int collect_one_inotify(void *o, ProtobufCMessage *msg) return 0; } +static int collect_one_fanotify(void *o, ProtobufCMessage *msg) +{ + struct fsnotify_file_info *info = o; + + info->ffe = pb_msg(msg, FanotifyFileEntry); + INIT_LIST_HEAD(&info->marks); + list_add(&info->list, &fanotify_info_head); + file_desc_add(&info->d, info->ffe->id, &fanotify_desc_ops); + pr_info("Collected id 0x%08x flags 0x%08x\n", info->ffe->id, info->ffe->flags); + + return 0; +} + static int collect_one_wd(void *o, ProtobufCMessage *msg) { struct fsnotify_mark_info *mark = o; @@ -291,6 +332,14 @@ static int collect_one_wd(void *o, ProtobufCMessage *msg) return collect_inotify_mark(mark); } +static int collect_one_fanotify_mark(void *o, ProtobufCMessage *msg) +{ + struct fsnotify_mark_info *mark = o; + + mark->iwe = pb_msg(msg, InotifyWdEntry); + return collect_fanotify_mark(mark); +} + int collect_inotify(void) { int ret; @@ -300,6 +349,13 @@ int collect_inotify(void) if (!ret) ret = collect_image(CR_FD_INOTIFY_WD, PB_INOTIFY_WD, sizeof(struct fsnotify_mark_info), collect_one_wd); - + if (!ret) + ret = collect_image(CR_FD_FANOTIFY, PB_FANOTIFY, + sizeof(struct fsnotify_file_info), + collect_one_fanotify); + if (!ret) + ret = collect_image(CR_FD_FANOTIFY_MARK, PB_FANOTIFY_MARK, + sizeof(struct fsnotify_mark_info), + collect_one_fanotify_mark); return ret; }