diff --git a/sys/dev/nvd/nvd.c b/sys/dev/nvd/nvd.c
index d752832..3015e39 100644
--- a/sys/dev/nvd/nvd.c
+++ b/sys/dev/nvd/nvd.c
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD: releng/10.2/sys/dev/nvd/nvd.c 285919 2015-07-27 17:50:05Z ji
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/sysctl.h>
 #include <sys/systm.h>
 #include <sys/taskqueue.h>
 
@@ -85,6 +86,11 @@ struct nvd_controller {
 static TAILQ_HEAD(, nvd_controller)	ctrlr_head;
 static TAILQ_HEAD(disk_list, nvd_disk)	disk_head;
 
+static SYSCTL_NODE(_hw, OID_AUTO, nvd, CTLFLAG_RD, 0, "nvd driver parameters");
+static uint64_t nvd_delete_max = (4 * 1024 * 1024 * 1024);  /* 4GB */
+SYSCTL_UQUAD(_hw_nvd, OID_AUTO, delete_max, CTLFLAG_RWTUN, &nvd_delete_max, 0,
+	     "nvd maximum BIO_DELETE size");
+
 static int nvd_modevent(module_t mod, int type, void *arg)
 {
 	int error = 0;
@@ -279,6 +285,8 @@ nvd_new_disk(struct nvme_namespace *ns, void *ctrlr_arg)
 	disk->d_sectorsize = nvme_ns_get_sector_size(ns);
 	disk->d_mediasize = (off_t)nvme_ns_get_size(ns);
 	disk->d_delmaxsize = (off_t)nvme_ns_get_size(ns);
+	if (disk->d_delmaxsize > nvd_delete_max)
+		disk->d_delmaxsize = nvd_delete_max;
 
 	if (TAILQ_EMPTY(&disk_head))
 		disk->d_unit = 0;
