btrfs: add io_uring command for encoded reads (ENCODED_READ ioctl)
Add an io_uring command for encoded reads, using the same interface as the existing BTRFS_IOC_ENCODED_READ ioctl. btrfs_uring_encoded_read() is an io_uring version of btrfs_ioctl_encoded_read(), which validates the user input and calls btrfs_encoded_read() to read the appropriate metadata. If we determine that we need to read an extent from disk, we call btrfs_encoded_read_regular_fill_pages() through btrfs_uring_read_extent() to prepare the bio. The existing btrfs_encoded_read_regular_fill_pages() is changed so that if it is passed a valid uring_ctx, rather than waking up any waiting threads it calls btrfs_uring_read_extent_endio(). This in turn copies the read data back to userspace, and calls io_uring_cmd_done() to complete the io_uring command. Because we're potentially doing a non-blocking read, btrfs_uring_read_extent() doesn't clean up after itself if it returns -EIOCBQUEUED. Instead, it allocates a priv struct, populates the fields there that we will need to unlock the inode and free our allocations, and defers this to the btrfs_uring_read_finished() that gets called when the bio completes. Signed-off-by:Mark Harmstone <maharmstone@fb.com> Reviewed-by:
David Sterba <dsterba@suse.com> Signed-off-by:
David Sterba <dsterba@suse.com>
Showing
- fs/btrfs/btrfs_inode.h 1 addition, 1 deletionfs/btrfs/btrfs_inode.h
- fs/btrfs/file.c 1 addition, 0 deletionsfs/btrfs/file.c
- fs/btrfs/inode.c 31 additions, 10 deletionsfs/btrfs/inode.c
- fs/btrfs/ioctl.c 302 additions, 0 deletionsfs/btrfs/ioctl.c
- fs/btrfs/ioctl.h 2 additions, 0 deletionsfs/btrfs/ioctl.h
- fs/btrfs/send.c 2 additions, 1 deletionfs/btrfs/send.c
Loading