diff options
Diffstat (limited to 'fs/ceph/file.c')
-rw-r--r-- | fs/ceph/file.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index a65acf355384..dd44f3593992 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
@@ -651,7 +651,6 @@ static ssize_t ceph_aio_read(struct kiocb *iocb, const struct iovec *iov, | |||
651 | dout("aio_read %p %llx.%llx %llu~%u trying to get caps on %p\n", | 651 | dout("aio_read %p %llx.%llx %llu~%u trying to get caps on %p\n", |
652 | inode, ceph_vinop(inode), pos, (unsigned)len, inode); | 652 | inode, ceph_vinop(inode), pos, (unsigned)len, inode); |
653 | again: | 653 | again: |
654 | __ceph_do_pending_vmtruncate(inode, true); | ||
655 | if (fi->fmode & CEPH_FILE_MODE_LAZY) | 654 | if (fi->fmode & CEPH_FILE_MODE_LAZY) |
656 | want = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO; | 655 | want = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO; |
657 | else | 656 | else |
@@ -728,7 +727,7 @@ retry_snap: | |||
728 | ret = -ENOSPC; | 727 | ret = -ENOSPC; |
729 | goto out; | 728 | goto out; |
730 | } | 729 | } |
731 | __ceph_do_pending_vmtruncate(inode, true); | 730 | mutex_lock(&inode->i_mutex); |
732 | dout("aio_write %p %llx.%llx %llu~%u getting caps. i_size %llu\n", | 731 | dout("aio_write %p %llx.%llx %llu~%u getting caps. i_size %llu\n", |
733 | inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, | 732 | inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, |
734 | inode->i_size); | 733 | inode->i_size); |
@@ -737,8 +736,10 @@ retry_snap: | |||
737 | else | 736 | else |
738 | want = CEPH_CAP_FILE_BUFFER; | 737 | want = CEPH_CAP_FILE_BUFFER; |
739 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, &got, endoff); | 738 | ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, &got, endoff); |
740 | if (ret < 0) | 739 | if (ret < 0) { |
741 | goto out_put; | 740 | mutex_unlock(&inode->i_mutex); |
741 | goto out; | ||
742 | } | ||
742 | 743 | ||
743 | dout("aio_write %p %llx.%llx %llu~%u got cap refs on %s\n", | 744 | dout("aio_write %p %llx.%llx %llu~%u got cap refs on %s\n", |
744 | inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, | 745 | inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, |
@@ -748,10 +749,10 @@ retry_snap: | |||
748 | (iocb->ki_filp->f_flags & O_DIRECT) || | 749 | (iocb->ki_filp->f_flags & O_DIRECT) || |
749 | (inode->i_sb->s_flags & MS_SYNCHRONOUS) || | 750 | (inode->i_sb->s_flags & MS_SYNCHRONOUS) || |
750 | (fi->flags & CEPH_F_SYNC)) { | 751 | (fi->flags & CEPH_F_SYNC)) { |
752 | mutex_unlock(&inode->i_mutex); | ||
751 | ret = ceph_sync_write(file, iov->iov_base, iov->iov_len, | 753 | ret = ceph_sync_write(file, iov->iov_base, iov->iov_len, |
752 | &iocb->ki_pos); | 754 | &iocb->ki_pos); |
753 | } else { | 755 | } else { |
754 | mutex_lock(&inode->i_mutex); | ||
755 | ret = __generic_file_aio_write(iocb, iov, nr_segs, | 756 | ret = __generic_file_aio_write(iocb, iov, nr_segs, |
756 | &iocb->ki_pos); | 757 | &iocb->ki_pos); |
757 | mutex_unlock(&inode->i_mutex); | 758 | mutex_unlock(&inode->i_mutex); |
@@ -766,7 +767,6 @@ retry_snap: | |||
766 | __mark_inode_dirty(inode, dirty); | 767 | __mark_inode_dirty(inode, dirty); |
767 | } | 768 | } |
768 | 769 | ||
769 | out_put: | ||
770 | dout("aio_write %p %llx.%llx %llu~%u dropping cap refs on %s\n", | 770 | dout("aio_write %p %llx.%llx %llu~%u dropping cap refs on %s\n", |
771 | inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, | 771 | inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len, |
772 | ceph_cap_string(got)); | 772 | ceph_cap_string(got)); |