Fix for btrfs_find_free_objectid
btrfs_find_free_objectid may return a used objectid due to arithmetic underflow. This bug may happen when parameter 'root' is tree root, so it may cause serious problems when creating snapshot or sub-volume. Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
e18e4809b1
commit
b17854275c
@ -62,7 +62,6 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
|
|||||||
struct btrfs_path *path;
|
struct btrfs_path *path;
|
||||||
struct btrfs_key key;
|
struct btrfs_key key;
|
||||||
int ret;
|
int ret;
|
||||||
u64 hole_size = 0;
|
|
||||||
int slot = 0;
|
int slot = 0;
|
||||||
u64 last_ino = 0;
|
u64 last_ino = 0;
|
||||||
int start_found;
|
int start_found;
|
||||||
@ -109,8 +108,7 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
|
|||||||
if (start_found) {
|
if (start_found) {
|
||||||
if (last_ino < search_start)
|
if (last_ino < search_start)
|
||||||
last_ino = search_start;
|
last_ino = search_start;
|
||||||
hole_size = key.objectid - last_ino;
|
if (key.objectid > last_ino) {
|
||||||
if (hole_size > 0) {
|
|
||||||
*objectid = last_ino;
|
*objectid = last_ino;
|
||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user