diff options
-rw-r--r-- | net/ceph/osd_client.c | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c index 1ad9866dc707..9f1993582ff7 100644 --- a/net/ceph/osd_client.c +++ b/net/ceph/osd_client.c | |||
@@ -1643,14 +1643,17 @@ static void reset_changed_osds(struct ceph_osd_client *osdc) | |||
1643 | * | 1643 | * |
1644 | * Caller should hold map_sem for read. | 1644 | * Caller should hold map_sem for read. |
1645 | */ | 1645 | */ |
1646 | static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | 1646 | static void kick_requests(struct ceph_osd_client *osdc, bool force_resend, |
1647 | bool force_resend_writes) | ||
1647 | { | 1648 | { |
1648 | struct ceph_osd_request *req, *nreq; | 1649 | struct ceph_osd_request *req, *nreq; |
1649 | struct rb_node *p; | 1650 | struct rb_node *p; |
1650 | int needmap = 0; | 1651 | int needmap = 0; |
1651 | int err; | 1652 | int err; |
1653 | bool force_resend_req; | ||
1652 | 1654 | ||
1653 | dout("kick_requests %s\n", force_resend ? " (force resend)" : ""); | 1655 | dout("kick_requests %s %s\n", force_resend ? " (force resend)" : "", |
1656 | force_resend_writes ? " (force resend writes)" : ""); | ||
1654 | mutex_lock(&osdc->request_mutex); | 1657 | mutex_lock(&osdc->request_mutex); |
1655 | for (p = rb_first(&osdc->requests); p; ) { | 1658 | for (p = rb_first(&osdc->requests); p; ) { |
1656 | req = rb_entry(p, struct ceph_osd_request, r_node); | 1659 | req = rb_entry(p, struct ceph_osd_request, r_node); |
@@ -1675,7 +1678,10 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | |||
1675 | continue; | 1678 | continue; |
1676 | } | 1679 | } |
1677 | 1680 | ||
1678 | err = __map_request(osdc, req, force_resend); | 1681 | force_resend_req = force_resend || |
1682 | (force_resend_writes && | ||
1683 | req->r_flags & CEPH_OSD_FLAG_WRITE); | ||
1684 | err = __map_request(osdc, req, force_resend_req); | ||
1679 | if (err < 0) | 1685 | if (err < 0) |
1680 | continue; /* error */ | 1686 | continue; /* error */ |
1681 | if (req->r_osd == NULL) { | 1687 | if (req->r_osd == NULL) { |
@@ -1695,7 +1701,8 @@ static void kick_requests(struct ceph_osd_client *osdc, int force_resend) | |||
1695 | r_linger_item) { | 1701 | r_linger_item) { |
1696 | dout("linger req=%p req->r_osd=%p\n", req, req->r_osd); | 1702 | dout("linger req=%p req->r_osd=%p\n", req, req->r_osd); |
1697 | 1703 | ||
1698 | err = __map_request(osdc, req, force_resend); | 1704 | err = __map_request(osdc, req, |
1705 | force_resend || force_resend_writes); | ||
1699 | dout("__map_request returned %d\n", err); | 1706 | dout("__map_request returned %d\n", err); |
1700 | if (err == 0) | 1707 | if (err == 0) |
1701 | continue; /* no change and no osd was specified */ | 1708 | continue; /* no change and no osd was specified */ |
@@ -1737,6 +1744,7 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | |||
1737 | struct ceph_osdmap *newmap = NULL, *oldmap; | 1744 | struct ceph_osdmap *newmap = NULL, *oldmap; |
1738 | int err; | 1745 | int err; |
1739 | struct ceph_fsid fsid; | 1746 | struct ceph_fsid fsid; |
1747 | bool was_full; | ||
1740 | 1748 | ||
1741 | dout("handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0); | 1749 | dout("handle_map have %u\n", osdc->osdmap ? osdc->osdmap->epoch : 0); |
1742 | p = msg->front.iov_base; | 1750 | p = msg->front.iov_base; |
@@ -1750,6 +1758,8 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | |||
1750 | 1758 | ||
1751 | down_write(&osdc->map_sem); | 1759 | down_write(&osdc->map_sem); |
1752 | 1760 | ||
1761 | was_full = ceph_osdmap_flag(osdc->osdmap, CEPH_OSDMAP_FULL); | ||
1762 | |||
1753 | /* incremental maps */ | 1763 | /* incremental maps */ |
1754 | ceph_decode_32_safe(&p, end, nr_maps, bad); | 1764 | ceph_decode_32_safe(&p, end, nr_maps, bad); |
1755 | dout(" %d inc maps\n", nr_maps); | 1765 | dout(" %d inc maps\n", nr_maps); |
@@ -1774,7 +1784,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | |||
1774 | ceph_osdmap_destroy(osdc->osdmap); | 1784 | ceph_osdmap_destroy(osdc->osdmap); |
1775 | osdc->osdmap = newmap; | 1785 | osdc->osdmap = newmap; |
1776 | } | 1786 | } |
1777 | kick_requests(osdc, 0); | 1787 | was_full = was_full || |
1788 | ceph_osdmap_flag(osdc->osdmap, | ||
1789 | CEPH_OSDMAP_FULL); | ||
1790 | kick_requests(osdc, 0, was_full); | ||
1778 | } else { | 1791 | } else { |
1779 | dout("ignoring incremental map %u len %d\n", | 1792 | dout("ignoring incremental map %u len %d\n", |
1780 | epoch, maplen); | 1793 | epoch, maplen); |
@@ -1817,7 +1830,10 @@ void ceph_osdc_handle_map(struct ceph_osd_client *osdc, struct ceph_msg *msg) | |||
1817 | skipped_map = 1; | 1830 | skipped_map = 1; |
1818 | ceph_osdmap_destroy(oldmap); | 1831 | ceph_osdmap_destroy(oldmap); |
1819 | } | 1832 | } |
1820 | kick_requests(osdc, skipped_map); | 1833 | was_full = was_full || |
1834 | ceph_osdmap_flag(osdc->osdmap, | ||
1835 | CEPH_OSDMAP_FULL); | ||
1836 | kick_requests(osdc, skipped_map, was_full); | ||
1821 | } | 1837 | } |
1822 | p += maplen; | 1838 | p += maplen; |
1823 | nr_maps--; | 1839 | nr_maps--; |