Commit 8139cc9b authored by Evgeny Sinelnikov's avatar Evgeny Sinelnikov

Fixed mandatory reading for 2.6.27

parent 4b9d4a6f
......@@ -588,6 +588,49 @@ cifs_get_sb(struct file_system_type *fs_type,
return simple_set_mnt(mnt, sb);
}
static ssize_t cifs_sync_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
{
int retval, read, posix_locking = 0;
struct file_lock pfLock;
struct cifsInodeInfo *cifsInode;
struct cifs_sb_info *cifs_sb;
struct cifsTconInfo *tcon;
cifs_sb = CIFS_SB(filp->f_path.dentry->d_sb);
tcon = cifs_sb->tcon;
if ((tcon->ses->capabilities & CAP_UNIX) &&
(CIFS_UNIX_FCNTL_CAP & le64_to_cpu(tcon->fsUnixInfo.Capability)) &&
((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOPOSIXBRL) == 0))
posix_locking = 1;
retval = cifs_revalidate(filp->f_path.dentry);
if (retval < 0)
return (ssize_t)retval;
memset(&pfLock, 0, sizeof(pfLock));
pfLock.fl_type = F_RDLCK;
pfLock.fl_start = *ppos;
pfLock.fl_end = *ppos+len;
cifsInode = CIFS_I(filp->f_path.dentry->d_inode);
if (cifsInode == NULL)
return -ENOENT;
if (!CIFS_I(filp->f_path.dentry->d_inode)->clientCanCacheRead && !posix_locking) {
retval = cifs_lock(filp, F_GETLK, &pfLock);
if (retval < 0)
return (ssize_t)retval;
if (pfLock.fl_type == F_UNLCK)
read = do_sync_read(filp, buf, len, ppos);
else
return -EACCES;
} else
read = do_sync_read(filp, buf, len, ppos);
if (read == -EACCES && !posix_locking)
read = cifs_user_read(filp, buf, len, ppos);
return read;
}
static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
unsigned long nr_segs, loff_t pos)
{
......@@ -678,7 +721,7 @@ const struct inode_operations cifs_symlink_inode_ops = {
};
const struct file_operations cifs_file_ops = {
.read = do_sync_read,
.read = cifs_sync_read,
.write = do_sync_write,
.aio_read = generic_file_aio_read,
.aio_write = cifs_file_aio_write,
......
......@@ -1332,15 +1332,11 @@ int cifs_revalidate(struct dentry *direntry)
if (wbrc)
CIFS_I(direntry->d_inode)->write_behind_rc = wbrc;
}
/* may eventually have to do this for open files too */
if (list_empty(&(cifsInode->openFileList))) {
/* changed on server - flush read ahead pages */
cFYI(1, ("Invalidating read ahead data on "
"closed file"));
invalidate_remote_inode(direntry->d_inode);
}
}
}
/* mutex_unlock(&direntry->d_inode->i_mutex); */
kfree(full_path);
......
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