Commit 4b9d4a6f authored by Evgeny Sinelnikov's avatar Evgeny Sinelnikov

Fixed mandatory reading for 2.6.28

parent 3951a9f1
......@@ -592,6 +592,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)
{
......@@ -713,7 +756,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,
......
......@@ -1506,13 +1506,9 @@ 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);
}
cFYI(1, ("Invalidating read ahead data on "
"closed file"));
invalidate_remote_inode(direntry->d_inode);
}
}
/* mutex_unlock(&direntry->d_inode->i_mutex); */
......
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