There are some places that don''t check at all btrfs_alloc_path() failures, I added BUG_ON''s for all of them, as many other codepaths that don''t know how to handle the failures seem to do. In case of not applying this patch, I must notice that there''s one real bugfix that should be applied, it''s a null pointer dereference on inode.c: 2506: path = btrfs_alloc_path(); 2507: path->reada = -1; 2508: BUG_ON(!path); Index: btrfs-unstable-standalone/dir-item.c ==================================================================--- btrfs-unstable-standalone.orig/dir-item.c 2008-12-29 21:23:16.940588725 +0100 +++ btrfs-unstable-standalone/dir-item.c 2008-12-29 21:30:13.654588510 +0100 @@ -146,6 +146,7 @@ btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY); key.offset = btrfs_name_hash(name, name_len); path = btrfs_alloc_path(); + BUG_ON(!path); data_size = sizeof(*dir_item) + name_len; dir_item = insert_with_overflow(trans, root, path, &key, data_size, name, name_len); Index: btrfs-unstable-standalone/export.c ==================================================================--- btrfs-unstable-standalone.orig/export.c 2008-12-29 21:25:33.317589186 +0100 +++ btrfs-unstable-standalone/export.c 2008-12-29 21:26:46.658692859 +0100 @@ -146,6 +146,7 @@ int ret; path = btrfs_alloc_path(); + BUG_ON(!path); key.objectid = dir->i_ino; btrfs_set_key_type(&key, BTRFS_INODE_REF_KEY); Index: btrfs-unstable-standalone/extent-tree.c ==================================================================--- btrfs-unstable-standalone.orig/extent-tree.c 2008-12-29 21:26:52.133589589 +0100 +++ btrfs-unstable-standalone/extent-tree.c 2008-12-29 21:29:33.000589414 +0100 @@ -1337,6 +1337,7 @@ WARN_ON(num_bytes < root->sectorsize); path = btrfs_alloc_path(); + BUG_ON(!path); path->reada = 1; key.objectid = bytenr; key.offset = num_bytes; @@ -1377,6 +1378,7 @@ key.type = BTRFS_EXTENT_ITEM_KEY; path = btrfs_alloc_path(); + BUG_ON(!path); ret = btrfs_search_slot(NULL, extent_root, &key, path, 0, 0); if (ret < 0) goto out; @@ -2132,6 +2134,7 @@ int num_inserts = 0, max_inserts; path = btrfs_alloc_path(); + BUG_ON(!path); INIT_LIST_HEAD(&insert_list); INIT_LIST_HEAD(&update_list); Index: btrfs-unstable-standalone/file-item.c ==================================================================--- btrfs-unstable-standalone.orig/file-item.c 2008-12-29 21:30:59.441588913 +0100 +++ btrfs-unstable-standalone/file-item.c 2008-12-29 21:31:58.836588923 +0100 @@ -160,6 +160,7 @@ struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; path = btrfs_alloc_path(); + BUG_ON(!path); if (bio->bi_size > PAGE_CACHE_SIZE * 8) path->reada = 2; @@ -506,6 +507,7 @@ root = root->fs_info->csum_root; path = btrfs_alloc_path(); + BUG_ON(!path); while(1) { key.objectid = BTRFS_EXTENT_CSUM_OBJECTID; Index: btrfs-unstable-standalone/file.c ==================================================================--- btrfs-unstable-standalone.orig/file.c 2008-12-29 21:30:18.940839123 +0100 +++ btrfs-unstable-standalone/file.c 2008-12-29 21:30:38.941774195 +0100 @@ -293,6 +293,7 @@ u64 extent_end = 0; path = btrfs_alloc_path(); + BUG_ON(!path); ret = btrfs_lookup_file_extent(NULL, root, path, inode->i_ino, last_offset, 0); while(1) { Index: btrfs-unstable-standalone/inode.c ==================================================================--- btrfs-unstable-standalone.orig/inode.c 2008-12-29 21:32:03.109588918 +0100 +++ btrfs-unstable-standalone/inode.c 2008-12-29 21:35:12.321588484 +0100 @@ -2504,8 +2504,8 @@ if (root->ref_cows) btrfs_drop_extent_cache(inode, new_size & (~mask), (u64)-1, 0); path = btrfs_alloc_path(); - path->reada = -1; BUG_ON(!path); + path->reada = -1; /* FIXME, add redo link to tree so we don''t leak on crash */ key.objectid = inode->i_ino; @@ -3182,6 +3182,7 @@ filp->f_pos = 2; } path = btrfs_alloc_path(); + BUG_ON(!path); path->reada = 2; btrfs_set_key_type(&key, key_type); Index: btrfs-unstable-standalone/ioctl.c ==================================================================--- btrfs-unstable-standalone.orig/ioctl.c 2008-12-29 21:35:26.854838809 +0100 +++ btrfs-unstable-standalone/ioctl.c 2008-12-29 21:36:27.742591734 +0100 @@ -292,6 +292,7 @@ u64 test_oid; u64 parent_oid = BTRFS_I(dir->d_inode)->root->root_key.objectid; + BUG_ON(!path); test_oid = snap_src->root_key.objectid; ret = btrfs_find_root_ref(snap_src->fs_info->tree_root, Index: btrfs-unstable-standalone/root-tree.c ==================================================================--- btrfs-unstable-standalone.orig/root-tree.c 2008-12-29 21:36:49.242838916 +0100 +++ btrfs-unstable-standalone/root-tree.c 2008-12-29 21:37:53.940590092 +0100 @@ -286,6 +286,7 @@ struct btrfs_path *path; path = btrfs_alloc_path(); + BUG_ON(!path); key.objectid = root_id; key.type = type; @@ -346,6 +347,7 @@ path = btrfs_alloc_path(); + BUG_ON(!path); key.objectid = root_id; key.type = type; Index: btrfs-unstable-standalone/tree-log.c ==================================================================--- btrfs-unstable-standalone.orig/tree-log.c 2008-12-29 21:38:05.420838636 +0100 +++ btrfs-unstable-standalone/tree-log.c 2008-12-29 21:40:13.594588854 +0100 @@ -708,6 +708,7 @@ int match = 0; path = btrfs_alloc_path(); + BUG_ON(!path); ret = btrfs_search_slot(NULL, log, key, path, 0, 0); if (ret != 0) goto out; @@ -989,6 +990,7 @@ key.offset = (u64)-1; path = btrfs_alloc_path(); + BUG_ON(!path); while(1) { ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); @@ -2109,6 +2111,7 @@ log = root->log_root; path = btrfs_alloc_path(); + BUG_ON(!path); di = btrfs_lookup_dir_item(trans, log, path, dir->i_ino, name, name_len, -1); if (di && !IS_ERR(di)) { @@ -2476,6 +2479,7 @@ list_add_tail(&sums->list, list); path = btrfs_alloc_path(); + BUG_ON(!path); while(disk_bytenr < end) { if (!item || disk_bytenr < item_start_offset || disk_bytenr >= item_last_offset) { @@ -2683,7 +2687,9 @@ log = root->log_root; path = btrfs_alloc_path(); + BUG_ON(!path); dst_path = btrfs_alloc_path(); + BUG_ON(!dst_path); min_key.objectid = inode->i_ino; min_key.type = BTRFS_INODE_ITEM_KEY; -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html