fs/buffer.c | 34 +++++++++++++++------------------- fs/nfs/file.c | 10 +++++----- mm/filemap.c | 2 +- mm/msync.c | 10 +++++----- 4 files changed, 26 insertions(+), 30 deletions(-) diff -puN fs/buffer.c~RD10-i_sem-B6 fs/buffer.c --- 25/fs/buffer.c~RD10-i_sem-B6 2003-10-02 01:36:05.000000000 -0700 +++ 25-akpm/fs/buffer.c 2003-10-02 01:36:05.000000000 -0700 @@ -314,8 +314,7 @@ int file_fsync(struct file *filp, struct asmlinkage long sys_fsync(unsigned int fd) { struct file * file; - struct dentry * dentry; - struct inode * inode; + struct address_space *mapping; int ret, err; ret = -EBADF; @@ -323,8 +322,7 @@ asmlinkage long sys_fsync(unsigned int f if (!file) goto out; - dentry = file->f_dentry; - inode = dentry->d_inode; + mapping = file->f_mapping; ret = -EINVAL; if (!file->f_op || !file->f_op->fsync) { @@ -333,17 +331,17 @@ asmlinkage long sys_fsync(unsigned int f } /* We need to protect against concurrent writers.. */ - down(&inode->i_sem); + down(&mapping->host->i_sem); current->flags |= PF_SYNCWRITE; - ret = filemap_fdatawrite(inode->i_mapping); - err = file->f_op->fsync(file, dentry, 0); + ret = filemap_fdatawrite(mapping); + err = file->f_op->fsync(file, file->f_dentry, 0); if (!ret) ret = err; - err = filemap_fdatawait(inode->i_mapping); + err = filemap_fdatawait(mapping); if (!ret) ret = err; current->flags &= ~PF_SYNCWRITE; - up(&inode->i_sem); + up(&mapping->host->i_sem); out_putf: fput(file); @@ -354,8 +352,7 @@ out: asmlinkage long sys_fdatasync(unsigned int fd) { struct file * file; - struct dentry * dentry; - struct inode * inode; + struct address_space *mapping; int ret, err; ret = -EBADF; @@ -363,24 +360,23 @@ asmlinkage long sys_fdatasync(unsigned i if (!file) goto out; - dentry = file->f_dentry; - inode = dentry->d_inode; - ret = -EINVAL; if (!file->f_op || !file->f_op->fsync) goto out_putf; - down(&inode->i_sem); + mapping = file->f_mapping; + + down(&mapping->host->i_sem); current->flags |= PF_SYNCWRITE; - ret = filemap_fdatawrite(inode->i_mapping); - err = file->f_op->fsync(file, dentry, 1); + ret = filemap_fdatawrite(mapping); + err = file->f_op->fsync(file, file->f_dentry, 1); if (!ret) ret = err; - err = filemap_fdatawait(inode->i_mapping); + err = filemap_fdatawait(mapping); if (!ret) ret = err; current->flags &= ~PF_SYNCWRITE; - up(&inode->i_sem); + up(&mapping->host->i_sem); out_putf: fput(file); diff -puN fs/nfs/file.c~RD10-i_sem-B6 fs/nfs/file.c --- 25/fs/nfs/file.c~RD10-i_sem-B6 2003-10-02 01:36:05.000000000 -0700 +++ 25-akpm/fs/nfs/file.c 2003-10-02 01:36:05.000000000 -0700 @@ -262,7 +262,7 @@ out_swapfile: int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) { - struct inode * inode = filp->f_dentry->d_inode; + struct inode * inode = filp->f_mapping->host; int status = 0; int status2; @@ -305,13 +305,13 @@ nfs_lock(struct file *filp, int cmd, str * Flush all pending writes before doing anything * with locks.. */ - status = filemap_fdatawrite(inode->i_mapping); + status = filemap_fdatawrite(filp->f_mapping); down(&inode->i_sem); status2 = nfs_wb_all(inode); if (!status) status = status2; up(&inode->i_sem); - status2 = filemap_fdatawait(inode->i_mapping); + status2 = filemap_fdatawait(filp->f_mapping); if (!status) status = status2; if (status < 0) @@ -331,11 +331,11 @@ nfs_lock(struct file *filp, int cmd, str */ out_ok: if ((IS_SETLK(cmd) || IS_SETLKW(cmd)) && fl->fl_type != F_UNLCK) { - filemap_fdatawrite(inode->i_mapping); + filemap_fdatawrite(filp->f_mapping); down(&inode->i_sem); nfs_wb_all(inode); /* we may have slept */ up(&inode->i_sem); - filemap_fdatawait(inode->i_mapping); + filemap_fdatawait(filp->f_mapping); nfs_zap_caches(inode); } return status; diff -puN mm/filemap.c~RD10-i_sem-B6 mm/filemap.c --- 25/mm/filemap.c~RD10-i_sem-B6 2003-10-02 01:36:05.000000000 -0700 +++ 25-akpm/mm/filemap.c 2003-10-02 01:36:06.000000000 -0700 @@ -1942,7 +1942,7 @@ EXPORT_SYMBOL(generic_file_readv); ssize_t generic_file_writev(struct file *file, const struct iovec *iov, unsigned long nr_segs, loff_t * ppos) { - struct inode *inode = file->f_dentry->d_inode; + struct inode *inode = file->f_mapping->host; ssize_t ret; down(&inode->i_sem); diff -puN mm/msync.c~RD10-i_sem-B6 mm/msync.c --- 25/mm/msync.c~RD10-i_sem-B6 2003-10-02 01:36:05.000000000 -0700 +++ 25-akpm/mm/msync.c 2003-10-02 01:36:06.000000000 -0700 @@ -146,20 +146,20 @@ static int msync_interval(struct vm_area ret = filemap_sync(vma, start, end-start, flags); if (!ret && (flags & MS_SYNC)) { - struct inode *inode = file->f_dentry->d_inode; + struct address_space *mapping = file->f_mapping; int err; - down(&inode->i_sem); - ret = filemap_fdatawrite(inode->i_mapping); + down(&mapping->host->i_sem); + ret = filemap_fdatawrite(mapping); if (file->f_op && file->f_op->fsync) { err = file->f_op->fsync(file,file->f_dentry,1); if (err && !ret) ret = err; } - err = filemap_fdatawait(inode->i_mapping); + err = filemap_fdatawait(mapping); if (!ret) ret = err; - up(&inode->i_sem); + up(&mapping->host->i_sem); } } return ret; _