diff options
| -rw-r--r-- | net/ceph/osd_client.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 2aa82b6bb305..0676f2b199d6 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
| @@ -1687,6 +1687,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 1687 | osdmap_epoch = ceph_decode_32(&p); | 1687 | osdmap_epoch = ceph_decode_32(&p); |
| 1688 | 1688 | ||
| 1689 | /* lookup */ | 1689 | /* lookup */ |
| 1690 | down_read(&osdc->map_sem); | ||
| 1690 | mutex_lock(&osdc->request_mutex); | 1691 | mutex_lock(&osdc->request_mutex); |
| 1691 | req = __lookup_request(osdc, tid); | 1692 | req = __lookup_request(osdc, tid); |
| 1692 | if (req == NULL) { | 1693 | if (req == NULL) { |
| @@ -1743,7 +1744,6 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 1743 | dout("redirect pool %lld\n", redir.oloc.pool); | 1744 | dout("redirect pool %lld\n", redir.oloc.pool); |
| 1744 | 1745 | ||
| 1745 | __unregister_request(osdc, req); | 1746 | __unregister_request(osdc, req); |
| 1746 | mutex_unlock(&osdc->request_mutex); | ||
| 1747 | 1747 | ||
| 1748 | req->r_target_oloc = redir.oloc; /* struct */ | 1748 | req->r_target_oloc = redir.oloc; /* struct */ |
| 1749 | 1749 | ||
| @@ -1755,10 +1755,10 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 1755 | * successfully. In the future we might want to follow | 1755 | * successfully. In the future we might want to follow |
| 1756 | * original request's nofail setting here. | 1756 | * original request's nofail setting here. |
| 1757 | */ | 1757 | */ |
| 1758 | err = ceph_osdc_start_request(osdc, req, true); | 1758 | err = __ceph_osdc_start_request(osdc, req, true); |
| 1759 | BUG_ON(err); | 1759 | BUG_ON(err); |
| 1760 | 1760 | ||
| 1761 | goto done; | 1761 | goto out_unlock; |
| 1762 | } | 1762 | } |
| 1763 | 1763 | ||
| 1764 | already_completed = req->r_got_reply; | 1764 | already_completed = req->r_got_reply; |
| @@ -1776,8 +1776,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 1776 | req->r_got_reply = 1; | 1776 | req->r_got_reply = 1; |
| 1777 | } else if ((flags & CEPH_OSD_FLAG_ONDISK) == 0) { | 1777 | } else if ((flags & CEPH_OSD_FLAG_ONDISK) == 0) { |
| 1778 | dout("handle_reply tid %llu dup ack\n", tid); | 1778 | dout("handle_reply tid %llu dup ack\n", tid); |
| 1779 | mutex_unlock(&osdc->request_mutex); | 1779 | goto out_unlock; |
| 1780 | goto done; | ||
| 1781 | } | 1780 | } |
| 1782 | 1781 | ||
| 1783 | dout("handle_reply tid %llu flags %d\n", tid, flags); | 1782 | dout("handle_reply tid %llu flags %d\n", tid, flags); |
| @@ -1792,6 +1791,7 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 1792 | __unregister_request(osdc, req); | 1791 | __unregister_request(osdc, req); |
| 1793 | 1792 | ||
| 1794 | mutex_unlock(&osdc->request_mutex); | 1793 | mutex_unlock(&osdc->request_mutex); |
| 1794 | up_read(&osdc->map_sem); | ||
| 1795 | 1795 | ||
| 1796 | if (!already_completed) { | 1796 | if (!already_completed) { |
| 1797 | if (req->r_unsafe_callback && | 1797 | if (req->r_unsafe_callback && |
| @@ -1809,10 +1809,14 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 1809 | complete_request(req); | 1809 | complete_request(req); |
| 1810 | } | 1810 | } |
| 1811 | 1811 | ||
| 1812 | done: | 1812 | out: |
| 1813 | dout("req=%p req->r_linger=%d\n", req, req->r_linger); | 1813 | dout("req=%p req->r_linger=%d\n", req, req->r_linger); |
| 1814 | ceph_osdc_put_request(req); | 1814 | ceph_osdc_put_request(req); |
| 1815 | return; | 1815 | return; |
| 1816 | out_unlock: | ||
| 1817 | mutex_unlock(&osdc->request_mutex); | ||
| 1818 | up_read(&osdc->map_sem); | ||
| 1819 | goto out; | ||
| 1816 | 1820 | ||
| 1817 | bad_put: | 1821 | bad_put: |
| 1818 | req->r_result = -EIO; | 1822 | req->r_result = -EIO; |
| @@ -1825,6 +1829,7 @@ bad_put: | |||
| 1825 | ceph_osdc_put_request(req); | 1829 | ceph_osdc_put_request(req); |
| 1826 | bad_mutex: | 1830 | bad_mutex: |
| 1827 | mutex_unlock(&osdc->request_mutex); | 1831 | mutex_unlock(&osdc->request_mutex); |
| 1832 | up_read(&osdc->map_sem); | ||
| 1828 | bad: | 1833 | bad: |
| 1829 | pr_err("corrupt osd_op_reply got %d %d\n", | 1834 | pr_err("corrupt osd_op_reply got %d %d\n", |
| 1830 | (int)msg->front.iov_len, le32_to_cpu(msg->hdr.front_len)); | 1835 | (int)msg->front.iov_len, le32_to_cpu(msg->hdr.front_len)); |
