Commit Graph

93 Commits

Author SHA1 Message Date
David Sterba
4ba164d759 btrfs-progs: use new libbtrfsutil API in internal code
The unified naming API of libbtrfsutil is exported in the library, we
should use it in the internal code as well. In the future the old naming
scheme will be deprecated and remove.

Signed-off-by: David Sterba <dsterba@suse.com>
2025-03-24 22:05:33 +01:00
Daniel Vacek
0cfc20b374 btrfs-progs: defrag: allow passing compression levels
The zlib and zstd compression methods support using compression levels.
Enable defrag to pass them to kernel.

Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Daniel Vacek <neelx@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2025-03-11 23:16:24 +01:00
Junxuan
ee53b498d5 libbtrfsutil: update btrfs_util_create_snapshot doc
The alias should be for btrfs_util_subvolume_snapshot instead of
btrfs_util_snapshot_snapshot.

Pull-request: #969
Signed-off-by: Junxuan Liao <ljx@cs.wisc.edu>
Signed-off-by: David Sterba <dsterba@suse.com>
2025-03-11 22:15:10 +01:00
David Sterba
46b3318556 libbtrfsutil: python: also add version.py to the packaged files
Commit 83bd999c3e ("libbtrfsutil: python: use version from primary
VERSION file") still does not fix all packaging problems. The release
build does not see the file.

Signed-off-by: David Sterba <dsterba@suse.com>
2025-03-11 22:15:09 +01:00
David Sterba
83bd999c3e libbtrfsutil: python: use version from primary VERSION file
The version file of the python subpackage had to have the version set
manually in setup.py due to the out-of-tree build where it was not
possible to access the file VERSION. Manual update was error prone.

Improve that by adding a separate file template that is finalized with
the version during the configure phase. Then it's inclded in setup.py as
it's in the same directory.

There are two exceptions when the file is not required to run setup.py:

- clean - allow running 'make clean' in partially configured directory
- (no arguments) - show the help and commands

In all other cases the file version.py must exist.

Signed-off-by: David Sterba <dsterba@suse.com>
2025-02-15 00:08:32 +01:00
David Sterba
2b551445ff libbtrfsutil: update internal header files (minor change)
Cumulative change sync with UAPI headers, rename and unify multiple
inclusion macro names.

Added defines:
- BTRFS_QGROUP_INHERIT_FLAGS_SUPP
- BTRFS_DEVICE_REMOVE_ARGS_MASK
- BTRFS_SUBVOL_CREATE_ARGS_MASK
- BTRFS_SUBVOL_DELETE_ARGS_MASK
- BTRFS_DEFRAG_RANGE_FLAGS_SUPP

Removed defines:
- BTRFS_BALANCE_CTL_RESUME

Added structures:
- struct btrfs_ioctl_encoded_io_args (and related defines)
- btrfs_ioctl_subvol_wait (and related defines)

Added ioctl definitions:
- BTRFS_IOC_ENCODED_READ
- BTRFS_IOC_ENCODED_WRITE
- BTRFS_IOC_SUBVOL_SYNC_WAIT

Changes to the private header sync key types and other defines.

Signed-off-by: David Sterba <dsterba@suse.com>
2025-02-15 00:08:32 +01:00
Dan Čermák
a658055b8e libbtrfsutil: update docstring of btrfs_util_set_default_subvolume()
The docstring was referring to the function itself and not to the
function for which it is the alias
2024-11-29 19:28:15 +01:00
Qu Wenruo
074cb6d25b libbtrfsutil: python: reuse existing README.md for long description
Instead of copying the file during custom build commands, just use a
soft link to re-use the existing README.d from libbtrfsutil.

Issue: #310
Signed-off-by: Qu Wenruo <wqu@suse.com>
2024-11-26 21:05:34 +01:00
Qu Wenruo
acda1fdba0 libbtrfsutil: python: use MANIFEST.in for headers
[BUG]
Currently with python3.12, the python binding will always result the
following warning:

    [PY]     libbtrfsutil
/usr/lib/python3.12/site-packages/setuptools/_distutils/extension.py:134: UserWarning: Unknown Extension options: 'headers'
  warnings.warn(msg)

[CAUSE]
In the setup.py which specifies the files to be included into the package,
we use setuptools::Extension to specify the file lists and include paths.

But there is no handling of Extension::headers member, thus resulting the
above warning.

[FIX]
According to the docs of setuptools, MANIFEST.in is the file controlling
what files should be included.
So instead of the non-supported headers, use MANIFEST.in to include the
needed headers.

Signed-off-by: Qu Wenruo <wqu@suse.com>
2024-11-26 21:05:34 +01:00
David Sterba
7736f36274 libbtrfsutil: bump btrfsutil version, add release steps
[ ci skip ]

Issue: #310
Signed-off-by: David Sterba <dsterba@suse.com>
2024-11-26 21:05:33 +01:00
David Sterba
87c3fb557e libbtrfsutil: update python setup.py for distribution
Fixes so 'python3 -m build' works and package can be uploaded to pypi
(https://pypi.org/project/btrfsutil/).

- setup.py is still used for local build (make)
- for pypi it must be done by 'python3 -m build' that is build in a
  temporary directory
- btrfsutilpy.h must be also distributed
- version is set manually (the git VERSION file is not accessible)
- the project page metadata is empty, the README.md should be added

Issue: #310
Signed-off-by: David Sterba <dsterba@suse.com>
2024-08-14 23:58:10 +02:00
David Sterba
7e6e0417d1 libbtrfsutil: comment out fd_converter()
Recent changes to the python code reworked path_converter() so that it
does not use fd_converter() anymore. Assuming it may be used in the
future again comment it out.

Signed-off-by: David Sterba <dsterba@suse.com>
2024-07-30 20:04:36 +02:00
Omar Sandoval
d0ab8f55a5 libbtrfsutil: python: fix build on Python 3.13
Python 3.13, currently in beta, removed the internal
_PyObject_LookupSpecial function. The libbtrfsutil Python bindings use
it in the path_converter() function because it was based on internal
path_converter() function in CPython [1]. This is causing build failures
on Fedora Rawhide [2] and Gentoo [3]. Replace path_converter() with a
version that only uses public functions based on the one in drgn [4].

1: d9efa45d74/Modules/posixmodule.c (L1253)
2: https://bugzilla.redhat.com/show_bug.cgi?id=2245650
3: https://github.com/kdave/btrfs-progs/issues/838
4: 9ad29fd864/libdrgn/python/util.c (L81)

Issue: #838
Reported-by: Neal Gompa <neal@gompa.dev>
Reported-by: Sam James <sam@gentoo.org>
Reviewed-by: Neal Gompa <neal@gompa.dev>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2024-07-30 20:01:38 +02:00
David Sterba
f3c7a9d036 libbtrfsutil: bump version to 1.3.2
Fix unwanted closing of internal file descriptor cur_fd in
btrfs_util_subvolume_iterator_next().

Signed-off-by: David Sterba <dsterba@suse.com>
2024-06-25 17:42:19 +02:00
Omar Sandoval
e3e10fc8c6 libbtrfsutil: fix accidentally closing fd passed to subvolume iterator
For an unprivileged subvolume iterator, append_to_search_stack() closes
cur_fd. On the first call to btrfs_util_subvolume_iterator_next(),
cur_fd is equal to the fd that was passed to
btrfs_util_create_subvolume_iterator_fd(). We're not supposed to close
that. We didn't notice it because it's more common to use it through
btrfs_util_create_subvolume_iterator(), which opens its own fd that
should be closed, and because the fd number is often reused internally
by the subvolume iterator.

pop_search_stack() already has a check to avoid closing the passed fd;
add the same check to append_to_search_stack(). Also add a regression
test.

Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2024-06-25 17:42:18 +02:00
David Sterba
7f2ccbb732 libbtrfsutil: bump version to 1.3.1
Fix potentially unaligned access to data retrieved from search tree
ioctl.

Signed-off-by: David Sterba <dsterba@suse.com>
2024-05-29 22:37:59 +02:00
David Sterba
d8c7a5e6f4 libbtrfsutil: declare struct btrfs_ioctl_search_header as packed
The search header is used for extracting data from buffer returned by
the SEARCH_TREE ioctl and needs special access helpers as there are no
guarantees about alignment.

With -fsanitize=alignment this still leads to an error because address
of the members is taken, regardless of the unaligned access method is
used (both temporary memcpy to a structure or the packed struct cast).

Add another hint to compiler that the structure is special and add the
packed attribute. This fixes the sanitizer error.

Signed-off-by: David Sterba <dsterba@suse.com>
2024-05-29 22:37:59 +02:00
David Sterba
06c7012a54 libbtrfsutil: use packed struct based unaligned access for search header accessors
Signed-off-by: David Sterba <dsterba@suse.com>
2024-05-29 22:37:58 +02:00
David Sterba
94e058d8b2 libbtrfsutil: use safe access to potentially unaligned data
There's a lot of places with unsafe access to data that come from a
search buffer, which is packed and the structures there are not
guaranteed to be aligned, also accessing the on-disk format structures.

- search header - this is an in-memory buffer with a series of on-disk
  structures, no alignment must be assumed
- anything that's not a byte buffer must be accessed as an unaligned
  buffer (the exceptions are name-like buffers)

Signed-off-by: David Sterba <dsterba@suse.com>
2024-05-29 21:27:16 +02:00
David Sterba
9a01491042 libbtrfsutil: add internal helpers for unaligned access
We will need generic helpers for unaligned access with LE->CPU
conversion, so add them. Should be use for potentially unaligned read
from tree search buffer.

Signed-off-by: David Sterba <dsterba@suse.com>
2024-05-29 21:27:07 +02:00
David Sterba
c6d2d05ee6 libbtrfsutil: pass temporary subvol info buffer in btrfs_util_deleted_subvolumes_fd()
Reported by 'gcc -fanalyzer':
libbtrfsutil/subvolume.c:415:20: warning: dereference of NULL ‘subvol’ [CWE-476] [-Wanalyzer-null-dereference]

The analyzer found a path where the NULL pointer passed as argument to
btrfs_util_subvolume_info_fd() could be dereferenced. This is unlikely
unless there's a corruption on the disk as the header->offset would have
to be 0. Pass a valid temporary buffer so this does not happen but
there's no use of it otherwise.

Signed-off-by: David Sterba <dsterba@suse.com>
2024-04-18 19:16:15 +02:00
David Sterba
85ea79f6b2 libbtrfsutil: use unsigned types for bit shifts
Bit shifts should be done on unsigned type as a matter of good practice
to avoid any problems with bit overflowing to the sign bit.

Signed-off-by: David Sterba <dsterba@suse.com>
2024-03-12 22:04:09 +01:00
David Sterba
126049c312 libbtrfsutil: update definitions in btrfs.h
Sync structures definitions and constants from kernel source.

- update btrfs_ioctl_fs_info_args
- update btrfs_ioctl_send_args
- verity, block-group-tree, raid-stripe-tree, simple quota
- ioctl definition updates
- copy comments
- diff minimization (whitespace changes, moved definitions)

Signed-off-by: David Sterba <dsterba@suse.com>
2024-03-06 20:53:44 +01:00
David Sterba
30bc34d333 libbtrfsutil: update definitions in btrfs_tree.h
Copy what's in kernel header, new structures and constants.

- raid-stripe-tree
- verity
- simple quota

Deleted:
- btrfs_extent_ref_v0 (obsolete, kernel support removed)

Signed-off-by: David Sterba <dsterba@suse.com>
2024-03-06 20:41:04 +01:00
David Sterba
27e965f538 libbtrfsutil: add aliases for new naming scheme, version 1.3
The initial version of libbtrfsutil did not follow a unified naming
scheme that's usually used for libraries like those provide by
util-linux. Add aliases that are "btrfs_util_" + object + action +
suffix.

The library version changes to 1.3 but there's no new functionality,
only the aliases added. New functions can be added in the future without
possible confusion when the same action could apply to different
objects.

Issue: #574
Signed-off-by: David Sterba <dsterba@suse.com>
2024-03-06 20:24:16 +01:00
Qu Wenruo
dad89b7aca btrfs-progs: sync DEV_INFO ioctl from kernel
Add fsid to DEV_INFO structure introduced in kernel 6.3 by 2943868a909f
("btrfs: ioctl: return device fsid from DEV_INFO ioctl").

Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2023-03-21 02:55:56 +01:00
David Sterba
02ffc977be btrfs-progs: docs: don't use wiki links in manual pages and package
The wiki has been archived so remove the links from manual page
footers. Also replace the wiki link by RTD site in configure and
libbtrfsutil.

Signed-off-by: David Sterba <dsterba@suse.com>
2023-03-16 22:38:21 +01:00
Josef Bacik
53f8b8fd01 btrfs-progs: make btrfs_qgroup_level helper match the kernel
We return __u16 in the kernel, as this is actually the size of
btrfs_qgroup_level.  Adjust the existing helpers and update all the
callers to deal with the new size appropriately.  This will make syncing
the kernel code cleaner.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2022-11-28 18:57:43 +01:00
David Sterba
70a2f5520c libbtrfsutil: update include lists
The tool IWYU (include what you use) suggests to remove and add some
includes. Update the includes of implementation files only.

Signed-off-by: David Sterba <dsterba@suse.com>
2022-10-11 09:08:07 +02:00
Josef Bacik
ec0eaae673 btrfs-progs: add definitions for the block group tree
Add the on disk definitions for the block group tree.  This will be part
of the super block so we need to add the appropriate helpers to the
super block, as well as adding it to the backup roots.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2021-11-30 19:08:39 +01:00
David Sterba
ec6f6c370a libbtrfsutils: update definitions for recently added features
There are missing incompat bits in the util headers:

- metadata_uuid
- raid1c34
- zoned

This does not change library ABI, no version change needed.

Signed-off-by: David Sterba <dsterba@suse.com>
2021-10-20 18:59:24 +02:00
Nikolay Borisov
451db51bdb btrfs-progs: remove support for BTRFS_SUBVOL_CREATE_ASYNC
Kernel has removed support for this feature in 5.7 so let's remove
support from progs as well.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2021-10-06 16:49:21 +02:00
Omar Sandoval
e9c2942f38 libbtrfsutil: fix race between subvolume iterator and deletion
Subvolume iteration has a window between when we get a root ref (with
BTRFS_IOC_TREE_SEARCH or BTRFS_IOC_GET_SUBVOL_ROOTREF) and when we look
up the path of the parent directory (with BTRFS_IOC_INO_LOOKUP{,_USER}).
If the subvolume is moved or deleted and its old parent directory is
deleted during that window, then BTRFS_IOC_INO_LOOKUP{,_USER} will fail
with ENOENT. The iteration will then fail with ENOENT as well.

We originally encountered this bug with an application that called
`btrfs subvolume show` (which iterates subvolumes to find snapshots) in
parallel with other threads creating and deleting subvolumes. It can be
reproduced almost instantly with the included test cases.

Subvolume iteration should be robust against concurrent modifications to
subvolumes. So, if a subvolume's parent directory no longer exists, just
skip the subvolume, as it must have been deleted or moved elsewhere.

Reviewed-by: Neal Gompa <ngompa13@gmail.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2021-07-29 13:01:55 +02:00
er888kh
f9979f9dd6 libbtrfsutil: fix typo in README example
Fix misplaced quote.

Pull-request: #387
Author: er888kh <45465346+er888kh@users.noreply.github.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2021-07-26 13:30:40 +02:00
David Sterba
1eb7b11303 btrfs-progs: remove stale user transaction ioctl definitions
The user transaction ioctls have been removed in kernel 4.17 by commit
7a5a07a81062 ("btrfs: Remove userspace transaction ioctls"), the
definitions are not relevant and can be removed.

The numbers could be reused in the future, eg. when there are no
maintained LTS kernels older than 4.19.

Signed-off-by: David Sterba <dsterba@suse.com>
2021-06-19 22:07:50 +02:00
David Sterba
60541cf29e libbtrfsutil: add API summary
Add section with brief description of all API functions so it's clear
what's there and what's missing.

Signed-off-by: David Sterba <dsterba@suse.com>
2021-05-14 17:14:34 +02:00
David Sterba
b3e6260e8a libbtrfsutil: fix test case class name for python bindings
In file test_filesystem.py the class name should be TestFilesystem, this
looks like a typo and does not affect functionality.

Signed-off-by: David Sterba <dsterba@suse.com>
2021-05-06 16:41:47 +02:00
David Sterba
4b6f420aa5 libbtrfsutil: add warning about autogenerated constants.c
Signed-off-by: David Sterba <dsterba@suse.com>
2021-05-06 16:41:47 +02:00
David Sterba
86f85f176d libbtrfsutil: document how to add a new API function
Signed-off-by: David Sterba <dsterba@suse.com>
2021-05-06 16:41:47 +02:00
David Sterba
b129cbafec libbtrfsutil: move the linker sym file to our directory
Keep all the related files together.

Signed-off-by: David Sterba <dsterba@suse.com>
2021-05-06 16:41:47 +02:00
Neal Gompa
9e30f779e3 libbtrfsutil: relicense to LGPLv2.1+
This relicenses the libbtrfsutil library to LGPLv2.1+ from LGPLv3.
People that have contributed non-trivial changes acknowledged the change
and are listed below.

There's a potential licensing conflict with the 'btrfs' utility that is
GPLv2 and statically links libbtrfsutil, this is not a valid combination
per the compatibility matrix as found in
https://www.gnu.org/licenses/gpl-faq.html#AllCompatibility or
http://gplv3.fsf.org/dd3-faq .

We also have an explicit request to change the license [1] (issue #323)
from LGPLv3 to allow use in environments that don't like GPLv3. Though
the library license is not GPLv3, the full text of the license is in the
repository and the 'lesser' part is an addendum. This was perhaps a bit
confusing, nevertheless this gets clarified as well.

[1] https://lore.kernel.org/linux-btrfs/b927ca28-e280-4d79-184f-b72867dbdaa8@denx.de/

Acked-by: Omar Sandoval <osandov@fb.com>
Acked-by: Misono Tomhiro <misono.tomohiro@jp.fujitsu.com>
Acked-by: Qu Wenruo <wqu@suse.com>
Acked-by: Marcos Paulo de Souza <mpdesouza@suse.com>
Acked-by: Anand Jain <anand.jain@oracle.com>
Acked-by: Zygo Blaxell <ce3g8jdj@umail.furryterror.org>
Link: https://bugs.debian.org/985400
Issue: #323
Signed-off-by: Neal Gompa <ngompa@fedoraproject.org>
Signed-off-by: David Sterba <dsterba@suse.com>
2021-04-19 18:58:26 +02:00
David Sterba
f7cc20b1fa libbtrfsutil: set pkg-config Version to follow main package
The library ABI is not the right version, set also the util package to
follow main package.

Signed-off-by: David Sterba <dsterba@suse.com>
2020-10-22 20:34:30 +02:00
David Sterba
a178b6e508 libbtrfsutil: let python-btrfsutil version follow main package version
Neal points out that the python bindings of libbtrfsutil version is set
from the library ABI rather than the package itself. As this brings some
confusion to packaging, derive the verion the main package too.

Link: http://lore.kernel.org/linux-btrfs/CAEg-Je-VLz9zZOKEVa+x0V+dpyojtRcjBw7maO73zpmowdOyTQ@mail.gmail.com
Reported-by: Neal Gompa <ngompa13@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-10-22 20:34:01 +02:00
Sheng Mao
4498fe1a2a libbtrfsutil: add pkg-config spec file
Add pkg-config file for libbtrfsutil which can be used to set up
compilation and link flags.

The paths in pc file depend on prefix variable but ignore DESTDIR.
DESTDIR is used for packaging and it should not affect the paths in pc
file.

Issue: #285
Signed-off-by: Sheng Mao <shngmao@gmail.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-10-20 15:49:07 +02:00
cezarmathe
dbf60b488e libbtrfsutil: update btrfs_util_delete_subvolume docs
btrfs_util_error btrfs_util_delete_subvolume requires elevated
privileges, despite the fact that the documentation does not say that.

The following does not work in all scenarios:

	$ btrfs subvolume create ~/mytest
	$ btrfs subvolume delete ~/mytest

Document the additional requirements.

Pull-request: #253
Issue: #252
Author: cezarmathe <me@cezarmathe.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-05-29 12:42:49 +02:00
Goffredo Baroncelli
9fd37f951b btrfs-progs: complete the implementation RAID1C34 definitions
- complete the function btrfs_err_str adding some missing cases
- sync the enum btrfs_err_code (in libbtrfsutil/btrfs.h) with the
  rest of the codes (user space and kernel space).
- add missing fields to btrfs_raid_array[] for raid1c[34]

Signed-off-by: Goffredo Baroncelli <kreijack@inwind.it>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-04-01 20:20:59 +02:00
David Sterba
16fcd50055 libbtrfsutil: bump version to 1.2
New function:

 * btrfs_util_delete_subvolume_by_id_fd

Signed-off-by: David Sterba <dsterba@suse.com>
2020-03-04 19:21:09 +01:00
Marcos Paulo de Souza
672e398eed libbtrfsutil: add support for IOC_SNAP_DESTROY_V2
Add new ioctl and helpers to allow extended arguments to be passed to
subvolume deletion ioctl.  The parent_fs argument should be a mount
point.

Signed-off-by: Marcos Paulo de Souza <mpdesouza@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-03-04 19:21:09 +01:00
Zygo Blaxell
e6ea9ed1f1 libbtrfsutil: add LOGICAL_INO_V2
Update the args structure, add the flags constant and the ioctl magic
number.

Reviewed-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: Zygo Blaxell <ce3g8jdj@umail.furryterror.org>
Signed-off-by: David Sterba <dsterba@suse.com>
2020-01-09 15:06:37 +01:00
Qu Wenruo
f01d2b8558 libbtrfsutil: Convert to designated initialization for SubvolumeIterator_type
[BUG]
When compiling btrfs-progs with libbtrfsutil on a python3.8 system, we
got the following warning:

  subvolume.c:636:2: warning: initialization of ‘long int’ from ‘void *’ makes integer from pointer without a cast [-Wint-conversion]
    636 |  NULL,     /* tp_print */
        |  ^~~~
  subvolume.c:636:2: note: (near initialization for ‘SubvolumeIterator_type.tp_vectorcall_offset’)

[CAUSE]
C definition of PyTypeObject changed in python 3.8.
Now at the old tp_print, we have tp_vectorcall_offset.

So we got above warning.

[FIX]
C has designated initialization, which can assign values to each named
member, without hard coding to match the offset.
And all the other uninitialized values will be set to 0, so we can save
a lot of unneeded "= 0" or "= NULL" lines.

Just use that awesome feature to avoid any future breakage.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-11-22 19:09:51 +01:00