btrfs-progs/kernel-shared
Qu Wenruo e54514aaea btrfs-progs: fix stray fd close in open_ctree_fs_info()
[BUG]
Although commit b2a1be83b8 ("btrfs-progs: mkfs: keep file descriptors
open during whole time") is making sure we're only closing the writeable
fds after the fs is properly created, there is still a missing fd not
following the requirement.

And this explains the issue why sometimes after mkfs.btrfs, lsblk still
doesn't give a valid uuid.

Shown by the strace output (the command is "mkfs.btrfs -f
/dev/test/scratch1"):

  openat(AT_FDCWD, "/dev/test/scratch1", O_RDWR) = 5 <<< Writeable open
  fadvise64(5, 0, 0, POSIX_FADV_DONTNEED) = 0
  sysinfo({uptime=2529, loads=[8704, 6272, 2496], totalram=4104548352, freeram=3376611328, sharedram=9211904, bufferram=43016192, totalswap=3221221376, freeswap=3221221376, procs=190, totalhigh=0, freehigh=0, mem_unit=1}) = 0
  lseek(5, 0, SEEK_END)                   = 10737418240
  lseek(5, 0, SEEK_SET)                   = 0
  ......
  close(5)                                = 0 <<< Closed now
  pwrite64(6, "O\250\22\261\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 16384, 1163264) = 16384
  pwrite64(6, "\201\316\272\342\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 16384, 1179648) = 16384
  pwrite64(6, "K}S\t\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 16384, 1196032) = 16384
  pwrite64(6, "\207j$\265\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 16384, 1212416) = 16384
  pwrite64(6, "q\267;\336\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 16384, 5242880) = 16384
  fsync(6) <<< But we're still writing into the disk.

[CAUSE]
After more digging, it turns out we have a very obvious escape in
open_ctree_fs_info():

	open_ctree_fs_info()
	|- fp = open(oca->filename, flags);
	|- info = __open_ctree_fd();
	|- close(fp);

As later we only do IO using the device fd, this close() seems fine.

But the truth is, for mkfs usage, this fs_info is a temporary one, with
a special magic number for the disk.  And since mkfs is doing writeable
operations, this close() would immediately trigger udev scan.

And since at this stage, the fs is not yet fully created, udev can race
with mkfs, and may get the invalid temporary superblock.

[FIX]
Introduce a new btrfs_fs_info member, initial_fd, for
open_ctree_fs_info() to record the fd.

And on close_ctree(), if we find fs_info::initial_fd is a valid fd, then
close it.

By this, we make sure all writeable fds are only closed after we have
written valid super blocks into the disk.

Issue: #734
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2024-02-08 08:30:37 +01:00
..
uapi btrfs-progs: make OWNER_REF_KEY type value smallest among inline refs 2023-11-09 15:24:46 +01:00
accessors.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
accessors.h btrfs-progs: remove stride length from on-disk format 2023-10-06 17:26:56 +02:00
async-thread.c btrfs-progs: pull in the full max/min/clamp implementation from kernel 2023-10-10 19:16:29 +02:00
async-thread.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
backref.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
backref.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
compression.h btrfs-progs: minor source sync with kernel 6.4 2023-06-27 16:15:35 +02:00
ctree.c btrfs-progs: kernel-shared: use kmalloc and kfree 2023-11-03 18:04:37 +01:00
ctree.h btrfs-progs: fix stray fd close in open_ctree_fs_info() 2024-02-08 08:30:37 +01:00
delayed-ref.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
delayed-ref.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
dir-item.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
disk-io.c btrfs-progs: fix stray fd close in open_ctree_fs_info() 2024-02-08 08:30:37 +01:00
disk-io.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
extent_io.c btrfs-progs: kernel-shared: use kmalloc and kfree 2023-11-03 18:04:37 +01:00
extent_io.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
extent-io-tree.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
extent-io-tree.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
extent-tree.c btrfs-progs: kernel-shared: use kmalloc and kfree 2023-11-03 18:04:37 +01:00
file-item.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
file-item.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
file.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
free-space-cache.c btrfs-progs: kernel-shared: use kmalloc and kfree 2023-11-03 18:04:37 +01:00
free-space-cache.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
free-space-tree.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
free-space-tree.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
inode-item.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
inode.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
locking.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
locking.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
messages.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
messages.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
misc.h btrfs-progs: sync extent-io-tree.[ch] and misc.h from the kernel 2023-05-26 18:02:29 +02:00
print-tree.c btrfs-progs: dump-tree: output the sequence number for inline references 2023-10-23 15:52:12 +02:00
print-tree.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
README.md btrfs-progs: add README to kernel-shared tracking the progress 2023-05-26 18:02:32 +02:00
root-tree.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
send.h btrfs-progs: sync send.h from kernel 2023-05-26 18:02:32 +02:00
transaction.c btrfs-progs: kernel-shared: use kmalloc and kfree 2023-11-03 18:04:37 +01:00
transaction.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
tree-checker.c btrfs-progs: tree-checker: dump the tree block when hitting an error 2024-01-12 16:34:44 +01:00
tree-checker.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
tree-mod-log.h btrfs-progs: sync and stub-out tree-mod-log.h 2023-05-26 18:02:29 +02:00
ulist.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
ulist.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
uuid-tree.c btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
volumes.c btrfs-progs: kernel-shared: use kmalloc and kfree 2023-11-03 18:04:37 +01:00
volumes.h btrfs-progs: clean up includes, using include-what-you-use 2023-10-03 01:11:57 +02:00
zoned.c btrfs-progs: implement arg_strtou64_with_suffix() with a new helper 2024-01-18 02:14:23 +01:00
zoned.h btrfs-progs: zoned: check SB zone existence properly 2023-10-21 15:51:06 +02:00

Shared sources with kernel

Status and progress of kernel/userspace synchronization.

  • accessors.c - done, local changes
  • accessors.h - done, local changes
  • async-thread.c - done
  • async-thread.h - done
  • backref.c - todo
  • backref.h - todo
  • compression.h - done
  • ctree.c - partial
  • ctree.h - partial
  • delayed-ref.c - partial
  • delayed-ref.h - partial
  • dir-item.c - partial
  • disk-io.c - todo
  • disk-io.h - todo
  • extent_io.c
  • extent_io.h
  • extent-io-tree.c - done, local changes
  • extent-io-tree.h - done, local changes
  • extent-tree.c - todo
  • file.c - todo
  • file-item.c - todo
  • file-item.h - partial
  • free-space-cache.c - not needed
  • free-space-cache.h - not needed
  • free-space-tree.c - partial
  • free-space-tree.h - partial
  • inode.c - todo
  • inode-item.c - partial
  • locking.c - done, local changes
  • locking.h - done, local changes
  • messages.c - done, local changes
  • messages.h - done, local changes
  • misc.h - done
  • print-tree.c - partial, sync to kernel
  • print-tree.h - partial
  • root-tree.c - partial
  • root-tree.h - done
  • send.h - done
  • transaction.c - todo
  • transaction.h - partial, local changes
  • tree-checker.c - partial, local changes
  • tree-checker.h - partial, local changes
  • tree-mod-log.h - done, local changes
  • ulist.c - done
  • ulist.h - done
  • uuid-tree.c - partial
  • volumes.c - todo, local changes
  • volumes.h - todo, local changes
  • zoned.c - todo
  • zoned.h - todo