diff -u --recursive --new-file linux-2.4.4/fs/nfs/file.c linux-2.4.4-mmap/fs/nfs/file.c --- linux-2.4.4/fs/nfs/file.c Fri Feb 9 20:29:44 2001 +++ linux-2.4.4-mmap/fs/nfs/file.c Thu May 10 12:12:38 2001 @@ -39,6 +39,7 @@ static ssize_t nfs_file_write(struct file *, const char *, size_t, loff_t *); static int nfs_file_flush(struct file *); static int nfs_fsync(struct file *, struct dentry *dentry, int datasync); +static void nfs_file_close_vma(struct vm_area_struct *); struct file_operations nfs_file_operations = { read: nfs_file_read, @@ -57,6 +58,11 @@ setattr: nfs_notify_change, }; +static struct vm_operations_struct nfs_file_vm_ops = { + nopage: filemap_nopage, + close: nfs_file_close_vma, +}; + /* Hack for future NFS swap support */ #ifndef IS_SWAPFILE # define IS_SWAPFILE(inode) (0) @@ -104,6 +110,19 @@ return result; } +static void nfs_file_close_vma(struct vm_area_struct * vma) +{ + struct inode * inode; + + inode = vma->vm_file->f_dentry->d_inode; + + filemap_fdatasync(inode->i_mapping); + down(&inode->i_sem); + nfs_wb_all(inode); + up(&inode->i_sem); + filemap_fdatawait(inode->i_mapping); +} + static int nfs_file_mmap(struct file * file, struct vm_area_struct * vma) { @@ -115,8 +134,11 @@ dentry->d_parent->d_name.name, dentry->d_name.name); status = nfs_revalidate_inode(NFS_SERVER(inode), inode); - if (!status) + if (!status) { status = generic_file_mmap(file, vma); + if (!status) + vma->vm_ops = &nfs_file_vm_ops; + } return status; } @@ -283,9 +305,11 @@ * Flush all pending writes before doing anything * with locks.. */ - down(&filp->f_dentry->d_inode->i_sem); + filemap_fdatasync(inode->i_mapping); + down(&inode->i_sem); status = nfs_wb_all(inode); - up(&filp->f_dentry->d_inode->i_sem); + up(&inode->i_sem); + filemap_fdatawait(inode->i_mapping); if (status < 0) return status; @@ -300,10 +324,12 @@ */ out_ok: if ((cmd == F_SETLK || cmd == F_SETLKW) && fl->fl_type != F_UNLCK) { - down(&filp->f_dentry->d_inode->i_sem); + filemap_fdatasync(inode->i_mapping); + down(&inode->i_sem); nfs_wb_all(inode); /* we may have slept */ + up(&inode->i_sem); + filemap_fdatawait(inode->i_mapping); nfs_zap_caches(inode); - up(&filp->f_dentry->d_inode->i_sem); } return status; } diff -u --recursive --new-file linux-2.4.4/kernel/ksyms.c linux-2.4.4-mmap/kernel/ksyms.c --- linux-2.4.4/kernel/ksyms.c Fri Apr 27 23:23:25 2001 +++ linux-2.4.4-mmap/kernel/ksyms.c Wed May 9 18:05:58 2001 @@ -262,6 +262,8 @@ EXPORT_SYMBOL(dentry_open); EXPORT_SYMBOL(filemap_nopage); EXPORT_SYMBOL(filemap_sync); +EXPORT_SYMBOL(filemap_fdatasync); +EXPORT_SYMBOL(filemap_fdatawait); EXPORT_SYMBOL(lock_page); /* device registration */