projects
/
GitHub
/
mt8127
/
android_kernel_alcatel_ttab.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
dlm: always use GFP_NOFS
[GitHub/mt8127/android_kernel_alcatel_ttab.git]
/
fs
/
dlm
/
lowcomms.c
diff --git
a/fs/dlm/lowcomms.c
b/fs/dlm/lowcomms.c
index 240cef14fe58b84b95e9c89934e5c322bd896ca6..52cab160893ce0d095e771dd1abe72a4b170162f 100644
(file)
--- a/
fs/dlm/lowcomms.c
+++ b/
fs/dlm/lowcomms.c
@@
-316,6
+316,10
@@
int dlm_lowcomms_connect_node(int nodeid)
{
struct connection *con;
{
struct connection *con;
+ /* with sctp there's no connecting without sending */
+ if (dlm_config.ci_protocol != 0)
+ return 0;
+
if (nodeid == dlm_our_nodeid())
return 0;
if (nodeid == dlm_our_nodeid())
return 0;
@@
-455,9
+459,9
@@
static void process_sctp_notification(struct connection *con,
int prim_len, ret;
int addr_len;
struct connection *new_con;
int prim_len, ret;
int addr_len;
struct connection *new_con;
- struct file *file;
sctp_peeloff_arg_t parg;
int parglen = sizeof(parg);
sctp_peeloff_arg_t parg;
int parglen = sizeof(parg);
+ int err;
/*
* We get this before any data for an association.
/*
* We get this before any data for an association.
@@
-512,19
+516,22
@@
static void process_sctp_notification(struct connection *con,
ret = kernel_getsockopt(con->sock, IPPROTO_SCTP,
SCTP_SOCKOPT_PEELOFF,
(void *)&parg, &parglen);
ret = kernel_getsockopt(con->sock, IPPROTO_SCTP,
SCTP_SOCKOPT_PEELOFF,
(void *)&parg, &parglen);
- if (ret) {
+ if (ret
< 0
) {
log_print("Can't peel off a socket for "
log_print("Can't peel off a socket for "
- "connection %d to node %d: err=%d
\n
",
+ "connection %d to node %d: err=%d",
parg.associd, nodeid, ret);
parg.associd, nodeid, ret);
+ return;
+ }
+ new_con->sock = sockfd_lookup(parg.sd, &err);
+ if (!new_con->sock) {
+ log_print("sockfd_lookup error %d", err);
+ return;
}
}
- file = fget(parg.sd);
- new_con->sock = SOCKET_I(file->f_dentry->d_inode);
add_sock(new_con->sock, new_con);
add_sock(new_con->sock, new_con);
- fput(file);
- put_unused_fd(parg.sd);
+ sockfd_put(new_con->sock);
- log_print("
got new/restarted association %d nodeid
%d",
-
(int)sn->sn_assoc_change.sac_assoc_id, node
id);
+ log_print("
connecting to %d sctp association
%d",
+
nodeid, (int)sn->sn_assoc_change.sac_assoc_
id);
/* Send any pending writes */
clear_bit(CF_CONNECT_PENDING, &new_con->flags);
/* Send any pending writes */
clear_bit(CF_CONNECT_PENDING, &new_con->flags);
@@
-837,8
+844,6
@@
static void sctp_init_assoc(struct connection *con)
if (con->retries++ > MAX_CONNECT_RETRIES)
return;
if (con->retries++ > MAX_CONNECT_RETRIES)
return;
- log_print("Initiating association with node %d", con->nodeid);
-
if (nodeid_to_addr(con->nodeid, (struct sockaddr *)&rem_addr)) {
log_print("no address for nodeid %d", con->nodeid);
return;
if (nodeid_to_addr(con->nodeid, (struct sockaddr *)&rem_addr)) {
log_print("no address for nodeid %d", con->nodeid);
return;
@@
-855,11
+860,14
@@
static void sctp_init_assoc(struct connection *con)
outmessage.msg_flags = MSG_EOR;
spin_lock(&con->writequeue_lock);
outmessage.msg_flags = MSG_EOR;
spin_lock(&con->writequeue_lock);
- e = list_entry(con->writequeue.next, struct writequeue_entry,
- list);
- BUG_ON((struct list_head *) e == &con->writequeue);
+ if (list_empty(&con->writequeue)) {
+ spin_unlock(&con->writequeue_lock);
+ log_print("writequeue empty for nodeid %d", con->nodeid);
+ return;
+ }
+ e = list_first_entry(&con->writequeue, struct writequeue_entry, list);
len = e->len;
offset = e->offset;
spin_unlock(&con->writequeue_lock);
len = e->len;
offset = e->offset;
spin_unlock(&con->writequeue_lock);
@@
-1052,7
+1060,7
@@
static void init_local(void)
if (dlm_our_addr(&sas, i))
break;
if (dlm_our_addr(&sas, i))
break;
- addr = kmalloc(sizeof(*addr), GFP_
KERNEL
);
+ addr = kmalloc(sizeof(*addr), GFP_
NOFS
);
if (!addr)
break;
memcpy(addr, &sas, sizeof(*addr));
if (!addr)
break;
memcpy(addr, &sas, sizeof(*addr));
@@
-1091,7
+1099,7
@@
static int sctp_listen_for_all(void)
struct sockaddr_storage localaddr;
struct sctp_event_subscribe subscribe;
int result = -EINVAL, num = 1, i, addr_len;
struct sockaddr_storage localaddr;
struct sctp_event_subscribe subscribe;
int result = -EINVAL, num = 1, i, addr_len;
- struct connection *con = nodeid2con(0, GFP_
KERNEL
);
+ struct connection *con = nodeid2con(0, GFP_
NOFS
);
int bufsize = NEEDED_RMEM;
if (!con)
int bufsize = NEEDED_RMEM;
if (!con)
@@
-1163,7
+1171,7
@@
out:
static int tcp_listen_for_all(void)
{
struct socket *sock = NULL;
static int tcp_listen_for_all(void)
{
struct socket *sock = NULL;
- struct connection *con = nodeid2con(0, GFP_
KERNEL
);
+ struct connection *con = nodeid2con(0, GFP_
NOFS
);
int result = -EINVAL;
if (!con)
int result = -EINVAL;
if (!con)