aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-04-28 16:51:50 -0400
committerSage Weil <sage@newdream.net>2010-05-17 18:25:25 -0400
commit9dd4658db1be5ca92c2ed2fd7a100d973125d9c5 (patch)
tree0f9e2b9d0b6edd9c37a5f6528a1c7c60fb10a902 /fs
parent4f48280ee1d0654390cd50ad0c41ea93309e7c91 (diff)
ceph: close messenger race
Simplify messenger locking, and close race between ceph_con_close() setting the CLOSED bit and con_work() checking the bit, then taking the mutex. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs')
-rw-r--r--fs/ceph/messenger.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/ceph/messenger.c b/fs/ceph/messenger.c
index 8cfca375c6a9..bb16edb1aef6 100644
--- a/fs/ceph/messenger.c
+++ b/fs/ceph/messenger.c
@@ -1546,7 +1546,6 @@ static int try_write(struct ceph_connection *con)
1546 dout("try_write start %p state %lu nref %d\n", con, con->state, 1546 dout("try_write start %p state %lu nref %d\n", con, con->state,
1547 atomic_read(&con->nref)); 1547 atomic_read(&con->nref));
1548 1548
1549 mutex_lock(&con->mutex);
1550more: 1549more:
1551 dout("try_write out_kvec_bytes %d\n", con->out_kvec_bytes); 1550 dout("try_write out_kvec_bytes %d\n", con->out_kvec_bytes);
1552 1551
@@ -1639,7 +1638,6 @@ do_next:
1639done: 1638done:
1640 ret = 0; 1639 ret = 0;
1641out: 1640out:
1642 mutex_unlock(&con->mutex);
1643 dout("try_write done on %p\n", con); 1641 dout("try_write done on %p\n", con);
1644 return ret; 1642 return ret;
1645} 1643}
@@ -1651,7 +1649,6 @@ out:
1651 */ 1649 */
1652static int try_read(struct ceph_connection *con) 1650static int try_read(struct ceph_connection *con)
1653{ 1651{
1654 struct ceph_messenger *msgr;
1655 int ret = -1; 1652 int ret = -1;
1656 1653
1657 if (!con->sock) 1654 if (!con->sock)
@@ -1661,9 +1658,6 @@ static int try_read(struct ceph_connection *con)
1661 return 0; 1658 return 0;
1662 1659
1663 dout("try_read start on %p\n", con); 1660 dout("try_read start on %p\n", con);
1664 msgr = con->msgr;
1665
1666 mutex_lock(&con->mutex);
1667 1661
1668more: 1662more:
1669 dout("try_read tag %d in_base_pos %d\n", (int)con->in_tag, 1663 dout("try_read tag %d in_base_pos %d\n", (int)con->in_tag,
@@ -1758,7 +1752,6 @@ more:
1758done: 1752done:
1759 ret = 0; 1753 ret = 0;
1760out: 1754out:
1761 mutex_unlock(&con->mutex);
1762 dout("try_read done on %p\n", con); 1755 dout("try_read done on %p\n", con);
1763 return ret; 1756 return ret;
1764 1757
@@ -1830,6 +1823,8 @@ more:
1830 dout("con_work %p start, clearing QUEUED\n", con); 1823 dout("con_work %p start, clearing QUEUED\n", con);
1831 clear_bit(QUEUED, &con->state); 1824 clear_bit(QUEUED, &con->state);
1832 1825
1826 mutex_lock(&con->mutex);
1827
1833 if (test_bit(CLOSED, &con->state)) { /* e.g. if we are replaced */ 1828 if (test_bit(CLOSED, &con->state)) { /* e.g. if we are replaced */
1834 dout("con_work CLOSED\n"); 1829 dout("con_work CLOSED\n");
1835 con_close_socket(con); 1830 con_close_socket(con);
@@ -1844,11 +1839,16 @@ more:
1844 if (test_and_clear_bit(SOCK_CLOSED, &con->state) || 1839 if (test_and_clear_bit(SOCK_CLOSED, &con->state) ||
1845 try_read(con) < 0 || 1840 try_read(con) < 0 ||
1846 try_write(con) < 0) { 1841 try_write(con) < 0) {
1842 mutex_unlock(&con->mutex);
1847 backoff = 1; 1843 backoff = 1;
1848 ceph_fault(con); /* error/fault path */ 1844 ceph_fault(con); /* error/fault path */
1845 goto done_unlocked;
1849 } 1846 }
1850 1847
1851done: 1848done:
1849 mutex_unlock(&con->mutex);
1850
1851done_unlocked:
1852 clear_bit(BUSY, &con->state); 1852 clear_bit(BUSY, &con->state);
1853 dout("con->state=%lu\n", con->state); 1853 dout("con->state=%lu\n", con->state);
1854 if (test_bit(QUEUED, &con->state)) { 1854 if (test_bit(QUEUED, &con->state)) {