Skip to content

Commit 92bb062

Browse files
committed
Merge branch 'for-linus' of git://github.com/NewDreamNetwork/ceph-client
* 'for-linus' of git://github.com/NewDreamNetwork/ceph-client: libceph: fix pg_temp mapping update libceph: fix pg_temp mapping calculation libceph: fix linger request requeuing libceph: fix parse options memory leak libceph: initialize ack_stamp to avoid unnecessary connection reset
2 parents 7409b71 + 8adc8b3 commit 92bb062

File tree

4 files changed

+48
-42
lines changed

4 files changed

+48
-42
lines changed

net/ceph/ceph_common.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ void ceph_destroy_options(struct ceph_options *opt)
232232
ceph_crypto_key_destroy(opt->key);
233233
kfree(opt->key);
234234
}
235+
kfree(opt->mon_addr);
235236
kfree(opt);
236237
}
237238
EXPORT_SYMBOL(ceph_destroy_options);

net/ceph/messenger.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,6 +2307,7 @@ struct ceph_msg *ceph_msg_new(int type, int front_len, gfp_t flags)
23072307
m->front_max = front_len;
23082308
m->front_is_vmalloc = false;
23092309
m->more_to_follow = false;
2310+
m->ack_stamp = 0;
23102311
m->pool = NULL;
23112312

23122313
/* middle */

net/ceph/osd_client.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ struct ceph_osd_request *ceph_osdc_alloc_request(struct ceph_osd_client *osdc,
217217
INIT_LIST_HEAD(&req->r_unsafe_item);
218218
INIT_LIST_HEAD(&req->r_linger_item);
219219
INIT_LIST_HEAD(&req->r_linger_osd);
220+
INIT_LIST_HEAD(&req->r_req_lru_item);
220221
req->r_flags = flags;
221222

222223
WARN_ON((flags & (CEPH_OSD_FLAG_READ|CEPH_OSD_FLAG_WRITE)) == 0);
@@ -816,13 +817,10 @@ static void __register_request(struct ceph_osd_client *osdc,
816817
{
817818
req->r_tid = ++osdc->last_tid;
818819
req->r_request->hdr.tid = cpu_to_le64(req->r_tid);
819-
INIT_LIST_HEAD(&req->r_req_lru_item);
820-
821820
dout("__register_request %p tid %lld\n", req, req->r_tid);
822821
__insert_request(osdc, req);
823822
ceph_osdc_get_request(req);
824823
osdc->num_requests++;
825-
826824
if (osdc->num_requests == 1) {
827825
dout(" first request, scheduling timeout\n");
828826
__schedule_osd_timeout(osdc);

net/ceph/osdmap.c

Lines changed: 45 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,7 @@ static int __insert_pg_mapping(struct ceph_pg_mapping *new,
339339
struct ceph_pg_mapping *pg = NULL;
340340
int c;
341341

342+
dout("__insert_pg_mapping %llx %p\n", *(u64 *)&new->pgid, new);
342343
while (*p) {
343344
parent = *p;
344345
pg = rb_entry(parent, struct ceph_pg_mapping, node);
@@ -366,16 +367,33 @@ static struct ceph_pg_mapping *__lookup_pg_mapping(struct rb_root *root,
366367
while (n) {
367368
pg = rb_entry(n, struct ceph_pg_mapping, node);
368369
c = pgid_cmp(pgid, pg->pgid);
369-
if (c < 0)
370+
if (c < 0) {
370371
n = n->rb_left;
371-
else if (c > 0)
372+
} else if (c > 0) {
372373
n = n->rb_right;
373-
else
374+
} else {
375+
dout("__lookup_pg_mapping %llx got %p\n",
376+
*(u64 *)&pgid, pg);
374377
return pg;
378+
}
375379
}
376380
return NULL;
377381
}
378382

383+
static int __remove_pg_mapping(struct rb_root *root, struct ceph_pg pgid)
384+
{
385+
struct ceph_pg_mapping *pg = __lookup_pg_mapping(root, pgid);
386+
387+
if (pg) {
388+
dout("__remove_pg_mapping %llx %p\n", *(u64 *)&pgid, pg);
389+
rb_erase(&pg->node, root);
390+
kfree(pg);
391+
return 0;
392+
}
393+
dout("__remove_pg_mapping %llx dne\n", *(u64 *)&pgid);
394+
return -ENOENT;
395+
}
396+
379397
/*
380398
* rbtree of pg pool info
381399
*/
@@ -711,7 +729,6 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
711729
void *start = *p;
712730
int err = -EINVAL;
713731
u16 version;
714-
struct rb_node *rbp;
715732

716733
ceph_decode_16_safe(p, end, version, bad);
717734
if (version > CEPH_OSDMAP_INC_VERSION) {
@@ -861,7 +878,6 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
861878
}
862879

863880
/* new_pg_temp */
864-
rbp = rb_first(&map->pg_temp);
865881
ceph_decode_32_safe(p, end, len, bad);
866882
while (len--) {
867883
struct ceph_pg_mapping *pg;
@@ -872,18 +888,6 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
872888
ceph_decode_copy(p, &pgid, sizeof(pgid));
873889
pglen = ceph_decode_32(p);
874890

875-
/* remove any? */
876-
while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping,
877-
node)->pgid, pgid) <= 0) {
878-
struct ceph_pg_mapping *cur =
879-
rb_entry(rbp, struct ceph_pg_mapping, node);
880-
881-
rbp = rb_next(rbp);
882-
dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid);
883-
rb_erase(&cur->node, &map->pg_temp);
884-
kfree(cur);
885-
}
886-
887891
if (pglen) {
888892
/* insert */
889893
ceph_decode_need(p, end, pglen*sizeof(u32), bad);
@@ -903,17 +907,11 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end,
903907
}
904908
dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid,
905909
pglen);
910+
} else {
911+
/* remove */
912+
__remove_pg_mapping(&map->pg_temp, pgid);
906913
}
907914
}
908-
while (rbp) {
909-
struct ceph_pg_mapping *cur =
910-
rb_entry(rbp, struct ceph_pg_mapping, node);
911-
912-
rbp = rb_next(rbp);
913-
dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid);
914-
rb_erase(&cur->node, &map->pg_temp);
915-
kfree(cur);
916-
}
917915

918916
/* ignore the rest */
919917
*p = end;
@@ -1046,29 +1044,32 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid,
10461044
struct ceph_pg_mapping *pg;
10471045
struct ceph_pg_pool_info *pool;
10481046
int ruleno;
1049-
unsigned poolid, ps, pps;
1047+
unsigned poolid, ps, pps, t;
10501048
int preferred;
10511049

1050+
poolid = le32_to_cpu(pgid.pool);
1051+
ps = le16_to_cpu(pgid.ps);
1052+
preferred = (s16)le16_to_cpu(pgid.preferred);
1053+
1054+
pool = __lookup_pg_pool(&osdmap->pg_pools, poolid);
1055+
if (!pool)
1056+
return NULL;
1057+
10521058
/* pg_temp? */
1059+
if (preferred >= 0)
1060+
t = ceph_stable_mod(ps, le32_to_cpu(pool->v.lpg_num),
1061+
pool->lpgp_num_mask);
1062+
else
1063+
t = ceph_stable_mod(ps, le32_to_cpu(pool->v.pg_num),
1064+
pool->pgp_num_mask);
1065+
pgid.ps = cpu_to_le16(t);
10531066
pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid);
10541067
if (pg) {
10551068
*num = pg->len;
10561069
return pg->osds;
10571070
}
10581071

10591072
/* crush */
1060-
poolid = le32_to_cpu(pgid.pool);
1061-
ps = le16_to_cpu(pgid.ps);
1062-
preferred = (s16)le16_to_cpu(pgid.preferred);
1063-
1064-
/* don't forcefeed bad device ids to crush */
1065-
if (preferred >= osdmap->max_osd ||
1066-
preferred >= osdmap->crush->max_devices)
1067-
preferred = -1;
1068-
1069-
pool = __lookup_pg_pool(&osdmap->pg_pools, poolid);
1070-
if (!pool)
1071-
return NULL;
10721073
ruleno = crush_find_rule(osdmap->crush, pool->v.crush_ruleset,
10731074
pool->v.type, pool->v.size);
10741075
if (ruleno < 0) {
@@ -1078,6 +1079,11 @@ static int *calc_pg_raw(struct ceph_osdmap *osdmap, struct ceph_pg pgid,
10781079
return NULL;
10791080
}
10801081

1082+
/* don't forcefeed bad device ids to crush */
1083+
if (preferred >= osdmap->max_osd ||
1084+
preferred >= osdmap->crush->max_devices)
1085+
preferred = -1;
1086+
10811087
if (preferred >= 0)
10821088
pps = ceph_stable_mod(ps,
10831089
le32_to_cpu(pool->v.lpgp_num),

0 commit comments

Comments
 (0)