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) ...@@ -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))) if (!ncp_conn_valid(NCP_SERVER(inode)))
return -EIO; 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; pos = *ppos;
...@@ -175,9 +170,7 @@ ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) ...@@ -175,9 +170,7 @@ ncp_file_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
*ppos = pos; *ppos = pos;
if (!IS_RDONLY(inode)) { file_accessed(file);
inode->i_atime = CURRENT_TIME;
}
DPRINTK("ncp_file_read: exit %s/%s\n", DPRINTK("ncp_file_read: exit %s/%s\n",
dentry->d_parent->d_name.name, dentry->d_name.name); dentry->d_parent->d_name.name, dentry->d_name.name);
...@@ -201,11 +194,6 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * ...@@ -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); dentry->d_parent->d_name.name, dentry->d_name.name);
if (!ncp_conn_valid(NCP_SERVER(inode))) if (!ncp_conn_valid(NCP_SERVER(inode)))
return -EIO; 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) if ((ssize_t) count < 0)
return -EINVAL; return -EINVAL;
pos = *ppos; pos = *ppos;
...@@ -273,7 +261,8 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t * ...@@ -273,7 +261,8 @@ ncp_file_write(struct file *file, const char __user *buf, size_t count, loff_t *
} }
} }
vfree(bouncebuffer); vfree(bouncebuffer);
inode->i_mtime = inode->i_atime = CURRENT_TIME;
inode_update_time(inode, 1);
*ppos = pos; *ppos = pos;
......
...@@ -110,23 +110,19 @@ int ncp_mmap(struct file *file, struct vm_area_struct *vma) ...@@ -110,23 +110,19 @@ int ncp_mmap(struct file *file, struct vm_area_struct *vma)
DPRINTK("ncp_mmap: called\n"); DPRINTK("ncp_mmap: called\n");
if (!ncp_conn_valid(NCP_SERVER(inode))) { if (!ncp_conn_valid(NCP_SERVER(inode)))
return -EIO; return -EIO;
}
/* only PAGE_COW or read-only supported now */ /* only PAGE_COW or read-only supported now */
if (vma->vm_flags & VM_SHARED) if (vma->vm_flags & VM_SHARED)
return -EINVAL; return -EINVAL;
if (!inode->i_sb || !S_ISREG(inode->i_mode))
return -EACCES;
/* we do not support files bigger than 4GB... We eventually /* we do not support files bigger than 4GB... We eventually
supports just 4GB... */ supports just 4GB... */
if (((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff if (((vma->vm_end - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff
> (1U << (32 - PAGE_SHIFT))) > (1U << (32 - PAGE_SHIFT)))
return -EFBIG; return -EFBIG;
if (!IS_RDONLY(inode)) {
inode->i_atime = CURRENT_TIME;
}
vma->vm_ops = &ncp_file_mmap; vma->vm_ops = &ncp_file_mmap;
file_accessed(file);
return 0; 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