|
@@ -807,11 +807,12 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const struct iovec *iov,
|
|
|
unsigned long nr_segs, loff_t pos)
|
|
|
{
|
|
|
struct file *file = iocb->ki_filp;
|
|
|
+ struct ceph_file_info *fi = file->private_data;
|
|
|
struct inode *inode = file->f_dentry->d_inode;
|
|
|
struct ceph_inode_info *ci = ceph_inode(inode);
|
|
|
struct ceph_osd_client *osdc = &ceph_sb_to_client(inode->i_sb)->osdc;
|
|
|
loff_t endoff = pos + iov->iov_len;
|
|
|
- int got = 0;
|
|
|
+ int want, got = 0;
|
|
|
int ret, err;
|
|
|
|
|
|
if (ceph_snap(inode) != CEPH_NOSNAP)
|
|
@@ -824,8 +825,11 @@ retry_snap:
|
|
|
dout("aio_write %p %llx.%llx %llu~%u getting caps. i_size %llu\n",
|
|
|
inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len,
|
|
|
inode->i_size);
|
|
|
- ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, CEPH_CAP_FILE_BUFFER,
|
|
|
- &got, endoff);
|
|
|
+ if (fi->fmode & CEPH_FILE_MODE_LAZY)
|
|
|
+ want = CEPH_CAP_FILE_BUFFER | CEPH_CAP_FILE_LAZYIO;
|
|
|
+ else
|
|
|
+ want = CEPH_CAP_FILE_BUFFER;
|
|
|
+ ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, &got, endoff);
|
|
|
if (ret < 0)
|
|
|
goto out;
|
|
|
|
|
@@ -833,7 +837,7 @@ retry_snap:
|
|
|
inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len,
|
|
|
ceph_cap_string(got));
|
|
|
|
|
|
- if ((got & CEPH_CAP_FILE_BUFFER) == 0 ||
|
|
|
+ if ((got & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_LAZYIO)) == 0 ||
|
|
|
(iocb->ki_filp->f_flags & O_DIRECT) ||
|
|
|
(inode->i_sb->s_flags & MS_SYNCHRONOUS)) {
|
|
|
ret = ceph_sync_write(file, iov->iov_base, iov->iov_len,
|