git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'irq-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git]
/
fs
/
notify
/
notification.c
diff --git
a/fs/notify/notification.c
b/fs/notify/notification.c
index
959b73e
..
3816d57
100644
(file)
--- a/
fs/notify/notification.c
+++ b/
fs/notify/notification.c
@@
-136,18
+136,28
@@
static bool event_compare(struct fsnotify_event *old, struct fsnotify_event *new
{
if ((old->mask == new->mask) &&
(old->to_tell == new->to_tell) &&
{
if ((old->mask == new->mask) &&
(old->to_tell == new->to_tell) &&
- (old->data_type == new->data_type)) {
+ (old->data_type == new->data_type) &&
+ (old->name_len == new->name_len)) {
switch (old->data_type) {
case (FSNOTIFY_EVENT_INODE):
switch (old->data_type) {
case (FSNOTIFY_EVENT_INODE):
- if (old->inode == new->inode)
+ /* remember, after old was put on the wait_q we aren't
+ * allowed to look at the inode any more, only thing
+ * left to check was if the file_name is the same */
+ if (old->name_len &&
+ !strcmp(old->file_name, new->file_name))
return true;
break;
case (FSNOTIFY_EVENT_PATH):
if ((old->path.mnt == new->path.mnt) &&
(old->path.dentry == new->path.dentry))
return true;
return true;
break;
case (FSNOTIFY_EVENT_PATH):
if ((old->path.mnt == new->path.mnt) &&
(old->path.dentry == new->path.dentry))
return true;
+ break;
case (FSNOTIFY_EVENT_NONE):
case (FSNOTIFY_EVENT_NONE):
- return true;
+ if (old->mask & FS_Q_OVERFLOW)
+ return true;
+ else if (old->mask & FS_IN_IGNORED)
+ return false;
+ return false;
};
}
return false;
};
}
return false;
@@
-165,9
+175,7
@@
int fsnotify_add_notify_event(struct fsnotify_group *group, struct fsnotify_even
struct list_head *list = &group->notification_list;
struct fsnotify_event_holder *last_holder;
struct fsnotify_event *last_event;
struct list_head *list = &group->notification_list;
struct fsnotify_event_holder *last_holder;
struct fsnotify_event *last_event;
-
- /* easy to tell if priv was attached to the event */
- INIT_LIST_HEAD(&priv->event_list);
+ int ret = 0;
/*
* There is one fsnotify_event_holder embedded inside each fsnotify_event.
/*
* There is one fsnotify_event_holder embedded inside each fsnotify_event.
@@
-188,6
+196,7
@@
alloc_holder:
if (group->q_len >= group->max_events) {
event = &q_overflow_event;
if (group->q_len >= group->max_events) {
event = &q_overflow_event;
+ ret = -EOVERFLOW;
/* sorry, no private data on the overflow event */
priv = NULL;
}
/* sorry, no private data on the overflow event */
priv = NULL;
}
@@
-229,7
+238,7
@@
alloc_holder:
mutex_unlock(&group->notification_mutex);
wake_up(&group->notification_waitq);
mutex_unlock(&group->notification_mutex);
wake_up(&group->notification_waitq);
- return
0
;
+ return
ret
;
}
/*
}
/*
@@
-339,18
+348,19
@@
static void initialize_event(struct fsnotify_event *event)
* @name the filename, if available
*/
struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, void *data,
* @name the filename, if available
*/
struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u32 mask, void *data,
- int data_type, const char *name, u32 cookie)
+ int data_type, const char *name, u32 cookie,
+ gfp_t gfp)
{
struct fsnotify_event *event;
{
struct fsnotify_event *event;
- event = kmem_cache_alloc(fsnotify_event_cachep,
GFP_KERNEL
);
+ event = kmem_cache_alloc(fsnotify_event_cachep,
gfp
);
if (!event)
return NULL;
initialize_event(event);
if (name) {
if (!event)
return NULL;
initialize_event(event);
if (name) {
- event->file_name = kstrdup(name,
GFP_KERNEL
);
+ event->file_name = kstrdup(name,
gfp
);
if (!event->file_name) {
kmem_cache_free(fsnotify_event_cachep, event);
return NULL;
if (!event->file_name) {
kmem_cache_free(fsnotify_event_cachep, event);
return NULL;