aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/mon_client.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-10-27 14:50:50 -0400
committerSage Weil <sage@newdream.net>2009-10-27 14:57:03 -0400
commit6b8051855d983db8480ff1ea1b02ef2b49203c22 (patch)
treeafb72be534ddd4c474a2ec9b7cf2ea5ab86799bc /fs/ceph/mon_client.c
parente53c2fe075feda1fd4f009956ac026dc24c3a199 (diff)
ceph: allocate and parse mount args before client instance
This simplifies much of the error handling during mount. It also means that we have the mount args before client creation, and we can initialize based on those options. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/mon_client.c')
-rw-r--r--fs/ceph/mon_client.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/fs/ceph/mon_client.c b/fs/ceph/mon_client.c
index e6e954cac6b9..61263c99c6a8 100644
--- a/fs/ceph/mon_client.c
+++ b/fs/ceph/mon_client.c
@@ -527,6 +527,40 @@ static void delayed_work(struct work_struct *work)
527 mutex_unlock(&monc->mutex); 527 mutex_unlock(&monc->mutex);
528} 528}
529 529
530/*
531 * On startup, we build a temporary monmap populated with the IPs
532 * provided by mount(2).
533 */
534static int build_initial_monmap(struct ceph_mon_client *monc)
535{
536 struct ceph_mount_args *args = monc->client->mount_args;
537 struct ceph_entity_addr *mon_addr = args->mon_addr;
538 int num_mon = args->num_mon;
539 int i;
540
541 /* build initial monmap */
542 monc->monmap = kzalloc(sizeof(*monc->monmap) +
543 num_mon*sizeof(monc->monmap->mon_inst[0]),
544 GFP_KERNEL);
545 if (!monc->monmap)
546 return -ENOMEM;
547 for (i = 0; i < num_mon; i++) {
548 monc->monmap->mon_inst[i].addr = mon_addr[i];
549 monc->monmap->mon_inst[i].addr.erank = 0;
550 monc->monmap->mon_inst[i].addr.nonce = 0;
551 monc->monmap->mon_inst[i].name.type =
552 CEPH_ENTITY_TYPE_MON;
553 monc->monmap->mon_inst[i].name.num = cpu_to_le64(i);
554 }
555 monc->monmap->num_mon = num_mon;
556
557 /* release addr memory */
558 kfree(args->mon_addr);
559 args->mon_addr = NULL;
560 args->num_mon = 0;
561 return 0;
562}
563
530int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl) 564int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
531{ 565{
532 int err = 0; 566 int err = 0;
@@ -537,6 +571,10 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
537 monc->monmap = NULL; 571 monc->monmap = NULL;
538 mutex_init(&monc->mutex); 572 mutex_init(&monc->mutex);
539 573
574 err = build_initial_monmap(monc);
575 if (err)
576 goto out;
577
540 monc->con = NULL; 578 monc->con = NULL;
541 579
542 /* msg pools */ 580 /* msg pools */