1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2014 Red Hat
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
15 #ifndef CEPH_OS_BLUESTORE_KERNELDEVICE_H
16 #define CEPH_OS_BLUESTORE_KERNELDEVICE_H
20 #include "include/types.h"
21 #include "include/interval_set.h"
22 #include "common/Thread.h"
23 #include "include/utime.h"
26 #include "BlockDevice.h"
28 class KernelDevice
: public BlockDevice
{
29 std::vector
<int> fd_directs
, fd_buffereds
;
30 bool enable_wrt
= true;
34 int vdo_fd
= -1; ///< fd for vdo sysfs directory
37 std::string devname
; ///< kernel dev name (/sys/block/$devname), if any
39 ceph::mutex debug_lock
= ceph::make_mutex("KernelDevice::debug_lock");
40 interval_set
<uint64_t> debug_inflight
;
42 std::atomic
<bool> io_since_flush
= {false};
43 ceph::mutex flush_mutex
= ceph::make_mutex("KernelDevice::flush_mutex");
45 aio_queue_t aio_queue
;
46 aio_callback_t discard_callback
;
47 void *discard_callback_priv
;
52 ceph::mutex discard_lock
= ceph::make_mutex("KernelDevice::discard_lock");
53 ceph::condition_variable discard_cond
;
54 bool discard_running
= false;
55 interval_set
<uint64_t> discard_queued
;
56 interval_set
<uint64_t> discard_finishing
;
58 struct AioCompletionThread
: public Thread
{
60 explicit AioCompletionThread(KernelDevice
*b
) : bdev(b
) {}
61 void *entry() override
{
67 struct DiscardThread
: public Thread
{
69 explicit DiscardThread(KernelDevice
*b
) : bdev(b
) {}
70 void *entry() override
{
71 bdev
->_discard_thread();
76 std::atomic_int injecting_crash
;
79 void _discard_thread();
80 int queue_discard(interval_set
<uint64_t> &to_release
) override
;
88 void _aio_log_start(IOContext
*ioc
, uint64_t offset
, uint64_t length
);
89 void _aio_log_finish(IOContext
*ioc
, uint64_t offset
, uint64_t length
);
91 int _sync_write(uint64_t off
, bufferlist
& bl
, bool buffered
, int write_hint
);
95 int direct_read_unaligned(uint64_t off
, uint64_t len
, char *buf
);
97 // stalled aio debugging
98 aio_list_t debug_queue
;
99 ceph::mutex debug_queue_lock
= ceph::make_mutex("KernelDevice::debug_queue_lock");
100 aio_t
*debug_oldest
= nullptr;
101 utime_t debug_stall_since
;
102 void debug_aio_link(aio_t
& aio
);
103 void debug_aio_unlink(aio_t
& aio
);
106 int choose_fd(bool buffered
, int write_hint
) const;
109 KernelDevice(CephContext
* cct
, aio_callback_t cb
, void *cbpriv
, aio_callback_t d_cb
, void *d_cbpriv
);
111 void aio_submit(IOContext
*ioc
) override
;
112 void discard_drain() override
;
114 int collect_metadata(const std::string
& prefix
, map
<std::string
,std::string
> *pm
) const override
;
115 int get_devname(std::string
*s
) override
{
116 if (devname
.empty()) {
122 int get_devices(std::set
<std::string
> *ls
) override
;
124 bool get_thin_utilization(uint64_t *total
, uint64_t *avail
) const override
;
126 int read(uint64_t off
, uint64_t len
, bufferlist
*pbl
,
128 bool buffered
) override
;
129 int aio_read(uint64_t off
, uint64_t len
, bufferlist
*pbl
,
130 IOContext
*ioc
) override
;
131 int read_random(uint64_t off
, uint64_t len
, char *buf
, bool buffered
) override
;
133 int write(uint64_t off
, bufferlist
& bl
, bool buffered
, int write_hint
= WRITE_LIFE_NOT_SET
) override
;
134 int aio_write(uint64_t off
, bufferlist
& bl
,
137 int write_hint
= WRITE_LIFE_NOT_SET
) override
;
138 int flush() override
;
139 int discard(uint64_t offset
, uint64_t len
) override
;
141 // for managing buffered readers/writers
142 int invalidate_cache(uint64_t off
, uint64_t len
) override
;
143 int open(const std::string
& path
) override
;
144 void close() override
;