]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
some bits, untested
authorsageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Fri, 2 Nov 2007 16:58:03 +0000 (16:58 +0000)
committersageweil <sageweil@29311d96-e01e-0410-9327-a35deaab8ce9>
Fri, 2 Nov 2007 16:58:03 +0000 (16:58 +0000)
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@2012 29311d96-e01e-0410-9327-a35deaab8ce9

trunk/ceph/kernel/bufferlist.h
trunk/ceph/kernel/kmsg.h
trunk/ceph/kernel/messenger.c

index dca3012a5251eac822910b416a707648754cf9d9..01ece237dce4cf5e91fc818f409f814ad59e5dfd 100644 (file)
@@ -18,6 +18,7 @@ struct ceph_bufferlist {
        struct kvec b_kv_array[CEPH_BUFFERLIST_START_KVLEN];  
        size_t b_kvlen;          /* used/defined elements in b_kv */         
        size_t b_kvmax;          /* allocated size of b_kv array */
+       size_t b_len;            /* size in bytes of _entire_ bufferlist */
        struct kvec b_append; /* preallocated memory for appending data to this bufferlist */
 };
 
index 6059e6f93b6a4cd541d8cc8655155c7d35545ea0..af7a6fbc485d5266980efa9f211265faf2698f79 100644 (file)
@@ -21,7 +21,7 @@ struct ceph_message {
        atomic_t nref;
        int mflags;
        struct ceph_message_header *msghdr;     /* header */
-       struct ceph_bufferlist *payload;
+       struct ceph_bufferlist payload;
        struct list_head m_list_head;
 };
 
index 972fb9b80ef7856f58e183b72da2af4f66b36660..0657a8734fcd09071d5b84b939081d3c5699479f 100644 (file)
@@ -23,30 +23,28 @@ static struct ceph_message *ceph_read_message(struct socket *sd)
        int ret;
        int received = 0;
        struct ceph_message *message;
-       struct ceph_message_header env;
        struct kvec *iov;
        int i;
 
        message = kmalloc(sizeof(struct ceph_message), GFP_KERNEL);
-       message->payload = kmalloc(sizeof(struct ceph_bufferlist),GFP_KERNEL);
-       if (message == NULL || message->payload == NULL){
+       if (message == NULL){
                printk(KERN_INFO "malloc failure\n");
                return NULL;
        }
 
-       ceph_bl_init(message->payload);
-       iov = message->payload->b_kv;
+       ceph_bl_init(&message->payload);
+       iov = message->payload.b_kv;
 
        /* first read in the message header */
-       if (!_krecvmsg(sd, (char*)&env, sizeof(env), 0 )) {
+       if (!_krecvmsg(sd, (char*)&message->env, sizeof(message->env), 0 )) {
                return(NULL);
        }
-       printk(KERN_INFO "reader got envelope type = %d \n" , env.type);
-       printk(KERN_INFO "num chunks = %d \n" , env.nchunks);
+       printk(KERN_INFO "reader got envelope type = %d \n" , message->env.type);
+       printk(KERN_INFO "num chunks = %d \n" , message->env.nchunks);
 /* TBD: print to info file rest of env */
 
        /* receive request in chunks */
-       for (i = 0; i < env.nchunks; i++) {
+       for (i = 0; i < message->env.nchunks; i++) {
                u32 size = 0;
                void *iov_base = NULL;
                ret = _krecvmsg(sd, (char*)&size, sizeof(size), 0);
@@ -63,7 +61,7 @@ static struct ceph_message *ceph_read_message(struct socket *sd)
                /* TBD:  place in bufferlist (payload) */
                received += ret;  /* keep track of complete size?? */
        }
-       message->payload->b_kvlen = i;
+       message->payload.b_kvlen = i;
        /* unmarshall message */
 
        return(message);
@@ -76,14 +74,26 @@ static int ceph_send_message(struct ceph_message *message, struct socket *sd)
 {
        int ret;
        int sent = 0;
-       int len = message->payload->b_kvlen;
-       struct kvec *iov = message->payload->b_kv;
-       struct ceph_message_header *msghdr = message->msghdr;
-       struct ceph_bufferlist blist;
-
-       /* marshall/encode message */
-       /* send in chunks */
-       return sent;
+       __u32 chunklen;
+       struct kvec *iov = message->payload.b_kv;
+       int len = message->payload.b_kvlen;
+       int i;
+
+       /* add error handling */
+
+       /* header */
+       message->env.nchunks = 1;  /* for now */
+
+       _ksendmsg(sd, (char*)&message->env, sizeof(message->env));
+
+       /* send in in single large chunk */
+       chunklen = message->payload.b_len;
+       _ksendmsg(sd, (char*)&chunklen, sizeof(chunklen));
+       for (i=0; i<len; i++) {
+               _ksendmsg(sd, (char&)iov[i].iov_base, iov[i].iov_len);
+       }
+
+       return 0;
 }
 /*
  * The following functions are just for testing the comms stuff...