]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
blk/kernel: cap single discard request's length 64418/head
authorIgor Fedotov <igor.fedotov@croit.io>
Tue, 15 Jul 2025 20:47:57 +0000 (23:47 +0300)
committerIgor Fedotov <igor.fedotov@croit.io>
Tue, 15 Jul 2025 20:47:57 +0000 (23:47 +0300)
Signed-off-by: Igor Fedotov <igor.fedotov@croit.io>
src/blk/kernel/KernelDevice.cc
src/common/options/global.yaml.in

index 11db95b5f4f64cf11e9c8c0499f3f6990a81f08d..a455fb18bcb91c33e5d0fd69211f770dd3dab047 100644 (file)
@@ -1196,10 +1196,23 @@ int KernelDevice::_discard(uint64_t offset, uint64_t len)
               << dendl;
     return 0;
   }
-  dout(10) << __func__
-           << " 0x" << std::hex << offset << "~" << len << std::dec
-           << dendl;
-  r = BlkDev{fd_directs[WRITE_LIFE_NOT_SET]}.discard((int64_t)offset, (int64_t)len);
+  uint64_t max_len = cct->_conf->bdev_max_discard_length;
+  if (max_len) {
+    while (len > 0 && r == 0) {
+      auto l = std::min(max_len, len);
+      dout(10) << __func__
+               << " 0x" << std::hex << offset << "~" << l << std::dec
+               << dendl;
+      r = BlkDev{fd_directs[WRITE_LIFE_NOT_SET]}.discard((int64_t)offset, (int64_t)l);
+      offset += l;
+      len -= l;
+    }
+  } else {
+    dout(10) << __func__
+             << " 0x" << std::hex << offset << "~" << len << std::dec
+             << dendl;
+    r = BlkDev{fd_directs[WRITE_LIFE_NOT_SET]}.discard((int64_t)offset, (int64_t)len);
+  }
   return r;
 }
 
index 490d5c4edd40bdfc4588aedc824a627ef3d7efe6..1f2bae5e410e30c0599edfade4eb86aac165de39 100644 (file)
@@ -4167,6 +4167,16 @@ options:
   - runtime
   see_also:
   - bdev_async_discard_threads
+- name: bdev_max_discard_length
+  desc: maximum length of a single discard request
+  type: uint
+  level: advanced
+  default: 2147483648
+  with_legacy: true
+  flags:
+  - runtime
+  see_also:
+  - bdev_enable_discard
 - name: bdev_flock_retry_interval
   type: float
   level: advanced