diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-23 13:04:47 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-03-23 13:04:47 -0400 |
| commit | 9a1050ad83e2a5db84436b11e10facd7d4a5ab26 (patch) | |
| tree | 46045735b06ac1b5bffe620f48e98c406350720a | |
| parent | a5ed1e96cafde5ba48638f486bfca0685dc6ddc9 (diff) | |
| parent | 9d4a227f6ef189cf37eb22641f6ee788b7dc41bb (diff) | |
Merge tag 'ceph-for-5.1-rc2' of git://github.com/ceph/ceph-client
Pull ceph fixes from Ilya Dryomov:
"A follow up for the new alloc_size logic and a blacklisting fix,
marked for stable"
* tag 'ceph-for-5.1-rc2' of git://github.com/ceph/ceph-client:
rbd: drop wait_for_latest_osdmap()
libceph: wait for latest osdmap in ceph_monc_blacklist_add()
rbd: set io_min, io_opt and discard_granularity to alloc_size
| -rw-r--r-- | drivers/block/rbd.c | 28 | ||||
| -rw-r--r-- | include/linux/ceph/libceph.h | 2 | ||||
| -rw-r--r-- | net/ceph/ceph_common.c | 18 | ||||
| -rw-r--r-- | net/ceph/mon_client.c | 9 |
4 files changed, 34 insertions, 23 deletions
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 4ba967d65cf9..2210c1b9491b 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c | |||
| @@ -833,7 +833,7 @@ static int parse_rbd_opts_token(char *c, void *private) | |||
| 833 | pctx->opts->queue_depth = intval; | 833 | pctx->opts->queue_depth = intval; |
| 834 | break; | 834 | break; |
| 835 | case Opt_alloc_size: | 835 | case Opt_alloc_size: |
| 836 | if (intval < 1) { | 836 | if (intval < SECTOR_SIZE) { |
| 837 | pr_err("alloc_size out of range\n"); | 837 | pr_err("alloc_size out of range\n"); |
| 838 | return -EINVAL; | 838 | return -EINVAL; |
| 839 | } | 839 | } |
| @@ -924,23 +924,6 @@ static void rbd_put_client(struct rbd_client *rbdc) | |||
| 924 | kref_put(&rbdc->kref, rbd_client_release); | 924 | kref_put(&rbdc->kref, rbd_client_release); |
| 925 | } | 925 | } |
| 926 | 926 | ||
| 927 | static int wait_for_latest_osdmap(struct ceph_client *client) | ||
| 928 | { | ||
| 929 | u64 newest_epoch; | ||
| 930 | int ret; | ||
| 931 | |||
| 932 | ret = ceph_monc_get_version(&client->monc, "osdmap", &newest_epoch); | ||
| 933 | if (ret) | ||
| 934 | return ret; | ||
| 935 | |||
| 936 | if (client->osdc.osdmap->epoch >= newest_epoch) | ||
| 937 | return 0; | ||
| 938 | |||
| 939 | ceph_osdc_maybe_request_map(&client->osdc); | ||
| 940 | return ceph_monc_wait_osdmap(&client->monc, newest_epoch, | ||
| 941 | client->options->mount_timeout); | ||
| 942 | } | ||
| 943 | |||
| 944 | /* | 927 | /* |
| 945 | * Get a ceph client with specific addr and configuration, if one does | 928 | * Get a ceph client with specific addr and configuration, if one does |
| 946 | * not exist create it. Either way, ceph_opts is consumed by this | 929 | * not exist create it. Either way, ceph_opts is consumed by this |
| @@ -960,7 +943,8 @@ static struct rbd_client *rbd_get_client(struct ceph_options *ceph_opts) | |||
| 960 | * Using an existing client. Make sure ->pg_pools is up to | 943 | * Using an existing client. Make sure ->pg_pools is up to |
| 961 | * date before we look up the pool id in do_rbd_add(). | 944 | * date before we look up the pool id in do_rbd_add(). |
| 962 | */ | 945 | */ |
| 963 | ret = wait_for_latest_osdmap(rbdc->client); | 946 | ret = ceph_wait_for_latest_osdmap(rbdc->client, |
| 947 | rbdc->client->options->mount_timeout); | ||
| 964 | if (ret) { | 948 | if (ret) { |
| 965 | rbd_warn(NULL, "failed to get latest osdmap: %d", ret); | 949 | rbd_warn(NULL, "failed to get latest osdmap: %d", ret); |
| 966 | rbd_put_client(rbdc); | 950 | rbd_put_client(rbdc); |
| @@ -4203,12 +4187,12 @@ static int rbd_init_disk(struct rbd_device *rbd_dev) | |||
| 4203 | q->limits.max_sectors = queue_max_hw_sectors(q); | 4187 | q->limits.max_sectors = queue_max_hw_sectors(q); |
| 4204 | blk_queue_max_segments(q, USHRT_MAX); | 4188 | blk_queue_max_segments(q, USHRT_MAX); |
| 4205 | blk_queue_max_segment_size(q, UINT_MAX); | 4189 | blk_queue_max_segment_size(q, UINT_MAX); |
| 4206 | blk_queue_io_min(q, objset_bytes); | 4190 | blk_queue_io_min(q, rbd_dev->opts->alloc_size); |
| 4207 | blk_queue_io_opt(q, objset_bytes); | 4191 | blk_queue_io_opt(q, rbd_dev->opts->alloc_size); |
| 4208 | 4192 | ||
| 4209 | if (rbd_dev->opts->trim) { | 4193 | if (rbd_dev->opts->trim) { |
| 4210 | blk_queue_flag_set(QUEUE_FLAG_DISCARD, q); | 4194 | blk_queue_flag_set(QUEUE_FLAG_DISCARD, q); |
| 4211 | q->limits.discard_granularity = objset_bytes; | 4195 | q->limits.discard_granularity = rbd_dev->opts->alloc_size; |
| 4212 | blk_queue_max_discard_sectors(q, objset_bytes >> SECTOR_SHIFT); | 4196 | blk_queue_max_discard_sectors(q, objset_bytes >> SECTOR_SHIFT); |
| 4213 | blk_queue_max_write_zeroes_sectors(q, objset_bytes >> SECTOR_SHIFT); | 4197 | blk_queue_max_write_zeroes_sectors(q, objset_bytes >> SECTOR_SHIFT); |
| 4214 | } | 4198 | } |
diff --git a/include/linux/ceph/libceph.h b/include/linux/ceph/libceph.h index a420c07904bc..337d5049ff93 100644 --- a/include/linux/ceph/libceph.h +++ b/include/linux/ceph/libceph.h | |||
| @@ -294,6 +294,8 @@ extern void ceph_destroy_client(struct ceph_client *client); | |||
| 294 | extern int __ceph_open_session(struct ceph_client *client, | 294 | extern int __ceph_open_session(struct ceph_client *client, |
| 295 | unsigned long started); | 295 | unsigned long started); |
| 296 | extern int ceph_open_session(struct ceph_client *client); | 296 | extern int ceph_open_session(struct ceph_client *client); |
| 297 | int ceph_wait_for_latest_osdmap(struct ceph_client *client, | ||
| 298 | unsigned long timeout); | ||
| 297 | 299 | ||
| 298 | /* pagevec.c */ | 300 | /* pagevec.c */ |
| 299 | extern void ceph_release_page_vector(struct page **pages, int num_pages); | 301 | extern void ceph_release_page_vector(struct page **pages, int num_pages); |
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c index 9cab80207ced..79eac465ec65 100644 --- a/net/ceph/ceph_common.c +++ b/net/ceph/ceph_common.c | |||
| @@ -738,7 +738,6 @@ int __ceph_open_session(struct ceph_client *client, unsigned long started) | |||
| 738 | } | 738 | } |
| 739 | EXPORT_SYMBOL(__ceph_open_session); | 739 | EXPORT_SYMBOL(__ceph_open_session); |
| 740 | 740 | ||
| 741 | |||
| 742 | int ceph_open_session(struct ceph_client *client) | 741 | int ceph_open_session(struct ceph_client *client) |
| 743 | { | 742 | { |
| 744 | int ret; | 743 | int ret; |
| @@ -754,6 +753,23 @@ int ceph_open_session(struct ceph_client *client) | |||
| 754 | } | 753 | } |
| 755 | EXPORT_SYMBOL(ceph_open_session); | 754 | EXPORT_SYMBOL(ceph_open_session); |
| 756 | 755 | ||
| 756 | int ceph_wait_for_latest_osdmap(struct ceph_client *client, | ||
| 757 | unsigned long timeout) | ||
| 758 | { | ||
| 759 | u64 newest_epoch; | ||
| 760 | int ret; | ||
| 761 | |||
| 762 | ret = ceph_monc_get_version(&client->monc, "osdmap", &newest_epoch); | ||
| 763 | if (ret) | ||
| 764 | return ret; | ||
| 765 | |||
| 766 | if (client->osdc.osdmap->epoch >= newest_epoch) | ||
| 767 | return 0; | ||
| 768 | |||
| 769 | ceph_osdc_maybe_request_map(&client->osdc); | ||
| 770 | return ceph_monc_wait_osdmap(&client->monc, newest_epoch, timeout); | ||
| 771 | } | ||
| 772 | EXPORT_SYMBOL(ceph_wait_for_latest_osdmap); | ||
| 757 | 773 | ||
| 758 | static int __init init_ceph_lib(void) | 774 | static int __init init_ceph_lib(void) |
| 759 | { | 775 | { |
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c index 18deb3d889c4..a53e4fbb6319 100644 --- a/net/ceph/mon_client.c +++ b/net/ceph/mon_client.c | |||
| @@ -922,6 +922,15 @@ int ceph_monc_blacklist_add(struct ceph_mon_client *monc, | |||
| 922 | mutex_unlock(&monc->mutex); | 922 | mutex_unlock(&monc->mutex); |
| 923 | 923 | ||
| 924 | ret = wait_generic_request(req); | 924 | ret = wait_generic_request(req); |
| 925 | if (!ret) | ||
| 926 | /* | ||
| 927 | * Make sure we have the osdmap that includes the blacklist | ||
| 928 | * entry. This is needed to ensure that the OSDs pick up the | ||
| 929 | * new blacklist before processing any future requests from | ||
| 930 | * this client. | ||
| 931 | */ | ||
| 932 | ret = ceph_wait_for_latest_osdmap(monc->client, 0); | ||
| 933 | |||
| 925 | out: | 934 | out: |
| 926 | put_generic_request(req); | 935 | put_generic_request(req); |
| 927 | return ret; | 936 | return ret; |
