Fix for btrfs_find_free_objectid
authorYan <yanzheng@21cn.com>
Tue, 22 Jan 2008 17:46:56 +0000 (12:46 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:59 +0000 (11:03 -0400)
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>
fs/btrfs/inode-map.c

index ab74977..a0925ea 100644 (file)
@@ -62,7 +62,6 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
        struct btrfs_path *path;
        struct btrfs_key key;
        int ret;
-       u64 hole_size = 0;
        int slot = 0;
        u64 last_ino = 0;
        int start_found;
@@ -109,8 +108,7 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
                        if (start_found) {
                                if (last_ino < search_start)
                                        last_ino = search_start;
-                               hole_size = key.objectid - last_ino;
-                               if (hole_size > 0) {
+                               if (key.objectid > last_ino) {
                                        *objectid = last_ino;
                                        goto found;
                                }