libceph: don't abort reads in ceph_osdc_abort_on_full()
authorIlya Dryomov <idryomov@gmail.com>
Wed, 30 May 2018 12:58:25 +0000 (14:58 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 4 Jun 2018 18:45:59 +0000 (20:45 +0200)
Don't consider reads for aborting and use ->base_oloc instead of
->target_oloc, as done in __submit_request().

Strictly speaking, we shouldn't be aborting FULL_TRY/FULL_FORCE writes
either.  But, there is an inconsistency in FULL_TRY/FULL_FORCE handling
on the OSD side [1], so given that neither of these is used in the
kernel client, leave it for when the OSD behaviour is sorted out.

[1] http://tracker.ceph.com/issues/24339

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Acked-by: Jeff Layton <jlayton@redhat.com>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
net/ceph/osd_client.c

index 294320400c723c23b640e6619aaaef576f8bfc2c..3d055529189c55e8ae69cbc269051292214decb7 100644 (file)
@@ -2447,8 +2447,9 @@ static int abort_on_full_fn(struct ceph_osd_request *req, void *arg)
        bool *victims = arg;
 
        if (req->r_abort_on_full &&
+           (req->r_flags & CEPH_OSD_FLAG_WRITE) &&
            (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL) ||
-            pool_full(osdc, req->r_t.target_oloc.pool))) {
+            pool_full(osdc, req->r_t.base_oloc.pool))) {
                if (!*victims) {
                        update_epoch_barrier(osdc, osdc->osdmap->epoch);
                        *victims = true;