@@ -570,6 +570,36 @@ cifs_get_sb(struct file_system_type *fs_type,
return 0;
}
+static ssize_t cifs_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
+ unsigned long nr_segs, loff_t pos)
+{
+ struct inode *inode;
+ struct cifs_sb_info *cifs_sb;
+ ssize_t read;
+
+ inode = iocb->ki_filp->f_path.dentry->d_inode;
+ cifs_sb = CIFS_SB(iocb->ki_filp->f_path.dentry->d_sb);
+
+ if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) == 0) {
+ int retval;
+
+ retval = cifs_revalidate_file(iocb->ki_filp);
+ if (retval < 0)
+ return (loff_t)retval;
+
+ return generic_file_aio_read(iocb, iov, nr_segs, pos);
+ }
+
+ if (!CIFS_I(inode)->clientCanCacheRead) {
+ read = cifs_user_read(iocb->ki_filp, iov->iov_base,
+ iov->iov_len, &pos);
+ iocb->ki_pos = pos;
+ } else
+ read = generic_file_aio_read(iocb, iov, nr_segs, pos);
+
+ return read;
+}
+
static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
unsigned long nr_segs, loff_t pos)
{
@@ -692,7 +722,7 @@ const struct inode_operations cifs_symlink_inode_ops = {
const struct file_operations cifs_file_ops = {
.read = do_sync_read,
.write = do_sync_write,
- .aio_read = generic_file_aio_read,
+ .aio_read = cifs_file_aio_read,
.aio_write = cifs_file_aio_write,
.open = cifs_open,
.release = cifs_close,
@@ -729,7 +759,7 @@ const struct file_operations cifs_file_direct_ops = {
const struct file_operations cifs_file_nobrl_ops = {
.read = do_sync_read,
.write = do_sync_write,
- .aio_read = generic_file_aio_read,
+ .aio_read = cifs_file_aio_read,
.aio_write = cifs_file_aio_write,
.open = cifs_open,
.release = cifs_close,