1
0
mirror of https://github.com/kdave/btrfs-progs synced 2025-04-07 09:41:29 +00:00
Commit Graph

5982 Commits

Author SHA1 Message Date
David Sterba
9321c81488 btrfs-progs: wip - send progress
Pass BTRFS_SEND_FLAG_CALCULATE_DATA_SIZE flag and add command line
option. Unfinished.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-21 19:44:15 +02:00
David Sterba
ef719df5bb btrfs-progs: receive: implement FILEATTR command
The initial proposal for file attributes was built on simply doing
SETFLAGS but this builds on an old and non-extensible interface that has
no direct mapping for all inode flags. There's a unified interface
fileattr that covers file attributes and xflags, it should be possible
to add new bits.

On the protocol level the value is copied as-is in the original inode
but this does not provide enough information how to apply the bits on
the receiving side. Eg. IMMUTABLE flag prevents any changes to the file
and has to be handled manually.

The receiving side does not apply the bits yet, only parses it from the
stream.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-21 17:35:03 +02:00
David Sterba
0353c83056 btrfs-progs: receive: switch context variables to bool
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-21 14:59:57 +02:00
David Sterba
b608588b94 btrfs-progs: add constant for initial getopt values
Add constant for initial value to avoid unexpected clashes with user
defined getopt values and shift the common size getopt values.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-21 14:59:52 +02:00
David Sterba
b98227f67e btrfs-progs: build: rename compression support variables
Now that LZO and ZSTD are optional for not just restore, rename the
build variables to a more generic name and update configure summary.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-21 02:25:25 +02:00
David Sterba
296ab705dc btrfs-progs: receive: optional build for lzo, zstd
There are build-time options for LZO and ZSTD support, the stream v2+
supports compression. The help text lists what has been compiled in,
similar to what 'restore' does, with a similar limitation that a stream
with compressed data cannot be processed if any of the extents is
compressed.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-21 02:25:06 +02:00
David Sterba
958798e743 btrfs-progs: libbtrfs: reduce exports from ctree.h
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-15 21:54:20 +02:00
David Sterba
2a4c152f1e btrfs-progs: docs: update troubleshooting
Copy contents from wiki page Problem_FAQ.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-15 20:14:22 +02:00
David Sterba
134e798f21 btrfs-progs: docs: add feature by version table from wiki
Copy contents from https://btrfs.wiki.kernel.org/index.php/Changelog#By_feature

The formatting is done by a definition and list, instead of a table.
Unfortunatelly RST does not wrap long text in table cells so the width
exceeds visible area.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-14 21:09:50 +02:00
David Sterba
edf5c2d279 btrfs-progs: docs: distinguish Changes title
Rename the section to contain btrfs-progs as there will be more
sections, eg. kernel or by feature.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-14 19:47:35 +02:00
David Sterba
12c8e00a41 btrfs-progs: docs: copy wiki page Contributors
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-14 17:40:04 +02:00
David Sterba
6618a954af btrfs-progs: docs: split project information to new section
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-14 17:12:54 +02:00
David Sterba
6322fde0fd btrfs-progs: docs: fix spinx build warnings
Fix the following warnings:

    [SPHINX] man
../CHANGES:37: ERROR: Unexpected indentation.
../CHANGES:1183: WARNING: Block quote ends without a blank line; unexpected unindent.
./Documentation/DocConventions.rst:31: ERROR: Unexpected indentation.
./Documentation/Source-repositories.rst:2: WARNING: Duplicate explicit target name: "web access".
./Documentation/DocConventions.rst: WARNING: document isn't included in any toctree

The free format of CHANGES sometimes does not align with RST so fix it
so it's visually similar in both formats. Remove RST references to 'web
access', URLs are parsed and rendered clickable and we don't have full
reference list yet. Doc conventions have been updated to RST but not
finalized so put it to TODO section.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-13 15:28:08 +02:00
Boris Burkov
8195c0516e btrfs-progs: receive: add tests for basic encoded_write send/receive
Adapt the existing send/receive tests by passing '-o compress-force' to
the mount commands in a new test. After writing a few files in the
various compression formats, send/receive them with and without
--force-decompress to test both the encoded_write path and the fallback
to decode+write.

Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:33 +02:00
Omar Sandoval
0ee5b22345 btrfs-progs: send: stream v2 ioctl flags
First, add a --proto option to allow specifying the desired send
protocol version. It defaults to one, the original version. In a couple
of releases once people are aware that protocol revisions are happening,
we can change it to default to zero, which means the latest version
supported by the kernel. This is based on Dave Sterba's patch.

Also add a --compressed-data flag to instruct the kernel to use
encoded_write commands for compressed extents. This requires an explicit
opt in separate from the protocol version because:

1. The user may not want compression on the receiving side, or may want
   a different compression algorithm/level on the receiving side.
2. It has a soft requirement for kernel support on the receiving side
   (btrfs-progs can fall back to decompressing and writing if the kernel
   doesn't support BTRFS_IOC_ENCODED_WRITE, but the user may not be
   prepared to pay that CPU cost). Going forward, since it's easier to
   update progs than the kernel, I think we'll want to make new send
   features that require kernel support opt-in, whereas anything that
   only requires a progs update can happen automatically.

Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:33 +02:00
Boris Burkov
7a6fb356dc btrfs-progs: receive: process setflags ioctl commands
In send stream v2, send can emit a command for setting inode flags via
the setflags ioctl. Pass the flags attribute through to the ioctl call
in receive.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:32 +02:00
Boris Burkov
54db5c0397 btrfs-progs: receive: process fallocate commands
Send stream v2 can emit fallocate commands, so receive must support them
as well. The implementation simply passes along the arguments to the
syscall. Note that mode is encoded as a u32 in send stream but fallocate
takes an int, so there is a unsigned->signed conversion there.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:32 +02:00
Boris Burkov
d20e759fc9 btrfs-progs: receive: encoded_write fallback to explicit decode and write
An encoded_write can fail if the file system it is being applied to does
not support encoded writes or if it can't find enough contiguous space
to accommodate the encoded extent. In those cases, we can likely still
process an encoded_write by explicitly decoding the data and doing a
normal write.

Add the necessary fallback path for decoding data compressed with zlib,
lzo, or zstd. zlib and zstd have reusable decoding context data
structures which we cache in the receive context so that we don't have
to recreate them on every encoded_write.

Finally, add a command line flag for force-decompress which causes
receive to always use the fallback path rather than first attempting the
encoded write.

Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:32 +02:00
Boris Burkov
e30f7d3ed2 btrfs-progs: receive: process encoded_write commands
Add a new btrfs_send_op and support for both dumping and proper receive
processing which does actual encoded writes.

Encoded writes are only allowed on a file descriptor opened with an
extra flag that allows encoded writes, so we also add support for this
flag when opening or reusing a file for writing.

Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:32 +02:00
Omar Sandoval
1c05b10008 btrfs-progs: receive: add send stream v2 commands and attributes
Update our copy of send.h from the kernel. This adds the new commands
and attributes for v2 as well as explicit enum numbering.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:32 +02:00
Boris Burkov
aa1ca3789e btrfs-progs: receive: support v2 send stream DATA tlv format
The new format privileges the BTRFS_SEND_A_DATA attribute by
guaranteeing it will always be the last attribute in any command that
needs it, and by implicitly encoding the data length as the difference
between the total command length in the command header and the sizes of
the rest of the attributes (and of course the tlv_type identifying the
DATA attribute). To parse the new stream, we must read the tlv_type and
if it is not DATA, we proceed normally, but if it is DATA, we don't
parse a tlv_len but simply compute the length.

In addition, we add some bounds checking when parsing each chunk of
data, as well as for the tlv_len itself.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:32 +02:00
Boris Burkov
a82996e1b6 btrfs-progs: receive: dynamically allocate sctx->read_buf
In send stream v2, write commands can now be an arbitrary size. For that
reason, we can no longer allocate a fixed array in sctx for read_cmd.
Instead, read_cmd dynamically allocates sctx->read_buf. To avoid
needless reallocations, we reuse read_buf between read_cmd calls by also
keeping track of the size of the allocated buffer in sctx->read_buf_sz.

We do the first allocation of the old default size at the start of
processing the stream, and we only reallocate if we encounter a command
that needs a larger buffer.

Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-07 13:59:31 +02:00
Boris Burkov
cf269aa47b btrfs-progs: receive: support v2 send stream larger tlv_len
An encoded extent can be up to 128K in length, which exceeds the largest
value expressible by the current send stream format's 16 bit tlv_len
field. Since encoded writes cannot be split into multiple writes by
btrfs send, the send stream format must change to accommodate encoded
writes.

Supporting this changed format requires retooling how we store the
commands we have processed. We currently store pointers to the struct
btrfs_tlv_headers in the command buffer. This is not sufficient to
represent the new BTRFS_SEND_A_DATA format. Instead, parse the attribute
headers and store them in a new struct btrfs_send_attribute which has a
32bit length field. This is transparent to users of the various TLV_GET
macros.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Boris Burkov <boris@bur.io>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 19:21:39 +02:00
David Sterba
47b5cf867f
Btrfs progs v5.18.1
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 19:16:38 +02:00
David Sterba
843a9f4a42 btrfs-progs: update CHANGES for 5.18.1
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 19:15:28 +02:00
David Sterba
355844f86b btrfs-progs: libbtrfs: move extent-cache.h to ctree.h
Move the remaining structure definitions and prototypes to ctree.h that
is now the only user.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:49:22 +02:00
David Sterba
6b539bbbc4 btrfs-progs: libbtrfs: move extent_io.h to ctree.h
Move the remaining structure definitions and prototypes to ctree.h that
is now the only user.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:49:13 +02:00
David Sterba
ec59b70065 btrfs-progs: libbtrfs: remove declarations without exports in extent-cache.h
The header extent-cache.h is internal and provides only structures defined
in ctree.h, we don't need anything else besides the structures.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:49:08 +02:00
David Sterba
22c842e7e1 btrfs-progs: libbtrfs: remove declarations without exports in extent_io.h
The header extent_io.h is internal and provides only structures defined
in ctree.h, we don't need anything else besides the structures and
declarations used for inline functions in other headers.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:49:06 +02:00
David Sterba
194b90aa2c btrfs-progs: libbtrfs: remove declarations without exports in send-utils
The list of exported functions in libbtrfs.sym defines the ABI so the
headers should match that.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:49:03 +02:00
David Sterba
0f65bf66be btrfs-progs: libbtrfs: drop ifdef BTRFS_FLAT_INCLUDES where not necessary
Headers that are only exported and not used for build do not need the
BTRFS_FLAT_INCLUDES switch (between local and installed headers). Now
that there are local copies of the shared headers drop the respective
part from local headers.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:48:52 +02:00
David Sterba
bb7db09e46 btrfs-progs: libbtrfs: use own copy of ctree.h, extent_io.h, send.h and extent-cache.h
Let libbtrfs use own copy of the exported header files to avoid
potential breakage when syncing with kernel headers and also to remove
declarations that are not used by userspace.  The send.h is frozen to
support protocol v1.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:48:46 +02:00
David Sterba
c6dbd1d337 btrfs-progs: libbtrfs: add clean targets
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:48:33 +02:00
David Sterba
3b0fe46c08 btrfs-progs: docs: update Gloassary
Bring up to date, reformat, remove some wiki references.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:48:15 +02:00
David Sterba
02b06b3e8d btrfs-progs: convert: fix self-reference of directory
Creating a simple directory structure leads to the following error:

  $ btrfs check
  Checking filesystem on test.img
  UUID: 8f2292ad-c80e-4ab4-8a72-29aa3a83002c
  [1/7] checking root items
  [2/7] checking extents
  [3/7] checking free space cache
  [4/7] checking fs roots
	  unresolved ref dir 260 index 0 namelen 2 name .. filetype 0 errors 3, no dir item, no dir index
  ERROR: errors found in fs roots
  found 101085184 bytes used, error(s) found
  total csum bytes: 98460
  total tree bytes: 262144
  total fs tree bytes: 49152
  total extent tree bytes: 16384
  btree space waste bytes: 151864
  file data blocks allocated: 167931904
   referenced 167931904

The self-reference should exist for the toplevel directory, where the
parent directory points to itself.

Issue: 
Author: tyan0
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:48:08 +02:00
frukto
31750cb120 btrfs-progs: docs: make description of list output more clear
Author: frukto <fruktopus@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:48:03 +02:00
frukto
d44b0efe27 btrfs-progs: docs: fix typo in mkfs.btrfs
Pull-rquest: 
Author: frukto <fruktopus@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:48:00 +02:00
David Sterba
497fae26c6 btrfs-progs: docs: reformat btrfs-property manual page
Add sections for the types and properties, add examples.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:47:57 +02:00
David Sterba
63e0f3b39c btrfs-progs: kernel-lib: make headers C++ compatible
The snapper build fails due to updates to kernel-lib files, the type
casts do not work the same way in C++. Simplify READ_ONCE/WRITE_ONCE
even more, drop use of 'new' as identifier.

Issue: https://github.com/openSUSE/snapper/issues/725
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:47:53 +02:00
Johannes Thumshirn
a7ae6d5948 btrfs-progs: zoned: add upper and lower zone size boundaries
As we're not supporting arbitrarily big or small zone sizes in the kernel,
reject devices that don't fit in progs as well.

Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:47:50 +02:00
David Sterba
a234524c95 btrfs-progs: docs: add link to released tarballs
Signed-off-by: David Sterba <dsterba@suse.com>
2022-06-06 15:47:38 +02:00
David Sterba
f9e3035842
Btrfs progs v5.18
Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-25 13:40:13 +02:00
David Sterba
5b806c0bce btrfs-progs: update CHANGES for 5.18
Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-25 13:38:10 +02:00
David Sterba
df8519c35f btrfs-progs: tests: remove ext3 tests
The ext3 has been superseded by ext4, we don't need to test it
separately so this reduces the convert tests run time.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-24 20:47:55 +02:00
David Sterba
5c95441d2c btrfs-progs: restore: list the supported compression
Show the list of supported compression algorithms in the help string as
we now have optional LZO and ZSTD.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-24 19:21:10 +02:00
Ross Burton
73545c1fe6 btrfs-progs: build: add option to disable LZO support for restore
LZO as a compression format is pretty archaic these days, there are
better algorithms in all metrics for compression and decompression, and
lzo hasn't had a new release since 2017.

Add an option to disable LZO (defaulting to enabled), and respect it in
cmds/restore.c.

NOTE: disabling support for LZO will make make it impossible to restore
data from filesystems where the compression has ever been used. It's not
recommended to build without the support in general.

Signed-off-by: Ross Burton <ross.burton@arm.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-24 19:21:10 +02:00
David Sterba
a60afdceb9 btrfs-progs: docs: update header formatting
Capitals were meant for manual pages but in html it looks better with
the first letter.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-20 23:59:40 +02:00
David Sterba
5ba643915c btrfs-progs: docs: fix superscript formatting
Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-20 23:52:20 +02:00
David Sterba
77ff4d118f btrfs-progs: docs: convert conventions to RST
Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-20 23:37:24 +02:00
Forza
f7af4dc04a btrfs-progs: docs: clarification on mixed profile
It is not possible to use mixed profile together with other profiles.
The current wording is not clear about this, so let's add a
clarification note.

Author: Forza
Signed-off-by: David Sterba <dsterba@suse.com>
2022-05-20 19:31:02 +02:00