Author: charles Date: Tue Jun 24 12:36:53 2008 GMT Module: SOURCES Tag: HEAD ---- Log message: - fix (from /var/log/kernel): kernel: WARNING: at fs/inotify.c:172 set_dentry_child_flags() kernel: [<c01b04ff>] set_dentry_child_flags+0xcf/0x160 kernel: [<c01b0c51>] inotify_add_watch+0x101/0x110 kernel: [<c01b1773>] sys_inotify_add_watch+0x153/0x180 kernel: [<c01b0995>] put_inotify_watch+0x35/0x60 kernel: [<c01b0a41>] inotify_rm_wd+0x81/0xb0 kernel: [<c0104232>] sysenter_past_esp+0x6b/0xa1 kernel: =======================
---- Files affected: SOURCES: linux-2.6.22-inotify-fix.patch (NONE -> 1.1) (NEW) ---- Diffs: ================================================================ Index: SOURCES/linux-2.6.22-inotify-fix.patch diff -u /dev/null SOURCES/linux-2.6.22-inotify-fix.patch:1.1 --- /dev/null Tue Jun 24 14:36:54 2008 +++ SOURCES/linux-2.6.22-inotify-fix.patch Tue Jun 24 14:36:48 2008 @@ -0,0 +1,77 @@ +--- linux-2.6.22/fs/dcache.c.orig 2007-07-09 01:32:17.000000000 +0200 ++++ linux-2.6.22/fs/dcache.c 2008-06-24 12:00:23.000000000 +0200 +@@ -1407,9 +1407,6 @@ + if (atomic_read(&dentry->d_count) == 1) { + dentry_iput(dentry); + fsnotify_nameremove(dentry, isdir); +- +- /* remove this and other inotify debug checks after 2.6.18 */ +- dentry->d_flags &= ~DCACHE_INOTIFY_PARENT_WATCHED; + return; + } + +--- linux-2.6.22/fs/inotify.c.orig 2007-07-09 01:32:17.000000000 +0200 ++++ linux-2.6.22/fs/inotify.c 2008-06-24 12:17:40.000000000 +0200 +@@ -168,20 +168,14 @@ + struct dentry *child; + + list_for_each_entry(child, &alias->d_subdirs, d_u.d_child) { +- if (!child->d_inode) { +- WARN_ON(child->d_flags & DCACHE_INOTIFY_PARENT_WATCHED); ++ if (!child->d_inode) + continue; +- } ++ + spin_lock(&child->d_lock); +- if (watched) { +- WARN_ON(child->d_flags & +- DCACHE_INOTIFY_PARENT_WATCHED); ++ if (watched) + child->d_flags |= DCACHE_INOTIFY_PARENT_WATCHED; +- } else { +- WARN_ON(!(child->d_flags & +- DCACHE_INOTIFY_PARENT_WATCHED)); ++ else + child->d_flags&=~DCACHE_INOTIFY_PARENT_WATCHED; +- } + spin_unlock(&child->d_lock); + } + } +@@ -253,7 +247,6 @@ + if (!inode) + return; + +- WARN_ON(entry->d_flags & DCACHE_INOTIFY_PARENT_WATCHED); + spin_lock(&entry->d_lock); + parent = entry->d_parent; + if (parent->d_inode && inotify_inode_watched(parent->d_inode)) +@@ -627,6 +620,7 @@ + struct inode *inode, u32 mask) + { + int ret = 0; ++ int newly_watched; + + /* don't allow invalid bits: we don't want flags set */ + mask &= IN_ALL_EVENTS | IN_ONESHOT; +@@ -653,12 +647,18 @@ + */ + watch->inode = igrab(inode); + +- if (!inotify_inode_watched(inode)) +- set_dentry_child_flags(inode, 1); +- + /* Add the watch to the handle's and the inode's list */ ++ newly_watched = !inotify_inode_watched(inode); + list_add(&watch->h_list, &ih->watches); + list_add(&watch->i_list, &inode->inotify_watches); ++ /* ++ * Set child flags _after_ adding the watch, so there is no race ++ * windows where newly instantiated children could miss their parent's ++ * watched flag. ++ */ ++ if (newly_watched) ++ set_dentry_child_flags(inode, 1); ++ + out: + mutex_unlock(&ih->mutex); + mutex_unlock(&inode->inotify_mutex); ================================================================ _______________________________________________ pld-cvs-commit mailing list pld-cvs-commit@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit