]> git.hungrycats.org Git - linux/commitdiff
[PATCH] inode time update funnies in ncpfs
authorChristoph Hellwig <hch@lst.de>
Tue, 24 Aug 2004 04:45:25 +0000 (21:45 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Tue, 24 Aug 2004 04:45:25 +0000 (21:45 -0700)
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 <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
fs/ncpfs/file.c
fs/ncpfs/mmap.c

index c1745b6f1a3efb3ba53fb28c9900b5dd05804843..4947d9b11fc134f1efa75ad3d47ab274a9cd6c9e 100644 (file)
@@ -115,11 +115,6 @@ ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
 
        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 __user *buf, size_t count, loff_t *ppos)
 
        *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 char __user *buf, size_t count, loff_t *
                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 char __user *buf, size_t count, loff_t *
                }
        }
        vfree(bouncebuffer);
-       inode->i_mtime = inode->i_atime = CURRENT_TIME;
-       
+
+       inode_update_time(inode, 1);
+
        *ppos = pos;
 
        if (pos > inode->i_size) {
index 5fb8e87164873fdaae4da07d77452a9ccec74ebd..52d60c3d8996210dac419106b1dc7862a6fb8856 100644 (file)
@@ -110,23 +110,19 @@ int ncp_mmap(struct file *file, struct vm_area_struct *vma)
        
        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;
 }