diff -ru clean/linux-2.6.5/fs/attr.c linux-2.6.5/fs/attr.c --- clean/linux-2.6.5/fs/attr.c 2004-04-03 22:36:24.000000000 -0500 +++ linux-2.6.5/fs/attr.c 2004-05-09 21:02:24.000000000 -0400 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -127,6 +128,7 @@ return dn_mask; } + int notify_change(struct dentry * dentry, struct iattr * attr) { struct inode *inode = dentry->d_inode; @@ -184,8 +186,10 @@ } if (!error) { unsigned long dn_mask = setattr_mask(ia_valid); - if (dn_mask) + if (dn_mask) { dnotify_parent(dentry, dn_mask); + inotify_dentry_queue_event (dentry, dn_mask); + } } return error; } diff -ru clean/linux-2.6.5/fs/inode.c linux-2.6.5/fs/inode.c --- clean/linux-2.6.5/fs/inode.c 2004-04-03 22:38:23.000000000 -0500 +++ linux-2.6.5/fs/inode.c 2004-05-09 21:10:12.000000000 -0400 @@ -151,6 +151,10 @@ mapping->backing_dev_info = sb->s_bdev->bd_inode->i_mapping->backing_dev_info; memset(&inode->u, 0, sizeof(inode->u)); inode->i_mapping = mapping; + + INIT_LIST_HEAD(&inode->watchers); + atomic_set (&inode->watcher_count, 0); + inode->watchers_mask = 0; } return inode; } @@ -159,11 +163,15 @@ { if (inode_has_buffers(inode)) BUG(); + /* When an inode gets destroyed it shouldn't have any watchers left on it */ + if (!list_empty (&inode->watchers)) + BUG(); security_inode_free(inode); if (inode->i_sb->s_op->destroy_inode) inode->i_sb->s_op->destroy_inode(inode); else kmem_cache_free(inode_cachep, (inode)); + } diff -ru clean/linux-2.6.5/fs/Makefile linux-2.6.5/fs/Makefile --- clean/linux-2.6.5/fs/Makefile 2004-04-03 22:37:23.000000000 -0500 +++ linux-2.6.5/fs/Makefile 2004-04-20 23:35:17.000000000 -0400 @@ -10,7 +10,7 @@ namei.o fcntl.o ioctl.o readdir.o select.o fifo.o locks.o \ dcache.o inode.o attr.o bad_inode.o file.o dnotify.o \ filesystems.o namespace.o seq_file.o xattr.o libfs.o \ - fs-writeback.o mpage.o direct-io.o aio.o + fs-writeback.o mpage.o direct-io.o aio.o inotify.o obj-$(CONFIG_EPOLL) += eventpoll.o obj-$(CONFIG_COMPAT) += compat.o diff -ru clean/linux-2.6.5/fs/read_write.c linux-2.6.5/fs/read_write.c --- clean/linux-2.6.5/fs/read_write.c 2004-04-03 22:37:36.000000000 -0500 +++ linux-2.6.5/fs/read_write.c 2004-05-09 21:02:14.000000000 -0400 @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -214,8 +215,10 @@ ret = file->f_op->read(file, buf, count, pos); else ret = do_sync_read(file, buf, count, pos); - if (ret > 0) + if (ret > 0) { dnotify_parent(file->f_dentry, DN_ACCESS); + inotify_dentry_queue_event (file->f_dentry, IN_ACCESS); + } } } @@ -258,8 +261,10 @@ ret = file->f_op->write(file, buf, count, pos); else ret = do_sync_write(file, buf, count, pos); - if (ret > 0) + if (ret > 0) { dnotify_parent(file->f_dentry, DN_MODIFY); + inotify_dentry_queue_event (file->f_dentry, IN_MODIFY); + } } } @@ -473,9 +478,12 @@ out: if (iov != iovstack) kfree(iov); - if ((ret + (type == READ)) > 0) + if ((ret + (type == READ)) > 0) { dnotify_parent(file->f_dentry, (type == READ) ? DN_ACCESS : DN_MODIFY); + inotify_dentry_queue_event (file->f_dentry, + (type == READ) ? IN_ACCESS : IN_MODIFY); + } return ret; } diff -ru clean/linux-2.6.5/include/linux/fs.h linux-2.6.5/include/linux/fs.h --- clean/linux-2.6.5/include/linux/fs.h 2004-04-03 22:36:52.000000000 -0500 +++ linux-2.6.5/include/linux/fs.h 2004-05-09 21:06:42.000000000 -0400 @@ -414,6 +414,10 @@ unsigned long i_dnotify_mask; /* Directory notify events */ struct dnotify_struct *i_dnotify; /* for directory notifications */ + struct list_head watchers; + unsigned long watchers_mask; + atomic_t watcher_count; + unsigned long i_state; unsigned long dirtied_when; /* jiffies of first dirtying */ diff -ru clean/linux-2.6.5/include/linux/miscdevice.h linux-2.6.5/include/linux/miscdevice.h --- clean/linux-2.6.5/include/linux/miscdevice.h 2004-04-03 22:37:23.000000000 -0500 +++ linux-2.6.5/include/linux/miscdevice.h 2004-05-08 19:34:04.000000000 -0400 @@ -36,6 +36,8 @@ #define TUN_MINOR 200 +#define INOTIFY_MINOR 99 + struct device; struct miscdevice