diff options
Diffstat (limited to 'fs/ceph/file.c')
| -rw-r--r-- | fs/ceph/file.c | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 56237ea5fc22..b9b8eb225f66 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -457,7 +457,7 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *i, | |||
| 457 | if (ret < 0) | 457 | if (ret < 0) |
| 458 | return ret; | 458 | return ret; |
| 459 | 459 | ||
| 460 | if (file->f_flags & O_DIRECT) { | 460 | if (iocb->ki_flags & IOCB_DIRECT) { |
| 461 | while (iov_iter_count(i)) { | 461 | while (iov_iter_count(i)) { |
| 462 | size_t start; | 462 | size_t start; |
| 463 | ssize_t n; | 463 | ssize_t n; |
| @@ -828,7 +828,7 @@ again: | |||
| 828 | return ret; | 828 | return ret; |
| 829 | 829 | ||
| 830 | if ((got & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)) == 0 || | 830 | if ((got & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)) == 0 || |
| 831 | (iocb->ki_filp->f_flags & O_DIRECT) || | 831 | (iocb->ki_flags & IOCB_DIRECT) || |
| 832 | (fi->flags & CEPH_F_SYNC)) { | 832 | (fi->flags & CEPH_F_SYNC)) { |
| 833 | 833 | ||
| 834 | dout("aio_sync_read %p %llx.%llx %llu~%u got cap refs on %s\n", | 834 | dout("aio_sync_read %p %llx.%llx %llu~%u got cap refs on %s\n", |
| @@ -941,9 +941,9 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
| 941 | struct ceph_inode_info *ci = ceph_inode(inode); | 941 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 942 | struct ceph_osd_client *osdc = | 942 | struct ceph_osd_client *osdc = |
| 943 | &ceph_sb_to_client(inode->i_sb)->client->osdc; | 943 | &ceph_sb_to_client(inode->i_sb)->client->osdc; |
| 944 | ssize_t count = iov_iter_count(from), written = 0; | 944 | ssize_t count, written = 0; |
| 945 | int err, want, got; | 945 | int err, want, got; |
| 946 | loff_t pos = iocb->ki_pos; | 946 | loff_t pos; |
| 947 | 947 | ||
| 948 | if (ceph_snap(inode) != CEPH_NOSNAP) | 948 | if (ceph_snap(inode) != CEPH_NOSNAP) |
| 949 | return -EROFS; | 949 | return -EROFS; |
| @@ -953,14 +953,12 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
| 953 | /* We can write back this queue in page reclaim */ | 953 | /* We can write back this queue in page reclaim */ |
| 954 | current->backing_dev_info = inode_to_bdi(inode); | 954 | current->backing_dev_info = inode_to_bdi(inode); |
| 955 | 955 | ||
| 956 | err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode)); | 956 | err = generic_write_checks(iocb, from); |
| 957 | if (err) | 957 | if (err <= 0) |
| 958 | goto out; | ||
| 959 | |||
| 960 | if (count == 0) | ||
| 961 | goto out; | 958 | goto out; |
| 962 | iov_iter_truncate(from, count); | ||
| 963 | 959 | ||
| 960 | pos = iocb->ki_pos; | ||
| 961 | count = iov_iter_count(from); | ||
| 964 | err = file_remove_suid(file); | 962 | err = file_remove_suid(file); |
| 965 | if (err) | 963 | if (err) |
| 966 | goto out; | 964 | goto out; |
| @@ -997,12 +995,12 @@ retry_snap: | |||
| 997 | inode, ceph_vinop(inode), pos, count, ceph_cap_string(got)); | 995 | inode, ceph_vinop(inode), pos, count, ceph_cap_string(got)); |
| 998 | 996 | ||
| 999 | if ((got & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_LAZYIO)) == 0 || | 997 | if ((got & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_LAZYIO)) == 0 || |
| 1000 | (file->f_flags & O_DIRECT) || (fi->flags & CEPH_F_SYNC)) { | 998 | (iocb->ki_flags & IOCB_DIRECT) || (fi->flags & CEPH_F_SYNC)) { |
| 1001 | struct iov_iter data; | 999 | struct iov_iter data; |
| 1002 | mutex_unlock(&inode->i_mutex); | 1000 | mutex_unlock(&inode->i_mutex); |
| 1003 | /* we might need to revert back to that point */ | 1001 | /* we might need to revert back to that point */ |
| 1004 | data = *from; | 1002 | data = *from; |
| 1005 | if (file->f_flags & O_DIRECT) | 1003 | if (iocb->ki_flags & IOCB_DIRECT) |
| 1006 | written = ceph_sync_direct_write(iocb, &data, pos); | 1004 | written = ceph_sync_direct_write(iocb, &data, pos); |
| 1007 | else | 1005 | else |
| 1008 | written = ceph_sync_write(iocb, &data, pos); | 1006 | written = ceph_sync_write(iocb, &data, pos); |
