diff -urNX ../exclude linux-2.3.99pre8-linus/fs/adfs/dir.c linux-2.3.99pre8+lock/fs/adfs/dir.c
--- linux-2.3.99pre8-linus/fs/adfs/dir.c	Tue Apr 25 02:13:25 2000
+++ linux-2.3.99pre8+lock/fs/adfs/dir.c	Sat May 20 04:15:00 2000
@@ -197,6 +197,7 @@
 	read:		generic_read_dir,
 	readdir:	adfs_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 static int
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/affs/dir.c linux-2.3.99pre8+lock/fs/affs/dir.c
--- linux-2.3.99pre8-linus/fs/affs/dir.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/affs/dir.c	Sat May 20 04:10:19 2000
@@ -30,6 +30,7 @@
 	read:		generic_read_dir,
 	readdir:	affs_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 /*
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/autofs/dir.c linux-2.3.99pre8+lock/fs/autofs/dir.c
--- linux-2.3.99pre8-linus/fs/autofs/dir.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/autofs/dir.c	Sat May 20 04:14:10 2000
@@ -45,6 +45,7 @@
 struct file_operations autofs_dir_operations = {
 	read:		generic_read_dir,
 	readdir:	autofs_dir_readdir,
+	fasync:		file_fasync,
 };
 
 struct inode_operations autofs_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/autofs/root.c linux-2.3.99pre8+lock/fs/autofs/root.c
--- linux-2.3.99pre8-linus/fs/autofs/root.c	Mon May 15 07:59:24 2000
+++ linux-2.3.99pre8+lock/fs/autofs/root.c	Sat May 20 04:14:17 2000
@@ -27,6 +27,7 @@
 	read:		generic_read_dir,
 	readdir:	autofs_root_readdir,
 	ioctl:		autofs_root_ioctl,
+	fasync:		file_fasync,
 };
 
 struct inode_operations autofs_root_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/autofs4/root.c linux-2.3.99pre8+lock/fs/autofs4/root.c
--- linux-2.3.99pre8-linus/fs/autofs4/root.c	Mon May 15 07:59:24 2000
+++ linux-2.3.99pre8+lock/fs/autofs4/root.c	Sat May 20 04:15:55 2000
@@ -29,11 +29,13 @@
 	read:		generic_read_dir,
 	readdir:	autofs4_dir_readdir,
 	ioctl:		autofs4_root_ioctl,
+	fasync:		file_fasync,
 };
 
 struct file_operations autofs4_dir_operations = {
 	read:		generic_read_dir,
 	readdir:	autofs4_dir_readdir,
+	fasync:		file_fasync,
 };
 
 struct inode_operations autofs4_root_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/bfs/dir.c linux-2.3.99pre8+lock/fs/bfs/dir.c
--- linux-2.3.99pre8-linus/fs/bfs/dir.c	Sun Mar 12 12:03:45 2000
+++ linux-2.3.99pre8+lock/fs/bfs/dir.c	Sat May 20 04:15:32 2000
@@ -74,6 +74,7 @@
 	read:		generic_read_dir,
 	readdir:	bfs_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 extern void dump_imap(const char *, struct super_block *);
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/coda/dir.c linux-2.3.99pre8+lock/fs/coda/dir.c
--- linux-2.3.99pre8-linus/fs/coda/dir.c	Tue Apr 25 02:11:48 2000
+++ linux-2.3.99pre8+lock/fs/coda/dir.c	Sat May 20 04:14:33 2000
@@ -83,6 +83,7 @@
 	open:		coda_open,
 	release:	coda_release,
 	fsync:		coda_fsync,
+	fasync:		file_fasync,
 };
 
 
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/cramfs/inode.c linux-2.3.99pre8+lock/fs/cramfs/inode.c
--- linux-2.3.99pre8-linus/fs/cramfs/inode.c	Mon May 15 07:59:24 2000
+++ linux-2.3.99pre8+lock/fs/cramfs/inode.c	Sat May 20 04:15:45 2000
@@ -348,6 +348,7 @@
 static struct file_operations cramfs_directory_operations = {
 	read:		generic_read_dir,
 	readdir:	cramfs_readdir,
+	fasync:		file_fasync,
 };
 
 static struct inode_operations cramfs_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/devfs/base.c linux-2.3.99pre8+lock/fs/devfs/base.c
--- linux-2.3.99pre8-linus/fs/devfs/base.c	Mon May 15 07:59:24 2000
+++ linux-2.3.99pre8+lock/fs/devfs/base.c	Sat May 20 04:16:26 2000
@@ -724,6 +724,7 @@
     read:    devfsd_read,
     ioctl:   devfsd_ioctl,
     release: devfsd_close,
+	fasync:	file_fasync,
 };
 
 
@@ -2546,6 +2547,7 @@
     read: devfs_read,
     readdir: devfs_readdir,
     open: devfs_open,
+	fasync:	file_fasync,
 };
 
 
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/devpts/root.c linux-2.3.99pre8+lock/fs/devpts/root.c
--- linux-2.3.99pre8-linus/fs/devpts/root.c	Mon May 15 07:59:24 2000
+++ linux-2.3.99pre8+lock/fs/devpts/root.c	Sat May 20 04:15:12 2000
@@ -23,6 +23,7 @@
 struct file_operations devpts_root_operations = {
 	read:		generic_read_dir,
 	readdir:	devpts_root_readdir,
+	fasync:		file_fasync,
 };
 
 struct inode_operations devpts_root_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/efs/dir.c linux-2.3.99pre8+lock/fs/efs/dir.c
--- linux-2.3.99pre8-linus/fs/efs/dir.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/efs/dir.c	Sat May 20 04:15:18 2000
@@ -11,6 +11,7 @@
 struct file_operations efs_dir_operations = {
 	read:		generic_read_dir,
 	readdir:	efs_readdir,
+	fasync:		file_fasync,
 };
 
 struct inode_operations efs_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/ext2/dir.c linux-2.3.99pre8+lock/fs/ext2/dir.c
--- linux-2.3.99pre8-linus/fs/ext2/dir.c	Sun Mar 19 23:55:33 2000
+++ linux-2.3.99pre8+lock/fs/ext2/dir.c	Sat May 20 03:47:17 2000
@@ -27,6 +27,7 @@
 	readdir:	ext2_readdir,
 	ioctl:		ext2_ioctl,
 	fsync:		ext2_sync_file,
+	fasync:		file_fasync,
 };
 
 int ext2_check_dir_entry (const char * function, struct inode * dir,
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/fat/dir.c linux-2.3.99pre8+lock/fs/fat/dir.c
--- linux-2.3.99pre8-linus/fs/fat/dir.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/fat/dir.c	Sat May 20 04:00:06 2000
@@ -39,6 +39,7 @@
 	readdir:	fat_readdir,
 	ioctl:		fat_dir_ioctl,
 	fsync:		file_fsync,
+	fasync:		file__fasync,
 };
 
 /*
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/hfs/dir_cap.c linux-2.3.99pre8+lock/fs/hfs/dir_cap.c
--- linux-2.3.99pre8-linus/fs/hfs/dir_cap.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/hfs/dir_cap.c	Sat May 20 04:14:40 2000
@@ -61,6 +61,7 @@
 	read:		generic_read_dir,
 	readdir:	cap_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 struct inode_operations hfs_cap_ndir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/hfs/dir_dbl.c linux-2.3.99pre8+lock/fs/hfs/dir_dbl.c
--- linux-2.3.99pre8-linus/fs/hfs/dir_dbl.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/hfs/dir_dbl.c	Sat May 20 04:14:47 2000
@@ -60,6 +60,7 @@
 	read:		generic_read_dir,
 	readdir:	dbl_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 struct inode_operations hfs_dbl_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/hfs/dir_nat.c linux-2.3.99pre8+lock/fs/hfs/dir_nat.c
--- linux-2.3.99pre8-linus/fs/hfs/dir_nat.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/hfs/dir_nat.c	Sat May 20 04:14:53 2000
@@ -66,6 +66,7 @@
 	read:		generic_read_dir,
 	readdir:	nat_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 struct inode_operations hfs_nat_ndir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/hpfs/inode.c linux-2.3.99pre8+lock/fs/hpfs/inode.c
--- linux-2.3.99pre8-linus/fs/hpfs/inode.c	Thu Mar 16 02:05:37 2000
+++ linux-2.3.99pre8+lock/fs/hpfs/inode.c	Sat May 20 04:00:28 2000
@@ -32,6 +32,7 @@
 	open:		hpfs_open,
 	release:	hpfs_dir_release,
 	fsync:		hpfs_file_fsync,
+	fasync:		file_fasync,
 };
 
 static struct inode_operations hpfs_dir_iops =
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/isofs/dir.c linux-2.3.99pre8+lock/fs/isofs/dir.c
--- linux-2.3.99pre8-linus/fs/isofs/dir.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/isofs/dir.c	Sat May 20 04:00:35 2000
@@ -30,6 +30,7 @@
 {
 	read:		generic_read_dir,
 	readdir:	isofs_readdir,
+	fasync:		file_fasync,
 };
 
 /*
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/minix/dir.c linux-2.3.99pre8+lock/fs/minix/dir.c
--- linux-2.3.99pre8-linus/fs/minix/dir.c	Sun Mar 12 12:03:14 2000
+++ linux-2.3.99pre8+lock/fs/minix/dir.c	Sat May 20 04:00:40 2000
@@ -18,6 +18,7 @@
 	read:		generic_read_dir,
 	readdir:	minix_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync;
 };
 
 static int minix_readdir(struct file * filp,
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/namei.c linux-2.3.99pre8+lock/fs/namei.c
--- linux-2.3.99pre8-linus/fs/namei.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/namei.c	Sat May 20 04:42:06 2000
@@ -851,6 +851,9 @@
 	error = dir->i_op->create(dir, dentry, mode);
 exit_lock:
 	up(&dir->i_zombie);
+	if (!error) {
+		inode_send_fasync(dir);
+	}
 	return error;
 }
 
@@ -1068,8 +1076,12 @@
 
 	DQUOT_INIT(dir);
 	error = dir->i_op->mknod(dir, dentry, mode, dev);
+
 exit_lock:
 	up(&dir->i_zombie);
+	if (!error) {
+		inode_send_fasync(dir);
+	}
 	return error;
 }
 
@@ -1137,6 +1149,9 @@
 
 exit_lock:
 	up(&dir->i_zombie);
+	if (!error) {
+		inode_send_fasync(dir);
+	}
 	return error;
 }
 
@@ -1220,6 +1235,9 @@
 		dentry->d_inode->i_flags |= S_DEAD;
 	double_up(&dir->i_zombie, &dentry->d_inode->i_zombie);
 	dput(dentry);
+	if (!error) {
+		inode_send_fasync(dir);
+	}
 
 	return error;
 }
@@ -1279,6 +1297,9 @@
 		}
 	}
 	up(&dir->i_zombie);
+	if (!error) {
+		inode_send_fasync(dir);
+	}
 	return error;
 }
 
@@ -1345,6 +1366,9 @@
 
 exit_lock:
 	up(&dir->i_zombie);
+	if (!error) {
+		inode_send_fasync(dir);
+	}
 	return error;
 }
 
@@ -1417,6 +1441,9 @@
 
 exit_lock:
 	up(&dir->i_zombie);
+	if (!error) {
+		inode_send_fasync(dir);
+	}
 	return error;
 }
 
@@ -1615,10 +1642,16 @@
 int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
 	       struct inode *new_dir, struct dentry *new_dentry)
 {
+	int error;
 	if (S_ISDIR(old_dentry->d_inode->i_mode))
-		return vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
+		error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
 	else
-		return vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
+		error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
+	if (!error) {
+		inode_send_fasync(old_dir);
+		inode_send_fasync(new_dir);
+	}
+	return error;
 }
 
 static inline int do_rename(const char * oldname, const char * newname)
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/ncpfs/dir.c linux-2.3.99pre8+lock/fs/ncpfs/dir.c
--- linux-2.3.99pre8-linus/fs/ncpfs/dir.c	Sun Mar 12 12:03:45 2000
+++ linux-2.3.99pre8+lock/fs/ncpfs/dir.c	Sat May 20 04:09:58 2000
@@ -49,6 +49,7 @@
 	read:		generic_read_dir,
 	readdir:	ncp_readdir,
 	ioctl:		ncp_ioctl,
+	fasync:		file_fasync,
 };
 
 struct inode_operations ncp_dir_inode_operations =
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/nfs/dir.c linux-2.3.99pre8+lock/fs/nfs/dir.c
--- linux-2.3.99pre8-linus/fs/nfs/dir.c	Mon May 15 07:58:45 2000
+++ linux-2.3.99pre8+lock/fs/nfs/dir.c	Sat May 20 04:00:34 2000
@@ -54,6 +54,7 @@
 	readdir:	nfs_readdir,
 	open:		nfs_open,
 	release:	nfs_release,
+	fasync:		file_fasync,
 };
 
 struct inode_operations nfs_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/ntfs/fs.c linux-2.3.99pre8+lock/fs/ntfs/fs.c
--- linux-2.3.99pre8-linus/fs/ntfs/fs.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/ntfs/fs.c	Sat May 20 04:15:07 2000
@@ -577,6 +577,7 @@
 static struct file_operations ntfs_dir_operations = {
 	read:		generic_read_dir,
 	readdir:	ntfs_readdir,
+	fasync:		file_fasync,
 };
 
 static struct inode_operations ntfs_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/open.c linux-2.3.99pre8+lock/fs/open.c
--- linux-2.3.99pre8-linus/fs/open.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/open.c	Sat May 20 04:34:08 2000
@@ -661,6 +661,7 @@
 		if (error)
 			goto cleanup_all;
 	}
+	inode_send_fasync(dentry->d_parent->d_inode);
 	f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
 
 	return f;
@@ -817,6 +818,7 @@
 	retval = 0;
 	if (filp->f_op && filp->f_op->flush)
 		retval = filp->f_op->flush(filp);
+	file_fasync(-1, filp, 0);
 	locks_remove_posix(filp, id);
 	fput(filp);
 	return retval;
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/openpromfs/inode.c linux-2.3.99pre8+lock/fs/openpromfs/inode.c
--- linux-2.3.99pre8-linus/fs/openpromfs/inode.c	Tue Apr 25 02:11:49 2000
+++ linux-2.3.99pre8+lock/fs/openpromfs/inode.c	Sat May 20 04:15:39 2000
@@ -565,6 +565,7 @@
 static struct file_operations openprom_operations = {
 	read:		generic_read_dir,
 	readdir:	openpromfs_readdir,
+	fasync:		file_fasync,
 };
 
 static struct inode_operations openprom_alias_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/pipe.c linux-2.3.99pre8+lock/fs/pipe.c
--- linux-2.3.99pre8-linus/fs/pipe.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/pipe.c	Sat May 20 04:00:59 2000
@@ -388,6 +388,7 @@
 	ioctl:		pipe_ioctl,
 	open:		pipe_read_open,
 	release:	pipe_read_release,
+	fasync:		file_fasync,
 };
 
 struct file_operations write_fifo_fops = {
@@ -398,6 +399,7 @@
 	ioctl:		pipe_ioctl,
 	open:		pipe_write_open,
 	release:	pipe_write_release,
+	fasync:		file_fasync,
 };
 
 struct file_operations rdwr_fifo_fops = {
@@ -408,6 +410,7 @@
 	ioctl:		pipe_ioctl,
 	open:		pipe_rdwr_open,
 	release:	pipe_rdwr_release,
+	fasync:		file_fasync,
 };
 
 struct file_operations read_pipe_fops = {
@@ -418,6 +421,7 @@
 	ioctl:		pipe_ioctl,
 	open:		pipe_read_open,
 	release:	pipe_read_release,
+	fasync:		file_fasync,
 };
 
 struct file_operations write_pipe_fops = {
@@ -438,6 +442,7 @@
 	ioctl:		pipe_ioctl,
 	open:		pipe_rdwr_open,
 	release:	pipe_rdwr_release,
+	fasync:		file_fasync,
 };
 
 struct inode* pipe_new(struct inode* inode)
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/proc/base.c linux-2.3.99pre8+lock/fs/proc/base.c
--- linux-2.3.99pre8-linus/fs/proc/base.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/proc/base.c	Sat May 20 04:00:43 2000
@@ -855,6 +855,7 @@
 static struct file_operations proc_base_operations = {
 	read:		generic_read_dir,
 	readdir:	proc_base_readdir,
+	fasync:		file_fasync,
 };
 
 static struct inode_operations proc_base_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/proc/generic.c linux-2.3.99pre8+lock/fs/proc/generic.c
--- linux-2.3.99pre8-linus/fs/proc/generic.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/proc/generic.c	Sat May 20 04:18:28 2000
@@ -331,6 +331,7 @@
  */
 static struct file_operations proc_dir_operations = {
 	readdir:		proc_readdir,
+	fasync:			file_fasync,
 };
 
 /*
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/proc/root.c linux-2.3.99pre8+lock/fs/proc/root.c
--- linux-2.3.99pre8-linus/fs/proc/root.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/proc/root.c	Sat May 20 04:00:45 2000
@@ -111,7 +111,8 @@
  * directory handling functions for that..
  */
 static struct file_operations proc_root_operations = {
-	readdir:	 proc_root_readdir,
+	readdir:	proc_root_readdir,
+	fasync:		file_fasync,
 };
 
 /*
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/qnx4/dir.c linux-2.3.99pre8+lock/fs/qnx4/dir.c
--- linux-2.3.99pre8-linus/fs/qnx4/dir.c	Sun Mar 12 12:03:15 2000
+++ linux-2.3.99pre8+lock/fs/qnx4/dir.c	Sat May 20 04:14:25 2000
@@ -83,6 +83,7 @@
 	read:		generic_read_dir,
 	readdir:	qnx4_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 struct inode_operations qnx4_dir_inode_operations =
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/ramfs/inode.c linux-2.3.99pre8+lock/fs/ramfs/inode.c
--- linux-2.3.99pre8-linus/fs/ramfs/inode.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/ramfs/inode.c	Sat May 20 04:16:13 2000
@@ -336,6 +336,7 @@
 static struct file_operations ramfs_dir_operations = {
 	read:		generic_read_dir,
 	readdir:	ramfs_readdir,
+	fasync:		file_fasync,
 };
 
 static struct inode_operations ramfs_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/read_write.c linux-2.3.99pre8+lock/fs/read_write.c
--- linux-2.3.99pre8-linus/fs/read_write.c	Tue Apr 25 02:13:26 2000
+++ linux-2.3.99pre8+lock/fs/read_write.c	Sat May 20 04:39:32 2000
@@ -132,6 +132,8 @@
 					ret = read(file, buf, count, &file->f_pos);
 			}
 		}
+		if (!ret)
+			inode_send_fasync(file->f_dentry->d_parent->d_inode);
 		fput(file);
 	}
 	return ret;
@@ -156,6 +158,8 @@
 					ret = write(file, buf, count, &file->f_pos);
 			}
 		}
+		if (!ret)
+			inode_send_fasync(file->f_dentry->d_parent->d_inode);
 		fput(file);
 	}
 	return ret;
@@ -264,6 +268,8 @@
 	if (file->f_op && (file->f_mode & FMODE_READ) &&
 	    (file->f_op->readv || file->f_op->read))
 		ret = do_readv_writev(VERIFY_WRITE, file, vector, count);
+	if (!ret)
+		inode_send_fasync(file->f_dentry->d_parent->d_inode);
 	fput(file);
 
 bad_file:
@@ -284,6 +290,8 @@
 	if (file->f_op && (file->f_mode & FMODE_WRITE) &&
 	    (file->f_op->writev || file->f_op->write))
 		ret = do_readv_writev(VERIFY_READ, file, vector, count);
+	if (!ret)
+		inode_send_fasync(file->f_dentry->d_parent->d_inode);
 	fput(file);
 
 bad_file:
@@ -317,6 +325,8 @@
 	if (pos < 0)
 		goto out;
 	ret = read(file, buf, count, &pos);
+	if (!ret)
+		inode_send_fasync(file->f_dentry->d_parent->d_inode);
 out:
 	fput(file);
 bad_file:
@@ -347,6 +357,8 @@
 		goto out;
 
 	ret = write(file, buf, count, &pos);
+	if (!ret)
+		inode_send_fasync(file->f_dentry->d_parent->d_inode);
 out:
 	fput(file);
 bad_file:
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/romfs/inode.c linux-2.3.99pre8+lock/fs/romfs/inode.c
--- linux-2.3.99pre8-linus/fs/romfs/inode.c	Mon May 15 07:59:25 2000
+++ linux-2.3.99pre8+lock/fs/romfs/inode.c	Sat May 20 04:14:00 2000
@@ -434,6 +434,7 @@
 static struct file_operations romfs_dir_operations = {
 	read:		generic_read_dir,
 	readdir:	romfs_readdir,
+	fasync:		file_fasync,
 };
 
 static struct inode_operations romfs_dir_inode_operations = {
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/smbfs/dir.c linux-2.3.99pre8+lock/fs/smbfs/dir.c
--- linux-2.3.99pre8-linus/fs/smbfs/dir.c	Sun Mar 12 12:03:45 2000
+++ linux-2.3.99pre8+lock/fs/smbfs/dir.c	Sat May 20 04:00:14 2000
@@ -35,6 +35,7 @@
 	readdir:	smb_readdir,
 	ioctl:		smb_ioctl,
 	open:		smb_dir_open,
+	fasync:		file_fasync,
 };
 
 struct inode_operations smb_dir_inode_operations =
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/sysv/dir.c linux-2.3.99pre8+lock/fs/sysv/dir.c
--- linux-2.3.99pre8-linus/fs/sysv/dir.c	Sun Mar 12 12:03:15 2000
+++ linux-2.3.99pre8+lock/fs/sysv/dir.c	Sat May 20 04:00:22 2000
@@ -25,6 +25,7 @@
 	read:		generic_read_dir,
 	readdir:	sysv_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
 
 static int sysv_readdir(struct file * filp, void * dirent, filldir_t filldir)
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/udf/dir.c linux-2.3.99pre8+lock/fs/udf/dir.c
--- linux-2.3.99pre8-linus/fs/udf/dir.c	Sun Mar 12 12:03:30 2000
+++ linux-2.3.99pre8+lock/fs/udf/dir.c	Sat May 20 04:15:26 2000
@@ -53,6 +53,7 @@
 	readdir:			udf_readdir,
 	ioctl:				udf_ioctl,
 	fsync:				udf_sync_file,
+	fasync:				file_fasync,
 };
 
 /*
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/ufs/dir.c linux-2.3.99pre8+lock/fs/ufs/dir.c
--- linux-2.3.99pre8-linus/fs/ufs/dir.c	Sun Mar 19 23:55:33 2000
+++ linux-2.3.99pre8+lock/fs/ufs/dir.c	Sat May 20 04:10:11 2000
@@ -181,4 +181,5 @@
 	read:		generic_read_dir,
 	readdir:	ufs_readdir,
 	fsync:		file_fsync,
+	fasync:		file_fasync,
 };
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/umsdos/dir.c linux-2.3.99pre8+lock/fs/umsdos/dir.c
--- linux-2.3.99pre8-linus/fs/umsdos/dir.c	Tue Apr 25 02:13:26 2000
+++ linux-2.3.99pre8+lock/fs/umsdos/dir.c	Sat May 20 04:00:32 2000
@@ -789,6 +789,7 @@
 	read:		generic_read_dir,
 	readdir:	UMSDOS_readdir,
 	ioctl:		UMSDOS_ioctl_dir,
+	fasync:		file_fasync,
 };
 
 struct inode_operations umsdos_dir_inode_operations =
diff -urNX ../exclude linux-2.3.99pre8-linus/fs/umsdos/rdir.c linux-2.3.99pre8+lock/fs/umsdos/rdir.c
--- linux-2.3.99pre8-linus/fs/umsdos/rdir.c	Sun Mar 12 12:03:45 2000
+++ linux-2.3.99pre8+lock/fs/umsdos/rdir.c	Sat May 20 04:00:30 2000
@@ -223,6 +223,7 @@
 	read:		generic_read_dir,
 	readdir:	UMSDOS_rreaddir,
 	ioctl:		UMSDOS_ioctl_dir,
+	fasync:		file_fasync,
 };
 
 struct inode_operations umsdos_rdir_inode_operations =
diff -urNX ../exclude linux-2.3.99pre8-linus/include/linux/fs.h linux-2.3.99pre8+lock/include/linux/fs.h
--- linux-2.3.99pre8-linus/include/linux/fs.h	Mon May 15 07:59:26 2000
+++ linux-2.3.99pre8+lock/include/linux/fs.h	Sat May 20 04:32:48 2000
@@ -402,6 +403,7 @@
 	struct dquot		*i_dquot[MAXQUOTAS];
 	struct pipe_inode_info	*i_pipe;
 	struct block_device	*i_bdev;
+	struct fasync_struct	*i_fasync;
 
 	unsigned long		i_state;
 
@@ -554,6 +559,16 @@
 	struct	file 		*fa_file;
 };
 
+extern void __kill_fasync(struct fasync_struct *, int, int);
+extern void kill_fasync(struct fasync_struct **, int, int);
+extern int file_fasync(int, struct file *, int);
+#define inode_send_fasync(inode) \
+	kill_fasync(&inode->i_fasync, SIGIO, POLL_MSG)
+#define tty_send_fasync(fa) \
+	kill_fasync(fa, SIGIO, POLL_IN)
+
+extern int fasync_helper(int, struct file *, int, struct fasync_struct **);
+
 struct nameidata {
 	struct dentry *dentry;
 	struct vfsmount *mnt;
