/* debug level; defined in include/ceph_fs.h */
-int ceph_debug = 10;
+int ceph_debug = 20;
void ceph_dispatch(struct ceph_client *client, struct ceph_msg *msg);
#include "super.h"
-MODULE_AUTHOR("Patience Warnick <patience@newdream.net>");
-MODULE_DESCRIPTION("Ceph filesystem for Linux");
-MODULE_LICENSE("GPL");
-
struct socket *sock = NULL;
int optval = 1;
struct sockaddr_in *myaddr = &msgr->inst.addr.ipaddr;
-
+ int nlen;
ret = sock_create_kern(AF_INET, SOCK_STREAM, IPPROTO_TCP, &sock);
if (ret < 0) {
- printk(KERN_INFO "sock_create_kern error: %d\n", ret);
+ derr(0, "sock_create_kern error: %d\n", ret);
return ret;
}
ret = kernel_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
(char *)&optval, sizeof(optval));
if (ret < 0) {
- printk("Failed to set SO_REUSEADDR: %d\n", ret);
+ derr(0, "Failed to set SO_REUSEADDR: %d\n", ret);
goto err;
}
/* if (!*myaddr) */
myaddr->sin_family = AF_INET;
myaddr->sin_addr.s_addr = htonl(INADDR_ANY);
- myaddr->sin_port = htons(CEPH_PORT); /* known port for now */
- /* myaddr->sin_port = htons(0); */ /* any port */
- ret = sock->ops->bind(sock, (struct sockaddr *)myaddr,
- sizeof(struct sockaddr_in));
+ //myaddr->sin_port = htons(CEPH_PORT); /* known port for now */
+ myaddr->sin_port = htons(0); /* any port */
+ ret = sock->ops->bind(sock, (struct sockaddr *)myaddr, sizeof(*myaddr));
+ if (ret < 0) {
+ derr(0, "Failed to bind: %d\n", ret);
+ goto err;
+ }
+
+ /* what port did we bind to? */
+ nlen = sizeof(*myaddr);
+ ret = sock->ops->getname(sock, (struct sockaddr *)myaddr, &nlen, 0);
if (ret < 0) {
- printk("Failed to bind to port %d\n", ret);
+ derr(0, "failed to getsockname: %d\n", ret);
goto err;
}
+ dout(0, "ceph_tcp_listen on %x:%d\n",
+ ntohl(myaddr->sin_addr.s_addr),
+ ntohs(myaddr->sin_port));
ret = kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE,
(char *)&optval, sizeof(optval));
if (ret < 0) {
- printk("Failed to set SO_KEEPALIVE: %d\n", ret);
+ derr(0, "Failed to set SO_KEEPALIVE: %d\n", ret);
goto err;
}
/* TBD: probaby want to tune the backlog queue .. */
ret = sock->ops->listen(sock, NUM_BACKUP);
if (ret < 0) {
- printk(KERN_INFO "kernel_listen error: %d\n", ret);
+ derr(0, "kernel_listen error: %d\n", ret);
msgr->listen_sock = NULL;
goto err;
}
con->msgr = msgr;
+ INIT_LIST_HEAD(&con->list_all);
+ INIT_LIST_HEAD(&con->list_bucket);
+ INIT_LIST_HEAD(&con->out_queue);
+ INIT_LIST_HEAD(&con->out_sent);
+
spin_lock_init(&con->con_lock);
set_bit(NEW, &con->state);
INIT_WORK(&con->rwork, try_read); /* setup work structure */
static unsigned long hash_addr(struct ceph_entity_addr *addr)
{
unsigned long key;
- key = *(unsigned long*)&addr->ipaddr.sin_addr.s_addr;
+ key = *(__u32*)&addr->ipaddr.sin_addr.s_addr;
key ^= addr->ipaddr.sin_port;
return key;
}
dout(1, "ceph_messenger_create listening on %x:%d\n",
ntohl(msgr->inst.addr.ipaddr.sin_addr.s_addr),
- ntohl(msgr->inst.addr.ipaddr.sin_port));
+ ntohs(msgr->inst.addr.ipaddr.sin_port));
return msgr;
}
msg->hdr.src = msgr->inst;
/* do we have the connection? */
- spin_lock(&msgr->con_lock);
con = get_connection(msgr, &msg->hdr.dst.addr);
if (!con) {
con = new_connection(msgr);
return PTR_ERR(con);
dout(5, "opening new connection to peer %x:%d\n",
ntohl(msg->hdr.dst.addr.ipaddr.sin_addr.s_addr),
- ntohl(msg->hdr.dst.addr.ipaddr.sin_port));
+ ntohs(msg->hdr.dst.addr.ipaddr.sin_port));
con->peer_addr = msg->hdr.dst.addr;
add_connection(msgr, con);
} else {
dout(5, "had connection to peer %x:%d\n",
ntohl(msg->hdr.dst.addr.ipaddr.sin_addr.s_addr),
- ntohl(msg->hdr.dst.addr.ipaddr.sin_port));
+ ntohs(msg->hdr.dst.addr.ipaddr.sin_port));
}
- spin_unlock(&msgr->con_lock);
spin_lock(&con->con_lock);
if (ret < 0){
derr(1, "connection failure to peer %x:%d\n",
ntohl(msg->hdr.dst.addr.ipaddr.sin_addr.s_addr),
- ntohl(msg->hdr.dst.addr.ipaddr.sin_port));
+ ntohs(msg->hdr.dst.addr.ipaddr.sin_port));
remove_connection(msgr, con);
kfree(con);
return(ret);
}
/* queue */
- dout(1, "queuing outgoing message for %s.%d\n",
+ dout(1, "queuing outgoing message for %s%d\n",
ceph_name_type_str(msg->hdr.dst.name.type), msg->hdr.dst.name.num);
ceph_msg_get(msg);
{Opt_monport, "monport=%d"}
};
-static int parse_ip(char *c, int len, struct ceph_entity_addr *addr)
+/*
+ * FIXME: add error checking to ip parsing
+ */
+static int parse_ip(const char *c, int len, struct ceph_entity_addr *addr)
{
- dout(1, "parse_ip on %s len %d\n", c, len);
+ int i;
+ int v;
+ unsigned ip = 0;
+ char *p = c;
+
+ dout(15, "parse_ip on '%s' len %d\n", c, len);
+ for (i=0; *p && i<4; i++) {
+ v = 0;
+ while (*p && *p != '.' && p < c+len) {
+ if (*p < '0' || *p > '9')
+ goto bad;
+ v = (v * 10) + (*p - '0');
+ p++;
+ }
+ ip = (ip << 8) + v;
+ if (!*p)
+ break;
+ p++;
+ }
+ if (i < 4)
+ goto bad;
+ *(__u32*)&addr->ipaddr.sin_addr.s_addr = htonl(ip);
+ dout(15, "parse_ip got %u.%u.%u.%u\n", ip >> 24, (ip >> 16) & 0xff,
+ (ip >> 8) & 0xff, ip & 0xff);
return 0;
+
+bad:
+ dout(1, "parse_ip bad ip '%s'\n", c);
+ return -EINVAL;
}
static int parse_mount_args(int flags, char *options, const char *dev_name, struct ceph_mount_args *args)
int len;
substring_t argstr[MAX_OPT_ARGS];
- dout(1, "parse_mount_args dev_name %s\n", dev_name);
+ dout(15, "parse_mount_args dev_name '%s'\n", dev_name);
/* defaults */
args->mntflags = flags;
/* get mon ip */
/* er, just one for now. later, comma-separate... */
len = c - dev_name;
- parse_ip(c, len, &args->mon_addr[0]);
+ parse_ip(dev_name, len, &args->mon_addr[0]);
args->mon_addr[0].ipaddr.sin_family = AF_INET;
args->mon_addr[0].ipaddr.sin_port = CEPH_MON_PORT;
args->mon_addr[0].erank = 0;
return -ENAMETOOLONG;
strcpy(args->path, c);
- dout(1, "server path %s\n", args->path);
+ dout(15, "server path '%s'\n", args->path);
/* parse mount options */
while ((c = strsep(&options, ",")) != NULL) {
int error;
int (*compare_super)(struct super_block *, void *) = ceph_compare_super;
- dout(1, "ceph_get_sb\n");
+ dout(5, "ceph_get_sb\n");
error = parse_mount_args(flags, data, dev_name, &mount_args);
if (error < 0)
static void ceph_kill_sb(struct super_block *s)
{
struct ceph_super_info *sbinfo = ceph_sbinfo(s);
- dout(1, "ceph_kill_sb\n");
+ dout(5, "ceph_kill_sb\n");
kill_anon_super(s);
module_init(init_ceph);
module_exit(exit_ceph);
+
+MODULE_AUTHOR("Patience Warnick <patience@newdream.net>");
+MODULE_AUTHOR("Sage Weil <sage@newdream.net>");
+MODULE_DESCRIPTION("Ceph filesystem for Linux");
+MODULE_LICENSE("GPL");