]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: use direct write in BlueStore::_write_bdev_label 48278/head
authorluo rixin <luorixin@huawei.com>
Wed, 14 Sep 2022 11:50:01 +0000 (19:50 +0800)
committerIgor Fedotov <igor.fedotov@croit.io>
Wed, 28 Sep 2022 09:14:35 +0000 (12:14 +0300)
On AArch64 with kernel page size 64K, it occurs occasionally
"OSD::init(): unable to read osd superblock" when deploying osd.
As bluestore use direct write to write the superblock at 0x2000~1000
and BlueStore::_write_bdev_label use buffer write to write label at
0x0~1000, The OS flush the buffer write algined to page size, it will
overwrite the superblock(0x2000~1000). Use driect write to avoid
overwriting the superblock.

Fixes: https://tracker.ceph.com/issues/57537
Signed-off-by: luo rixin <luorixin@huawei.com>
(cherry picked from commit afdb5e4271dcabb8aaa7f5c797c31dcbb2e387f6)

src/os/bluestore/BlueStore.cc

index 8eb6f36b2ed0398b19d744890c5637f509cd4325..448a3d9a2d77c3960b021e278dee08f24a99260a 100644 (file)
@@ -5090,13 +5090,14 @@ int BlueStore::_write_bdev_label(CephContext *cct,
   z.zero();
   bl.append(std::move(z));
 
-  int fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_WRONLY|O_CLOEXEC));
+  int fd = TEMP_FAILURE_RETRY(::open(path.c_str(), O_WRONLY|O_CLOEXEC|O_DIRECT));
   if (fd < 0) {
     fd = -errno;
     derr << __func__ << " failed to open " << path << ": " << cpp_strerror(fd)
         << dendl;
     return fd;
   }
+  bl.rebuild_aligned_size_and_memory(BDEV_LABEL_BLOCK_SIZE, BDEV_LABEL_BLOCK_SIZE, IOV_MAX);
   int r = bl.write_fd(fd);
   if (r < 0) {
     derr << __func__ << " failed to write to " << path