Commit Graph

4678 Commits (5f5c497c8b556712c10975070a8d234ab19e64a2)
 

Author SHA1 Message Date
Lu Fengqi fa13420cc7 btrfs-progs: lowmem: fix false alert about the existence of gaps in the check_file_extent
The 'end' parameter of check_file_extent tracks the ending offset of the
last checked extent. This is used to detect gaps between adjacent extents.

Currently such gaps are wrongly detected since for regular extents only
the size of the extent is added to the 'end' parameter. This results in
wrongly considering all extents of a file as having gaps between them
when only 2 of them really have a gap as seen in the example below.

Solution:
The extent_end variable should set to the sum of the offset and the
extent_num_bytes of the file extent.

Example:
Suppose that lowmem check the following file extent of inode 257.

        item 6 key (257 EXTENT_DATA 0) itemoff 15813 itemsize 53
                generation 6 type 1 (regular)
                extent data disk byte 13631488 nr 4096
                extent data offset 0 nr 4096 ram 4096
                extent compression 0 (none)
        item 7 key (257 EXTENT_DATA 8192) itemoff 15760 itemsize 53
                generation 6 type 1 (regular)
                extent data disk byte 13631488 nr 4096
                extent data offset 0 nr 4096 ram 4096
                extent compression 0 (none)
        item 8 key (257 EXTENT_DATA 12288) itemoff 15707 itemsize 53
                generation 6 type 1 (regular)
                extent data disk byte 13631488 nr 4096
                extent data offset 0 nr 4096 ram 4096
                extent compression 0 (none)

For inode 257, check_inode_item set extent_end to 0, then call
check_file_extent to check item {6,7,8}.
item 6)
	offset(0) == extent_end(0)
	extent_end = extent_end(0) + extent_num_bytes(4096)
item 7)
	offset(8192) != extent_end(4096)
	extent_end = extent_end(4096) + extent_num_bytes(4096)
			^^^
	The old extent_end should replace by offset(8192).
item 8)
	offset(12288) != extent_end(8192)
		^^^
	But there is no gap between item {7,8}.

Fixes: d88da10ddd ("btrfs-progs: check: introduce function to check file extent")
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
[Move this patch as the 1st patch, since it's an independent fix]
Signed-off-by: Qu Wenruo <wqu@suse.com>
2019-04-16 09:01:53 +08:00
Nikolay Borisov cfa470d5a6 btrfs-progs: Remove get_argv0_buf
get_argv0_buf is used only in two functions in help.c which also has
direct access to the static argv0_buf. All other references to this
buffer are direct. So remove the function. No functional changes.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-11 15:30:33 +01:00
Qu Wenruo f312aff23f btrfs-progs: inspect-dump-tree: Allow --block to be specified multiple times
Reuse extent-cache facility to record multiple bytenr so --block can be
specified multiple times.

Despite that, add a sector size alignment check before we try to print a
tree block.  Please note that, nodesize alignment check is not suitable
here as meta chunk start bytenr could be unaligned to nodesize.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 15:58:06 +01:00
Qu Wenruo 7a12d8470e btrfs-progs: Do metadata preallocation as long as we're not modifying extent tree
In github issues, one user reports unexpected ENOSPC error if enabling
datasum druing convert.  After some investigation, it looks like that
during ext2_saved/image creation, we could create large file extent
whose size can be 128M (max data extent size).

In that case, its csum block will be at least 128K. Under certain case
we need to allocate extra metadata chunks to fulfill such space
requirement.

However we only do metadata prealloc if we're reserving extents for fs
trees.  (we use btrfs_root::ref_cows to determine whether we should do
metadata prealloc, and that member is only set for fs trees).

There is no explaination on why we only do metadata prealloc for file
trees, but at least from my investigation, it could be related to avoid
nested extent tree modication.

At least extent reservation for csum tree shouldn't be a problem with
metadata block group preallocation.

So change the metadata block group preallocation check from
"root->ref_cow" to "root->root_key.objectid !=
BTRFS_EXTENT_TREE_OBJECTID", and add some comment for it.

Issue: #123
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 15:33:54 +01:00
Adam Borowski 5ebf288875 btrfs-progs: defrag: open files RO on new enough kernels
Defragging an executable conflicts both way with it being run, resulting in
ETXTBSY.  This either makes defrag fail or prevents the program from being
executed.

Kernels 4.19-rc1 and later allow defragging files you could have possibly
opened rw, even if the passed descriptor is ro (commit 616d374efa23
"btrfs: allow defrag on a file opened read-only that has rw
permissions").

Signed-off-by: Adam Borowski <kilobyte@angband.pl>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 15:33:54 +01:00
Adam Borowski 3da12f3d5f btrfs-progs: fix kernel version parsing on some versions past 3.0
The code fails if the third section is missing (like "4.18") or is followed
by anything but "." or "-".  This happens for example if we're not exactly
at a tag and CONFIG_LOCALVERSION_AUTO=n (which results in "4.18.5+").

Signed-off-by: Adam Borowski <kilobyte@angband.pl>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 15:33:54 +01:00
Steven Davies 33b4acc7df btrfs-progs: receive: add option for quiet mode
Provide an option in `btrfs receive` to suppress the informational
messages when writing files.

Signed-off-by: Steven Davies <btrfs@steev.me.uk>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 15:33:54 +01:00
Qu Wenruo dc592178f2 btrfs-progs: gitignore: Ignore hidden files
A lot of editor/IDE related config files are dotfiles, like .vimrc
or .clang_complete.

Instead of adding gitignore entry for each editor/IDE, just ignore all
dotfiles.

Files tracked by git are not ignored and can be updated as usual.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 13:27:27 +01:00
David Sterba c7d546ab6b btrfs-progs: qgoup: propagate errors from btrfs_qgroup_parse_sort_string
Get rid of the exit inside and propagate errors to the callers.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:57 +01:00
David Sterba 9a1550bb2d btrfs-progs: qgroup show: report unrecognized format of sort string
Let the parsing function distinguish between parsing and other errors
and use that in qgroup show.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:57 +01:00
David Sterba 88ab0824a2 btrfs-progs: qgroup show: report errors while parsing sort string
Print a better message when there are unknown problems while parsing the
sort string. This currently is -ENOMEM and -1 on uknown format. This
will be changed.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:57 +01:00
David Sterba 6927db8ad9 btrfs-progs: qgroup: remove unused option handling
The commands create/destroy do not take any arguments so the error
hanling does not make sense here.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:57 +01:00
David Sterba f34d4c5ac0 btrfs-progs: qgroup: report unknown option
Since commit 208ba29007 "btrfs-progs: qgroup assign: can't handle
options", the unknown options will not be reported for qgroup
assign/remove as this was mistakenly removed from the caller.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 50750ead22 btrfs-progs: find-root: use the common help infrastructure
Set up the structures so the usage helpers can be used instead of local
functions.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 32ec525fd2 btrfs-progs: find-root: don't dump usage on wrong argument count
The checker prints the error message, no need the full usage string to
be pritned.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 5ec301036e btrfs-progs: find-root: use common usage helper for uknown option
Disable getopt reporting and use the existing helper to report unknown
option.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 27097a2125 btrfs-progs: prop: return only common error values
The error values returned from the command are ad-hoc and don't have
much meaning, the error message tells the user what's wrong. Use only
the common values 0 for ok and 1 other error.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 5a803bfd27 btrfs-progs: prop: don't print full usage on invalid arguments
Let the specific error be the last message printed and don't dump the
whole usage that's not quite helpful in this context.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 2d4b083b7c btrfs-progs: prop: let parsing helper return error to the caller
TO avoid the exit call, return error to the callers and let them handle
the errors.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 4ac63ccbd8 btrfs-progs: help: don't print usage on wrong argument counts
The error message about the unsatisfied argument count is scrolled away
by the full usage string dump. This is not considered a good usability
practice.

This commit switches all direct usage -> return patterns, where the
argument check has no other constraint, eg. dependency on an option.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:56 +01:00
David Sterba 4ac44631a4 btrfs-progs: help: use unknown command option helper
Update handling of unknown option in all commands. This will not print
only the unknown option and short pointer to help. Dumping the whole
help was a bad idea that stuck for too long.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:55 +01:00
David Sterba c9b60c9087 btrfs-progs: help: update messages of argc constraint checkers
The messages should be more specific about how many arguments are
actuall expected.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:55 +01:00
David Sterba 309719fb97 btrfs-progs: help: add helper for unrecognized option error message
Currently any unrecognized option does not print very usable message and
only dumps the whole help. Other common utilities (eg. from the
util-linux suite) print a short message and point to help. And we're
going to do the same.

Example:

  $ btrfs device add --unknown device path
  btrfs device add: unrecognized option '--unknown'
  Try 'btrfs device add --help' for more information

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:55 +01:00
David Sterba bc78d1f217 btrfs-progs: device: update help texts
Wording and formatting changes.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:54 +01:00
Qu Wenruo e76fb663a7 btrfs-progs: check: Fix false alert about uninitialized variable
GCC 8.2.1 will report the following error:

  check/main.c: In function 'try_repair_inode':
  check/main.c:2606:5: warning: 'ret' may be used uninitialized in this function [-Wmaybe-uninitialized]
    if (!ret) {
       ^
  check/main.c:2584:6: note: 'ret' was declared here
    int ret;
        ^~~

The offending code is in repair_mismatch_dir_hash():

	int ret;

	printf(
	"Deleting bad dir items with invalid hash for root %llu ino %llu\n",
		root->root_key.objectid, rec->ino);
	while (!list_empty(&rec->mismatch_dir_hash)) {
		/* do some repair */
	}
	if (!ret) { <<< Here
		/* do some fix */
	}

The truth is, to enter try_repair_inode(), we must have
I_ERR_MISMATCH_DIR_HASH bit set for rec->errors.

And just after we set I_ERR_MISMATCH_DIR_HASH, we call
add_mismatch_dir_hash() and handled its error correctly.

So it's impossible to to skip the while loop.

Fix it by initializing @ret to -EUCLEAN, so even we hit some impossible
case, repair_mismatch_dir_hash() won't falsely consider the mismatch
hash fixed.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-05 12:57:41 +01:00
Anand Jain ae45af7a92 btrfs-progs: dev replace: gracefully handle the exclusive operation report
Replace start fails to report the appropriate error if balance is already
running, as below:

  $ btrfs rep start -B -f /dev/sdb /dev/sde /btrfs
  ERROR: ioctl(DEV_REPLACE_START) on '/btrfs' returns error: <illegal result value>

Translate the positive values, the exclusive operation is reported as
BTRFS_ERROR_DEV_EXCL_RUN_IN_PROGRESS when balance is running.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 17:39:34 +01:00
Anand Jain f79fb2cf3e btrfs-progs: dev replace: check for no result before using results
Userspace understands the ioctl BTRFS_IOC_DEV_REPLACE command status
using the struct btrfs_ioctl_dev_replace_args::result, and so userspace
initializes this to BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT, so exclude
this value in checking for the error.

Signed-off-by: Anand Jain <anand.jain@oracle.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 17:39:05 +01:00
Qu Wenruo 3ef4bd5cb8 btrfs-progs: Unify metadata chunk size with kernel
Mkfs tends to create pretty large metadata chunk compared to kernel:
  Node size:          16384
  Sector size:        4096
  Filesystem size:    10.00GiB
  Block group profiles:
    Data:             single            8.00MiB
    Metadata:         DUP               1.00GiB
    System:           DUP               8.00MiB

While kernel only tends to create 256MiB metadata chunk:
		/* for larger filesystems, use larger metadata chunks */
		if (fs_devices->total_rw_bytes > 50ULL * SZ_1G)
			max_stripe_size = SZ_1G;
		else
			max_stripe_size = SZ_256M;

This won't cause problems in real world, but it's still better to make
the behavior unified.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 17:26:02 +01:00
Qu Wenruo 0dd9031159 btrfs-progs: Port kernel fs_devices::total_rw_bytes
Unlike kernel, btrfs-progs doesn't (yet) support devices grow/shrink,
the port only needs to handle open_ctree() time initialization (at
read_one_dev()), and btrfs_add_device() used for mkfs.

This provide the basis for incoming unification of chunk allocator
behavior.

Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 17:26:02 +01:00
David Sterba aa4e8cbba2 btrfs-progs: device scan: update error messages
Use the errno an %m pattern, update wording.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 17:26:02 +01:00
David Sterba cec1472792 btrfs-progs: docs: add scan --forget
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 16:49:53 +01:00
David Sterba 16f0494b4b btrfs-progs: device scan: update help text
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 16:00:54 +01:00
David Sterba 02f096fb20 btrfs-progs: device scan: update help text
The two modes should be displayed separately for clarity.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 14:02:10 +01:00
David Sterba 6d3458dcfd btrfs-progs: device scan: constify path argument
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 14:01:25 +01:00
Anand Jain dff3fb19d7 btrfs-progs: device scan: add new option to forget one or all scanned devices
This patch adds option --forget to 'device scan'

  $ btrfs device scan --forget [dev...]

to unregister the given device from kernel module. The device cannot be
part of a mounted filesystem, this will be reported as an error.

If no argument is given it will unregister all stale (device which are
not mounted) from the kernel.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: Anand Jain <anand.jain@oracle.com>
[ update changelog ]
Signed-off-by: David Sterba <dsterba@suse.com>
2019-03-01 13:40:21 +01:00
David Sterba 5c748404b9
Btrfs progs v4.20.2
Signed-off-by: David Sterba <dsterba@suse.com>
2019-02-25 18:54:18 +01:00
David Sterba becd726a81 btrfs-progs: update CHANGES for v4.20.2
Signed-off-by: David Sterba <dsterba@suse.com>
2019-02-25 18:52:35 +01:00
David Sterba f9148e3841 Revert "Btrfs-progs: fix mount point detection due to partial prefix match"
This reverts commit cb8abddb20.

There are several reports in IRC that this patch breaks in some
send/receive environments. There are no exact steps to reproduce, only
approximate descroptions. Until a proper reproducer is known, the patch
is temporarily reverted due to the user-visible impact.

Issue: #162
Signed-off-by: David Sterba <dsterba@suse.com>
2019-02-25 18:43:19 +01:00
Nikolay Borisov 2e84a13a10 btrfs-progs: Use a single tab for 'leafsize (deprecated)' row
Since this row is longer than the rest it's enough to use a single tab
character to delimig the value from caption. Without this patch
output looked like:

nodesize		16384
leafsize (deprecated)		16384

With it:

nodesize		16384
leafsize (deprecated)	16384

No functional changes just making the output a bit neater.

Signed-off-by: Nikolay Borisov <nborisov@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2019-02-25 18:08:25 +01:00
David Sterba e10b8a839c btrfs-progs: ci: switch to newer build environment
Use the Xenial dist for CI so now we have only 2 years old base version,
instead of 4 years old.  Kernel is 4.15, gcc is 5.4, clang 7.0.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-02-25 18:08:21 +01:00
David Sterba cfbf54dea1 btrfs-progs: ci: explicitly request reiserfs support for btrfs-convert
The autodetection of conversion filesystems support will skip the tests
if the library is not available for some reason. This now happens for
reiserfs in the CI environment. We need to know about such case so
request the support.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-02-25 18:08:16 +01:00
David Sterba 6c33832b8c
Btrfs progs v4.20.1
Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-23 13:56:53 +01:00
David Sterba b0cabc78fd btrfs-progs: update CHANGES for v4.20.1
Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-23 13:55:09 +01:00
David Sterba 6315cf6d37 btrfs-progs: ci: enable library-test
For some reason the test was not enabled in the CI builds and would have
caught the build problem fixed by the previous patch.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-23 13:55:09 +01:00
David Sterba f6f518a081 btrfs-progs: build: fix libbtrfs build
Commit 75b5eabb61 ("btrfs-progs: uuid: Port
btrfs_uuid_tree_add() function") brings code from kernel and introduces
an unsatisfied build dependency for libbtrfs. This fails build for
external library users like snapper.

As a hotfix, shuffle the new UUID functions so the build works. Simply
adding uuid-tree.o to libbtrfs_objects does not work due to other
missing symbols.

    [CC]     uuid-tree.o
    [LD]     libbtrfs.so.0.1
    [LN]     libbtrfs.so
    [TEST PREP]  library-test
	ld: .../libbtrfs.so: undefined reference to `btrfs_alloc_path'
	ld: .../libbtrfs.so: undefined reference to `btrfs_extend_item'
	ld: .../libbtrfs.so: undefined reference to `btrfs_insert_empty_items'
	ld: .../libbtrfs.so: undefined reference to `btrfs_free_path'
	ld: .../libbtrfs.so: undefined reference to `read_extent_buffer'
	ld: .../libbtrfs.so: undefined reference to `btrfs_mark_buffer_dirty'
	ld: .../libbtrfs.so: undefined reference to `write_extent_buffer'
	ld: .../libbtrfs.so: undefined reference to `btrfs_search_slot'

LinK: https://bugs.gentoo.org/675974
Link: https://github.com/openSUSE/snapper/issues/473
Fixes: 75b5eabb61 ("btrfs-progs: uuid: Port btrfs_uuid_tree_add() function")
Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-23 13:53:55 +01:00
David Sterba d125381da3
Btrfs progs v4.20
Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-19 15:52:01 +01:00
David Sterba 0a529b8395 btrfs-progs: update CHANGES for v4.20
Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-19 15:40:54 +01:00
David Sterba 2b209f70d0 btrfs-progs: tests: add option coverage for btrfstune
Add tests that exercise all command line options of btrfstune, the valid
and some invalid combinations.

Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-17 01:42:33 +01:00
David Sterba 08f8176e7a btrfs-progs: btrfstune: update help string
Reformat and update the help string so it's more aligned with other
utilities (mkfs.btrfs was taken as a source):

- reduce indentation
- group related options
- add references to mkfs features
- wording adjustments

Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-17 01:06:34 +01:00
David Sterba 111f1473bd btrfs-progs: docs: document btrfstune -m/-M
Signed-off-by: David Sterba <dsterba@suse.com>
2019-01-17 00:52:09 +01:00