Commit 20aa19ae authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Linus Torvalds

[PATCH] inode time update funnies in ncpfs

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: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d9660d82
......@@ -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) {
......
......@@ -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;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment