diff options
Diffstat (limited to 'fs/notify/notification.c')
| -rw-r--r-- | fs/notify/notification.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/fs/notify/notification.c b/fs/notify/notification.c index 959b73e756fd..521368574e97 100644 --- a/fs/notify/notification.c +++ b/fs/notify/notification.c | |||
| @@ -136,18 +136,24 @@ static bool event_compare(struct fsnotify_event *old, struct fsnotify_event *new | |||
| 136 | { | 136 | { |
| 137 | if ((old->mask == new->mask) && | 137 | if ((old->mask == new->mask) && |
| 138 | (old->to_tell == new->to_tell) && | 138 | (old->to_tell == new->to_tell) && |
| 139 | (old->data_type == new->data_type)) { | 139 | (old->data_type == new->data_type) && |
| 140 | (old->name_len == new->name_len)) { | ||
| 140 | switch (old->data_type) { | 141 | switch (old->data_type) { |
| 141 | case (FSNOTIFY_EVENT_INODE): | 142 | case (FSNOTIFY_EVENT_INODE): |
| 142 | if (old->inode == new->inode) | 143 | /* remember, after old was put on the wait_q we aren't |
| 144 | * allowed to look at the inode any more, only thing | ||
| 145 | * left to check was if the file_name is the same */ | ||
| 146 | if (old->name_len && | ||
| 147 | !strcmp(old->file_name, new->file_name)) | ||
| 143 | return true; | 148 | return true; |
| 144 | break; | 149 | break; |
| 145 | case (FSNOTIFY_EVENT_PATH): | 150 | case (FSNOTIFY_EVENT_PATH): |
| 146 | if ((old->path.mnt == new->path.mnt) && | 151 | if ((old->path.mnt == new->path.mnt) && |
| 147 | (old->path.dentry == new->path.dentry)) | 152 | (old->path.dentry == new->path.dentry)) |
| 148 | return true; | 153 | return true; |
| 154 | break; | ||
| 149 | case (FSNOTIFY_EVENT_NONE): | 155 | case (FSNOTIFY_EVENT_NONE): |
| 150 | return true; | 156 | return false; |
| 151 | }; | 157 | }; |
| 152 | } | 158 | } |
| 153 | return false; | 159 | return false; |
| @@ -339,18 +345,19 @@ static void initialize_event(struct fsnotify_event *event) | |||
| 339 | * @name the filename, if available | 345 | * @name the filename, if available |
| 340 | */ | 346 | */ |
| 341 | struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, void *data, | 347 | struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, void *data, |
| 342 | int data_type, const char *name, u32 cookie) | 348 | int data_type, const char *name, u32 cookie, |
| 349 | gfp_t gfp) | ||
| 343 | { | 350 | { |
| 344 | struct fsnotify_event *event; | 351 | struct fsnotify_event *event; |
| 345 | 352 | ||
| 346 | event = kmem_cache_alloc(fsnotify_event_cachep, GFP_KERNEL); | 353 | event = kmem_cache_alloc(fsnotify_event_cachep, gfp); |
| 347 | if (!event) | 354 | if (!event) |
| 348 | return NULL; | 355 | return NULL; |
| 349 | 356 | ||
| 350 | initialize_event(event); | 357 | initialize_event(event); |
| 351 | 358 | ||
| 352 | if (name) { | 359 | if (name) { |
| 353 | event->file_name = kstrdup(name, GFP_KERNEL); | 360 | event->file_name = kstrdup(name, gfp); |
| 354 | if (!event->file_name) { | 361 | if (!event->file_name) { |
| 355 | kmem_cache_free(fsnotify_event_cachep, event); | 362 | kmem_cache_free(fsnotify_event_cachep, event); |
| 356 | return NULL; | 363 | return NULL; |
