Two fixes for the buffered reads and O_DIRECT writes serialization
patch that went into -rc1 and a fixup for a bogus warning on older gcc versions. -----BEGIN PGP SIGNATURE----- iQFHBAABCAAxFiEEydHwtzie9C7TfviiSn/eOAIR84sFAl3O2RMTHGlkcnlvbW92 QGdtYWlsLmNvbQAKCRBKf944AhHzi+k6CACf0hUTyWcJaiH3WAmkpKOnZVG//Ghv +hDWskib0gSilW+mx8Cjsndb5rXVuE4MhZ9P1VD1MMhhfVlfTUspCPG6cIQ3B3gd jEVLHDALaMc/tpKwa6EbxvxQRAL5D/2Umh8aK1kVMX2U9R6KKfMiRVToHVPewSkS eM3HJuV0kUonnD6glHyie1iwI9iFkDgt+eTJR1hpiFx26y6TwVCH5RNNvZGr0Tcf KMLgwAHxIowx0SxblvbJTMf1iIoPJNiUuZyBoo0Hli9hI7S/b4XfARAkD9eud02d 4shv7D9Js0V1tKDsfV/c8UpnOgBTGEY4AEXIN3Mm6Gk6q9pMnobWt+l8 =kIHR -----END PGP SIGNATURE----- Merge tag 'ceph-for-5.4-rc8' of git://github.com/ceph/ceph-client Pull ceph fixes from Ilya Dryomov: "Two fixes for the buffered reads and O_DIRECT writes serialization patch that went into -rc1 and a fixup for a bogus warning on older gcc versions" * tag 'ceph-for-5.4-rc8' of git://github.com/ceph/ceph-client: rbd: silence bogus uninitialized warning in rbd_object_map_update_finish() ceph: increment/decrement dio counter on async requests ceph: take the inode lock before acquiring cap refs
This commit is contained in:
commit
875fef493f
|
@ -2087,7 +2087,7 @@ static int rbd_object_map_update_finish(struct rbd_obj_request *obj_req,
|
||||||
struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
|
struct rbd_device *rbd_dev = obj_req->img_request->rbd_dev;
|
||||||
struct ceph_osd_data *osd_data;
|
struct ceph_osd_data *osd_data;
|
||||||
u64 objno;
|
u64 objno;
|
||||||
u8 state, new_state, current_state;
|
u8 state, new_state, uninitialized_var(current_state);
|
||||||
bool has_current_state;
|
bool has_current_state;
|
||||||
void *p;
|
void *p;
|
||||||
|
|
||||||
|
|
|
@ -753,6 +753,9 @@ static void ceph_aio_complete(struct inode *inode,
|
||||||
if (!atomic_dec_and_test(&aio_req->pending_reqs))
|
if (!atomic_dec_and_test(&aio_req->pending_reqs))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (aio_req->iocb->ki_flags & IOCB_DIRECT)
|
||||||
|
inode_dio_end(inode);
|
||||||
|
|
||||||
ret = aio_req->error;
|
ret = aio_req->error;
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = aio_req->total_len;
|
ret = aio_req->total_len;
|
||||||
|
@ -1091,6 +1094,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
|
||||||
CEPH_CAP_FILE_RD);
|
CEPH_CAP_FILE_RD);
|
||||||
|
|
||||||
list_splice(&aio_req->osd_reqs, &osd_reqs);
|
list_splice(&aio_req->osd_reqs, &osd_reqs);
|
||||||
|
inode_dio_begin(inode);
|
||||||
while (!list_empty(&osd_reqs)) {
|
while (!list_empty(&osd_reqs)) {
|
||||||
req = list_first_entry(&osd_reqs,
|
req = list_first_entry(&osd_reqs,
|
||||||
struct ceph_osd_request,
|
struct ceph_osd_request,
|
||||||
|
@ -1264,14 +1268,24 @@ again:
|
||||||
dout("aio_read %p %llx.%llx %llu~%u trying to get caps on %p\n",
|
dout("aio_read %p %llx.%llx %llu~%u trying to get caps on %p\n",
|
||||||
inode, ceph_vinop(inode), iocb->ki_pos, (unsigned)len, inode);
|
inode, ceph_vinop(inode), iocb->ki_pos, (unsigned)len, inode);
|
||||||
|
|
||||||
|
if (iocb->ki_flags & IOCB_DIRECT)
|
||||||
|
ceph_start_io_direct(inode);
|
||||||
|
else
|
||||||
|
ceph_start_io_read(inode);
|
||||||
|
|
||||||
if (fi->fmode & CEPH_FILE_MODE_LAZY)
|
if (fi->fmode & CEPH_FILE_MODE_LAZY)
|
||||||
want = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO;
|
want = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO;
|
||||||
else
|
else
|
||||||
want = CEPH_CAP_FILE_CACHE;
|
want = CEPH_CAP_FILE_CACHE;
|
||||||
ret = ceph_get_caps(filp, CEPH_CAP_FILE_RD, want, -1,
|
ret = ceph_get_caps(filp, CEPH_CAP_FILE_RD, want, -1,
|
||||||
&got, &pinned_page);
|
&got, &pinned_page);
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
if (iocb->ki_flags & IOCB_DIRECT)
|
||||||
|
ceph_end_io_direct(inode);
|
||||||
|
else
|
||||||
|
ceph_end_io_read(inode);
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
if ((got & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)) == 0 ||
|
if ((got & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)) == 0 ||
|
||||||
(iocb->ki_flags & IOCB_DIRECT) ||
|
(iocb->ki_flags & IOCB_DIRECT) ||
|
||||||
|
@ -1283,16 +1297,12 @@ again:
|
||||||
|
|
||||||
if (ci->i_inline_version == CEPH_INLINE_NONE) {
|
if (ci->i_inline_version == CEPH_INLINE_NONE) {
|
||||||
if (!retry_op && (iocb->ki_flags & IOCB_DIRECT)) {
|
if (!retry_op && (iocb->ki_flags & IOCB_DIRECT)) {
|
||||||
ceph_start_io_direct(inode);
|
|
||||||
ret = ceph_direct_read_write(iocb, to,
|
ret = ceph_direct_read_write(iocb, to,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
ceph_end_io_direct(inode);
|
|
||||||
if (ret >= 0 && ret < len)
|
if (ret >= 0 && ret < len)
|
||||||
retry_op = CHECK_EOF;
|
retry_op = CHECK_EOF;
|
||||||
} else {
|
} else {
|
||||||
ceph_start_io_read(inode);
|
|
||||||
ret = ceph_sync_read(iocb, to, &retry_op);
|
ret = ceph_sync_read(iocb, to, &retry_op);
|
||||||
ceph_end_io_read(inode);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
retry_op = READ_INLINE;
|
retry_op = READ_INLINE;
|
||||||
|
@ -1303,11 +1313,10 @@ again:
|
||||||
inode, ceph_vinop(inode), iocb->ki_pos, (unsigned)len,
|
inode, ceph_vinop(inode), iocb->ki_pos, (unsigned)len,
|
||||||
ceph_cap_string(got));
|
ceph_cap_string(got));
|
||||||
ceph_add_rw_context(fi, &rw_ctx);
|
ceph_add_rw_context(fi, &rw_ctx);
|
||||||
ceph_start_io_read(inode);
|
|
||||||
ret = generic_file_read_iter(iocb, to);
|
ret = generic_file_read_iter(iocb, to);
|
||||||
ceph_end_io_read(inode);
|
|
||||||
ceph_del_rw_context(fi, &rw_ctx);
|
ceph_del_rw_context(fi, &rw_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
dout("aio_read %p %llx.%llx dropping cap refs on %s = %d\n",
|
dout("aio_read %p %llx.%llx dropping cap refs on %s = %d\n",
|
||||||
inode, ceph_vinop(inode), ceph_cap_string(got), (int)ret);
|
inode, ceph_vinop(inode), ceph_cap_string(got), (int)ret);
|
||||||
if (pinned_page) {
|
if (pinned_page) {
|
||||||
|
@ -1315,6 +1324,12 @@ again:
|
||||||
pinned_page = NULL;
|
pinned_page = NULL;
|
||||||
}
|
}
|
||||||
ceph_put_cap_refs(ci, got);
|
ceph_put_cap_refs(ci, got);
|
||||||
|
|
||||||
|
if (iocb->ki_flags & IOCB_DIRECT)
|
||||||
|
ceph_end_io_direct(inode);
|
||||||
|
else
|
||||||
|
ceph_end_io_read(inode);
|
||||||
|
|
||||||
if (retry_op > HAVE_RETRIED && ret >= 0) {
|
if (retry_op > HAVE_RETRIED && ret >= 0) {
|
||||||
int statret;
|
int statret;
|
||||||
struct page *page = NULL;
|
struct page *page = NULL;
|
||||||
|
|
Loading…
Reference in New Issue