]> git.hungrycats.org Git - bees/commitdiff
hash: handle $BEESHOME on non-btrfs
authorZygo Blaxell <bees@furryterror.org>
Mon, 27 Jan 2025 02:59:07 +0000 (21:59 -0500)
committerZygo Blaxell <bees@furryterror.org>
Fri, 7 Feb 2025 03:42:15 +0000 (22:42 -0500)
bees explicitly supports storing $BEESHOME on another filesystem, and
does not require that filesystem to be btrfs; however, if $BEESHOME
is on a non-btrfs filesystem, there is an exception on every startup
when trying to identify the subvol root of the hash table file in order
to blacklist it, because non-btrfs filesystems don't have subvol roots.

Fix by checking not only whether $BEESHOME is on btrfs, but whether it
is on the _same_ btrfs, as the bees root, without throwing an exception.
The hash table is blacklisted only when both filesystems are btrfs and
have the same fsid.

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
src/bees-hash.cc

index ab177377930c103e93859fc26483502a8032dfac..88e184abe8d434e5127dd23d03cfc013469c957e 100644 (file)
@@ -811,8 +811,18 @@ BeesHashTable::BeesHashTable(shared_ptr<BeesContext> ctx, string filename, off_t
                prefetch_loop();
         });
 
-       // Blacklist might fail if the hash table is not stored on a btrfs
+       // Blacklist might fail if the hash table is not stored on a btrfs,
+       // or if it's on a _different_ btrfs
        catch_all([&]() {
+               // Root is definitely a btrfs
+               BtrfsIoctlFsInfoArgs root_info;
+               root_info.do_ioctl(m_ctx->root_fd());
+               // Hash might not be a btrfs
+               BtrfsIoctlFsInfoArgs hash_info;
+               if (hash_info.do_ioctl_nothrow(m_fd)) return;
+               // If Hash is a btrfs, Root must be the same one
+               if (root_info.fsid() != hash_info.fsid()) return;
+               // Hash is on the same one, blacklist it
                m_ctx->blacklist_insert(BeesFileId(m_fd));
        });
 }