diff --git a/kernel-modules/drbd/centos/build_srpm.data b/kernel-modules/drbd/centos/build_srpm.data index c6bd5a8c..d07ff4a3 100644 --- a/kernel-modules/drbd/centos/build_srpm.data +++ b/kernel-modules/drbd/centos/build_srpm.data @@ -1,4 +1,4 @@ COPY_LIST="$FILES_BASE/* \ $DISTRO/patches/* \ $CGCS_BASE/downloads/drbd-8.4.11-1.tar.gz" -TIS_PATCH_VER=0 +TIS_PATCH_VER=1 diff --git a/kernel-modules/drbd/centos/drbd-kernel.spec b/kernel-modules/drbd/centos/drbd-kernel.spec index f9e903d1..b2e1525b 100644 --- a/kernel-modules/drbd/centos/drbd-kernel.spec +++ b/kernel-modules/drbd/centos/drbd-kernel.spec @@ -23,8 +23,10 @@ ExclusiveArch: x86_64 # Sources. Source0: http://oss.linbit.com/drbd/drbd-%{tarball_version}.tar.gz -# WRS +# STX Patch0001: 0001-remove_bind_before_connect_error.patch +Patch0002: 0002-drbd-convert-to-bioset_init-mempool_init.patch +Patch0003: 0003-Fix-queue_lock-compile-issue.patch %define kversion %(rpm -q kernel%{?bt_ext}-devel | sort --version-sort | tail -1 | sed 's/kernel%{?bt_ext}-devel-//') @@ -85,6 +87,8 @@ echo "Done." %prep %setup -q -n drbd-%{tarball_version} %patch0001 -p1 +%patch0002 -p1 +%patch0003 -p1 %build rm -rf obj @@ -111,10 +115,10 @@ find %{buildroot} -type f -name \*.ko -exec %{__strip} --strip-debug \{\} \; # Always Sign the modules(s). # If the module signing keys are not defined, define them here. -%{!?privkey: %define privkey /usr/src/kernels/%{kversion}/signing_key.priv} +%{!?privkey: %define privkey /usr/src/kernels/%{kversion}/signing_key.pem} %{!?pubkey: %define pubkey /usr/src/kernels/%{kversion}/signing_key.x509} for module in $(find %{buildroot} -type f -name \*.ko); -do %{__perl} /usr/src/kernels/%{kversion}/scripts/sign-file \ +do /usr/src/kernels/%{kversion}/scripts/sign-file \ sha256 %{privkey} %{pubkey} $module; done diff --git a/kernel-modules/drbd/centos/patches/0002-drbd-convert-to-bioset_init-mempool_init.patch b/kernel-modules/drbd/centos/patches/0002-drbd-convert-to-bioset_init-mempool_init.patch new file mode 100644 index 00000000..5bba1d1d --- /dev/null +++ b/kernel-modules/drbd/centos/patches/0002-drbd-convert-to-bioset_init-mempool_init.patch @@ -0,0 +1,271 @@ +From 29199315f91bcb65936543865761dc27e3635d42 Mon Sep 17 00:00:00 2001 +From: Kent Overstreet +Date: Sun, 20 May 2018 18:25:48 -0400 +Subject: [PATCH] drbd: convert to bioset_init()/mempool_init() + +Convert drbd to embedded bio sets and mempools. + +Signed-off-by: Kent Overstreet +Signed-off-by: Jens Axboe +Signed-off-by: Shuicheng Lin +--- + drbd/drbd_bitmap.c | 4 +-- + drbd/drbd_int.h | 10 ++++---- + drbd/drbd_main.c | 70 +++++++++++++++++++--------------------------------- + drbd/drbd_receiver.c | 6 ++--- + drbd/drbd_req.c | 4 +-- + drbd/drbd_req.h | 2 +- + 6 files changed, 38 insertions(+), 58 deletions(-) + +diff --git a/drbd/drbd_bitmap.c b/drbd/drbd_bitmap.c +index 7faee2b..5c1f176 100644 +--- a/drbd/drbd_bitmap.c ++++ b/drbd/drbd_bitmap.c +@@ -990,7 +990,7 @@ static BIO_ENDIO_TYPE drbd_bm_endio BIO_ENDIO_ARGS(struct bio *bio) + bm_page_unlock_io(device, idx); + + if (ctx->flags & BM_AIO_COPY_PAGES) +- mempool_free(bio->bi_io_vec[0].bv_page, drbd_md_io_page_pool); ++ mempool_free(bio->bi_io_vec[0].bv_page, &drbd_md_io_page_pool); + + bio_put(bio); + +@@ -1029,7 +1029,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho + bm_set_page_unchanged(b->bm_pages[page_nr]); + + if (ctx->flags & BM_AIO_COPY_PAGES) { +- page = mempool_alloc(drbd_md_io_page_pool, __GFP_HIGHMEM|__GFP_RECLAIM); ++ page = mempool_alloc(&drbd_md_io_page_pool, __GFP_HIGHMEM|__GFP_RECLAIM); + copy_highpage(page, b->bm_pages[page_nr]); + bm_store_page_idx(page, page_nr); + } else +diff --git a/drbd/drbd_int.h b/drbd/drbd_int.h +index 60382c4..77fce6d 100644 +--- a/drbd/drbd_int.h ++++ b/drbd/drbd_int.h +@@ -1509,8 +1509,8 @@ extern struct kmem_cache *drbd_request_cache; + extern struct kmem_cache *drbd_ee_cache; /* peer requests */ + extern struct kmem_cache *drbd_bm_ext_cache; /* bitmap extents */ + extern struct kmem_cache *drbd_al_ext_cache; /* activity log extents */ +-extern mempool_t *drbd_request_mempool; +-extern mempool_t *drbd_ee_mempool; ++extern mempool_t drbd_request_mempool; ++extern mempool_t drbd_ee_mempool; + + /* drbd's page pool, used to buffer data received from the peer, + * or data requested by the peer. +@@ -1536,16 +1536,16 @@ extern wait_queue_head_t drbd_pp_wait; + * 128 should be plenty, currently we probably can get away with as few as 1. + */ + #define DRBD_MIN_POOL_PAGES 128 +-extern mempool_t *drbd_md_io_page_pool; ++extern mempool_t drbd_md_io_page_pool; + + /* We also need to make sure we get a bio + * when we need it for housekeeping purposes */ +-extern struct bio_set *drbd_md_io_bio_set; ++extern struct bio_set drbd_md_io_bio_set; + /* to allocate from that set */ + extern struct bio *bio_alloc_drbd(gfp_t gfp_mask); + + /* And a bio_set for cloning */ +-extern struct bio_set *drbd_io_bio_set; ++extern struct bio_set drbd_io_bio_set; + + extern struct mutex resources_mutex; + +diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c +index dca68bc..4dd0bf1 100644 +--- a/drbd/drbd_main.c ++++ b/drbd/drbd_main.c +@@ -141,11 +141,11 @@ struct kmem_cache *drbd_request_cache; + struct kmem_cache *drbd_ee_cache; /* peer requests */ + struct kmem_cache *drbd_bm_ext_cache; /* bitmap extents */ + struct kmem_cache *drbd_al_ext_cache; /* activity log extents */ +-mempool_t *drbd_request_mempool; +-mempool_t *drbd_ee_mempool; +-mempool_t *drbd_md_io_page_pool; +-struct bio_set *drbd_md_io_bio_set; +-struct bio_set *drbd_io_bio_set; ++mempool_t drbd_request_mempool; ++mempool_t drbd_ee_mempool; ++mempool_t drbd_md_io_page_pool; ++struct bio_set drbd_md_io_bio_set; ++struct bio_set drbd_io_bio_set; + + /* I do not use a standard mempool, because: + 1) I want to hand out the pre-allocated objects first. +@@ -188,10 +188,10 @@ struct bio *bio_alloc_drbd(gfp_t gfp_mask) + { + struct bio *bio; + +- if (!drbd_md_io_bio_set) ++ if (!bioset_initialized(&drbd_md_io_bio_set)) + return bio_alloc(gfp_mask, 1); + +- bio = bio_alloc_bioset(gfp_mask, 1, drbd_md_io_bio_set); ++ bio = bio_alloc_bioset(gfp_mask, 1, &drbd_md_io_bio_set); + if (!bio) + return NULL; + return bio; +@@ -2209,16 +2209,11 @@ static void drbd_destroy_mempools(void) + + /* D_ASSERT(device, atomic_read(&drbd_pp_vacant)==0); */ + +- if (drbd_io_bio_set) +- bioset_free(drbd_io_bio_set); +- if (drbd_md_io_bio_set) +- bioset_free(drbd_md_io_bio_set); +- if (drbd_md_io_page_pool) +- mempool_destroy(drbd_md_io_page_pool); +- if (drbd_ee_mempool) +- mempool_destroy(drbd_ee_mempool); +- if (drbd_request_mempool) +- mempool_destroy(drbd_request_mempool); ++ bioset_exit(&drbd_io_bio_set); ++ bioset_exit(&drbd_md_io_bio_set); ++ mempool_exit(&drbd_md_io_page_pool); ++ mempool_exit(&drbd_ee_mempool); ++ mempool_exit(&drbd_request_mempool); + if (drbd_ee_cache) + kmem_cache_destroy(drbd_ee_cache); + if (drbd_request_cache) +@@ -2228,11 +2223,6 @@ static void drbd_destroy_mempools(void) + if (drbd_al_ext_cache) + kmem_cache_destroy(drbd_al_ext_cache); + +- drbd_io_bio_set = NULL; +- drbd_md_io_bio_set = NULL; +- drbd_md_io_page_pool = NULL; +- drbd_ee_mempool = NULL; +- drbd_request_mempool = NULL; + drbd_ee_cache = NULL; + drbd_request_cache = NULL; + drbd_bm_ext_cache = NULL; +@@ -2245,18 +2235,7 @@ static int drbd_create_mempools(void) + { + struct page *page; + const int number = (DRBD_MAX_BIO_SIZE/PAGE_SIZE) * drbd_minor_count; +- int i; +- +- /* prepare our caches and mempools */ +- drbd_request_mempool = NULL; +- drbd_ee_cache = NULL; +- drbd_request_cache = NULL; +- drbd_bm_ext_cache = NULL; +- drbd_al_ext_cache = NULL; +- drbd_pp_pool = NULL; +- drbd_md_io_page_pool = NULL; +- drbd_md_io_bio_set = NULL; +- drbd_io_bio_set = NULL; ++ int i, ret; + + /* caches */ + drbd_request_cache = kmem_cache_create( +@@ -2280,25 +2259,26 @@ static int drbd_create_mempools(void) + goto Enomem; + + /* mempools */ +- drbd_io_bio_set = bioset_create(BIO_POOL_SIZE, 0, 0); +- if (drbd_io_bio_set == NULL) ++ ret = bioset_init(&drbd_io_bio_set, BIO_POOL_SIZE, 0, 0); ++ if (ret) + goto Enomem; + +- drbd_md_io_bio_set = bioset_create(DRBD_MIN_POOL_PAGES, 0, +- BIOSET_NEED_BVECS); +- if (drbd_md_io_bio_set == NULL) ++ ret = bioset_init(&drbd_md_io_bio_set, DRBD_MIN_POOL_PAGES, 0, ++ BIOSET_NEED_BVECS); ++ if (ret) + goto Enomem; + +- drbd_md_io_page_pool = mempool_create_page_pool(DRBD_MIN_POOL_PAGES, 0); +- if (drbd_md_io_page_pool == NULL) ++ ret = mempool_init_page_pool(&drbd_md_io_page_pool, DRBD_MIN_POOL_PAGES, 0); ++ if (ret) + goto Enomem; + +- drbd_request_mempool = mempool_create_slab_pool(number, drbd_request_cache); +- if (drbd_request_mempool == NULL) ++ ret = mempool_init_slab_pool(&drbd_request_mempool, number, ++ drbd_request_cache); ++ if (ret) + goto Enomem; + +- drbd_ee_mempool = mempool_create_slab_pool(number, drbd_ee_cache); +- if (drbd_ee_mempool == NULL) ++ ret = mempool_init_slab_pool(&drbd_ee_mempool, number, drbd_ee_cache); ++ if (ret) + goto Enomem; + + /* drbd's page pool */ +diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c +index b69e9a7..d7ba2a5 100644 +--- a/drbd/drbd_receiver.c ++++ b/drbd/drbd_receiver.c +@@ -417,7 +417,7 @@ drbd_alloc_peer_req(struct drbd_peer_device *peer_device, u64 id, sector_t secto + if (drbd_insert_fault(device, DRBD_FAULT_AL_EE)) + return NULL; + +- peer_req = mempool_alloc(drbd_ee_mempool, gfp_mask & ~__GFP_HIGHMEM); ++ peer_req = mempool_alloc(&drbd_ee_mempool, gfp_mask & ~__GFP_HIGHMEM); + if (!peer_req) { + if (!(gfp_mask & __GFP_NOWARN)) + drbd_err(device, "%s: allocation failed\n", __func__); +@@ -447,7 +447,7 @@ drbd_alloc_peer_req(struct drbd_peer_device *peer_device, u64 id, sector_t secto + return peer_req; + + fail: +- mempool_free(peer_req, drbd_ee_mempool); ++ mempool_free(peer_req, &drbd_ee_mempool); + return NULL; + } + +@@ -464,7 +464,7 @@ void __drbd_free_peer_req(struct drbd_device *device, struct drbd_peer_request * + peer_req->flags &= ~EE_CALL_AL_COMPLETE_IO; + drbd_al_complete_io(device, &peer_req->i); + } +- mempool_free(peer_req, drbd_ee_mempool); ++ mempool_free(peer_req, &drbd_ee_mempool); + } + + int drbd_free_peer_reqs(struct drbd_device *device, struct list_head *list) +diff --git a/drbd/drbd_req.c b/drbd/drbd_req.c +index b602cb3..221d6f6 100644 +--- a/drbd/drbd_req.c ++++ b/drbd/drbd_req.c +@@ -73,7 +73,7 @@ static struct drbd_request *drbd_req_new(struct drbd_device *device, struct bio + { + struct drbd_request *req; + +- req = mempool_alloc(drbd_request_mempool, GFP_NOIO); ++ req = mempool_alloc(&drbd_request_mempool, GFP_NOIO); + if (!req) + return NULL; + memset(req, 0, sizeof(*req)); +@@ -202,7 +202,7 @@ void drbd_req_destroy(struct kref *kref) + } + } + +- mempool_free(req, drbd_request_mempool); ++ mempool_free(req, &drbd_request_mempool); + } + + static void wake_all_senders(struct drbd_connection *connection) { +diff --git a/drbd/drbd_req.h b/drbd/drbd_req.h +index bd5935f..68e6469 100644 +--- a/drbd/drbd_req.h ++++ b/drbd/drbd_req.h +@@ -271,7 +271,7 @@ enum drbd_req_state_bits { + static inline void drbd_req_make_private_bio(struct drbd_request *req, struct bio *bio_src) + { + struct bio *bio; +- bio = bio_clone_fast(bio_src, GFP_NOIO, drbd_io_bio_set); ++ bio = bio_clone_fast(bio_src, GFP_NOIO, &drbd_io_bio_set); + + req->private_bio = bio; + +-- +2.7.4 + diff --git a/kernel-modules/drbd/centos/patches/0003-Fix-queue_lock-compile-issue.patch b/kernel-modules/drbd/centos/patches/0003-Fix-queue_lock-compile-issue.patch new file mode 100644 index 00000000..61aa8e71 --- /dev/null +++ b/kernel-modules/drbd/centos/patches/0003-Fix-queue_lock-compile-issue.patch @@ -0,0 +1,37 @@ +From 6ab2cc667468284ef176b72859823e2e946e9ee6 Mon Sep 17 00:00:00 2001 +From: Shuicheng Lin +Date: Fri, 7 Feb 2020 15:21:23 +0800 +Subject: [PATCH] Fix queue_lock compile issue + +queue_lock was "spinlock_t *" type in "struct request_queue". But +with current 4.18.0-80 kernel, it is "spinlock_t". + +Signed-off-by: Shuicheng Lin +--- + drbd/drbd_main.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c +index 4dd0bf1..8022c9a 100644 +--- a/drbd/drbd_main.c ++++ b/drbd/drbd_main.c +@@ -2910,7 +2910,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig + + drbd_init_set_defaults(device); + +- q = blk_alloc_queue(GFP_KERNEL); ++ q = blk_alloc_queue_node(GFP_KERNEL, NUMA_NO_NODE); + if (!q) + goto out_no_q; + device->rq_queue = q; +@@ -2944,7 +2944,6 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig + #ifdef COMPAT_HAVE_BLK_QUEUE_MERGE_BVEC + blk_queue_merge_bvec(q, drbd_merge_bvec); + #endif +- q->queue_lock = &resource->req_lock; + #ifdef blk_queue_plugged + /* plugging on a queue, that actually has no requests! */ + q->unplug_fn = drbd_unplug_fn; +-- +2.7.4 +