aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-04-13 17:07:07 -0400
committerSage Weil <sage@newdream.net>2010-04-13 17:07:07 -0400
commita6a5349d17f2a5c37079826f1a1474c3d08c6b53 (patch)
tree3b37dadbf297abdd65b3f63ac8e94a6137098198 /fs/ceph
parente1e4dd0caa63e166afa46a1ccc947bebb4f66bcf (diff)
ceph: use separate class for ceph sockets' sk_lock
Use a separate class for ceph sockets to prevent lockdep confusion. Because ceph sockets only get passed kernel pointers, there is no dependency from sk_lock -> mmap_sem. If we share the same class as other sockets, lockdep detects a circular dependency from mmap_sem (page fault) -> fs mutex -> sk_lock -> mmap_sem because dependencies are noted from both ceph and user contexts. Using a separate class prevents the sk_lock(ceph) -> mmap_sem dependency and makes lockdep happy. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/messenger.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c
index f35b4945a9c3..5c75d5d32b27 100644
--- a/fs/ceph/messenger.c
+++ b/fs/ceph/messenger.c
@@ -29,6 +29,10 @@ static char tag_msg = CEPH_MSGR_TAG_MSG;
29static char tag_ack = CEPH_MSGR_TAG_ACK; 29static char tag_ack = CEPH_MSGR_TAG_ACK;
30static char tag_keepalive = CEPH_MSGR_TAG_KEEPALIVE; 30static char tag_keepalive = CEPH_MSGR_TAG_KEEPALIVE;
31 31
32#ifdef CONFIG_LOCKDEP
33static struct lock_class_key socket_class;
34#endif
35
32 36
33static void queue_con(struct ceph_connection *con); 37static void queue_con(struct ceph_connection *con);
34static void con_work(struct work_struct *); 38static void con_work(struct work_struct *);
@@ -227,6 +231,10 @@ static struct socket *ceph_tcp_connect(struct ceph_connection *con)
227 con->sock = sock; 231 con->sock = sock;
228 sock->sk->sk_allocation = GFP_NOFS; 232 sock->sk->sk_allocation = GFP_NOFS;
229 233
234#ifdef CONFIG_LOCKDEP
235 lockdep_set_class(&sock->sk->sk_lock, &socket_class);
236#endif
237
230 set_sock_callbacks(sock, con); 238 set_sock_callbacks(sock, con);
231 239
232 dout("connect %s\n", pr_addr(&con->peer_addr.in_addr)); 240 dout("connect %s\n", pr_addr(&con->peer_addr.in_addr));