From: Christoph Hellwig ncfpfs seems to update inode times by hand everywhere instead of using the proper helpers. This means: - the atime updates in mmap() and read() seems to miss various checks upodate_atime or one of the wrappers does. Also it doesn't mark the inode dirty. - in write() you update mtime and _a_time instead of ctime as expected, also the usual checks and optimizations are missing. In addition the fops contain some bogus checks like for a refular file (but the fops are only used of ISREG files) and inode->i_sb although that is guranteed to be non-zero. Signed-off-by: Andrew Morton --- 25-akpm/fs/ncpfs/file.c | 21 +++++---------------- 25-akpm/fs/ncpfs/mmap.c | 10 +++------- 2 files changed, 8 insertions(+), 23 deletions(-) diff -puN fs/ncpfs/file.c~inode-time-update-funnies-in-ncpfs fs/ncpfs/file.c --- 25/fs/ncpfs/file.c~inode-time-update-funnies-in-ncpfs 2004-08-20 22:32:00.411621560 -0700 +++ 25-akpm/fs/ncpfs/file.c 2004-08-20 22:32:00.416620800 -0700 @@ -115,11 +115,6 @@ ncp_file_read(struct file *file, char __ if (!ncp_conn_valid(NCP_SERVER(inode))) return -EIO; - if (!S_ISREG(inode->i_mode)) { - DPRINTK("ncp_file_read: read from non-file, mode %07o\n", - inode->i_mode); - return -EINVAL; - } pos = *ppos; @@ -175,10 +170,8 @@ ncp_file_read(struct file *file, char __ *ppos = pos; - if (!IS_RDONLY(inode)) { - inode->i_atime = CURRENT_TIME; - } - + file_accessed(file); + DPRINTK("ncp_file_read: exit %s/%s\n", dentry->d_parent->d_name.name, dentry->d_name.name); outrel: @@ -201,11 +194,6 @@ ncp_file_write(struct file *file, const dentry->d_parent->d_name.name, dentry->d_name.name); if (!ncp_conn_valid(NCP_SERVER(inode))) return -EIO; - if (!S_ISREG(inode->i_mode)) { - DPRINTK("ncp_file_write: write to non-file, mode %07o\n", - inode->i_mode); - return -EINVAL; - } if ((ssize_t) count < 0) return -EINVAL; pos = *ppos; @@ -273,8 +261,9 @@ ncp_file_write(struct file *file, const } } vfree(bouncebuffer); - inode->i_mtime = inode->i_atime = CURRENT_TIME; - + + inode_update_time(inode, 1); + *ppos = pos; if (pos > inode->i_size) { diff -puN fs/ncpfs/mmap.c~inode-time-update-funnies-in-ncpfs fs/ncpfs/mmap.c --- 25/fs/ncpfs/mmap.c~inode-time-update-funnies-in-ncpfs 2004-08-20 22:32:00.412621408 -0700 +++ 25-akpm/fs/ncpfs/mmap.c 2004-08-20 22:32:00.416620800 -0700 @@ -110,23 +110,19 @@ int ncp_mmap(struct file *file, struct v DPRINTK("ncp_mmap: called\n"); - if (!ncp_conn_valid(NCP_SERVER(inode))) { + if (!ncp_conn_valid(NCP_SERVER(inode))) return -EIO; - } + /* only PAGE_COW or read-only supported now */ if (vma->vm_flags & VM_SHARED) return -EINVAL; - if (!inode->i_sb || !S_ISREG(inode->i_mode)) - return -EACCES; /* we do not support files bigger than 4GB... We eventually supports just 4GB... */ if (((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff > (1U << (32 - PAGE_SHIFT))) return -EFBIG; - if (!IS_RDONLY(inode)) { - inode->i_atime = CURRENT_TIME; - } vma->vm_ops = &ncp_file_mmap; + file_accessed(file); return 0; } _