]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: fix filter lifecycle in do_osd_ops
authorSage Weil <sage@redhat.com>
Fri, 7 Aug 2015 14:49:26 +0000 (10:49 -0400)
committerSage Weil <sage@redhat.com>
Fri, 7 Aug 2015 19:58:26 +0000 (15:58 -0400)
If we take an error path in [N]PGLS (objects_list_partial error
or bad handle) and FAILOK is set we may exec a second filter op
that reallocates a new filter without freeing the old one.

Simplify by freeing only at the end of the function or when a new
filter is (re)allocated.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/ReplicatedPG.cc

index e810d48d23e8142ede3afb7cc61c683a31c2da70..4f550acfc068cc5a50504677d3bdec4c3d672ac8 100644 (file)
@@ -799,6 +799,10 @@ void ReplicatedPG::do_pg_op(OpRequestRef op)
        result = -EINVAL;
        break;
       }
+      if (filter) {
+       delete filter;
+       filter = NULL;
+      }
       result = get_pgls_filter(bp, &filter);
       if (result < 0)
         break;
@@ -942,8 +946,6 @@ void ReplicatedPG::do_pg_op(OpRequestRef op)
        dout(10) << " pgnls result=" << result << " outdata.length()="
                 << osd_op.outdata.length() << dendl;
       }
-      delete filter;
-      filter = NULL;
       break;
 
     case CEPH_OSD_OP_PGLS_FILTER:
@@ -956,6 +958,10 @@ void ReplicatedPG::do_pg_op(OpRequestRef op)
        result = -EINVAL;
        break;
       }
+      if (filter) {
+       delete filter;
+       filter = NULL;
+      }
       result = get_pgls_filter(bp, &filter);
       if (result < 0)
         break;
@@ -1091,8 +1097,6 @@ void ReplicatedPG::do_pg_op(OpRequestRef op)
        dout(10) << " pgls result=" << result << " outdata.length()="
                 << osd_op.outdata.length() << dendl;
       }
-      delete filter;
-      filter = NULL;
       break;
 
     case CEPH_OSD_OP_PG_HITSET_LS: