Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
1b05da2e
Commit
1b05da2e
authored
Apr 10, 2007
by
Chris Mason
Committed by
David Woodhouse
Apr 10, 2007
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Btrfs: drop the inode map tree
Signed-off-by:
Chris Mason
<
chris.mason@oracle.com
>
parent
c5739bba
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
33 additions
and
204 deletions
+33
-204
fs/btrfs/btrfs_inode.h
fs/btrfs/btrfs_inode.h
+0
-2
fs/btrfs/ctree.h
fs/btrfs/ctree.h
+5
-34
fs/btrfs/disk-io.c
fs/btrfs/disk-io.c
+9
-16
fs/btrfs/inode-item.c
fs/btrfs/inode-item.c
+2
-0
fs/btrfs/inode-map.c
fs/btrfs/inode-map.c
+4
-61
fs/btrfs/print-tree.c
fs/btrfs/print-tree.c
+0
-8
fs/btrfs/super.c
fs/btrfs/super.c
+13
-76
fs/btrfs/transaction.c
fs/btrfs/transaction.c
+0
-7
No files found.
fs/btrfs/btrfs_inode.h
View file @
1b05da2e
...
...
@@ -2,11 +2,9 @@
#define __BTRFS_I__
struct
btrfs_inode
{
u32
magic
;
struct
btrfs_root
*
root
;
struct
btrfs_key
location
;
struct
inode
vfs_inode
;
u32
magic2
;
};
static
inline
struct
btrfs_inode
*
BTRFS_I
(
struct
inode
*
inode
)
{
...
...
fs/btrfs/ctree.h
View file @
1b05da2e
...
...
@@ -14,9 +14,8 @@ extern struct kmem_cache *btrfs_path_cachep;
#define BTRFS_ROOT_TREE_OBJECTID 1ULL
#define BTRFS_EXTENT_TREE_OBJECTID 2ULL
#define BTRFS_INODE_MAP_OBJECTID 3ULL
#define BTRFS_FS_TREE_OBJECTID 4ULL
#define BTRFS_FIRST_FREE_OBJECTID 5ULL
#define BTRFS_FS_TREE_OBJECTID 3ULL
#define BTRFS_FIRST_FREE_OBJECTID 4ULL
/*
* we can actually store much bigger names, but lets not confuse the rest
...
...
@@ -62,7 +61,6 @@ struct btrfs_header {
__le64
blocknr
;
/* which block this node is supposed to live in */
__le64
generation
;
__le64
parentid
;
/* objectid of the tree root */
__le32
ham
;
__le16
nritems
;
__le16
flags
;
u8
level
;
...
...
@@ -226,23 +224,16 @@ struct btrfs_csum_item {
u8
csum
[
BTRFS_CSUM_SIZE
];
}
__attribute__
((
__packed__
));
struct
btrfs_inode_map_item
{
u32
refs
;
}
__attribute__
((
__packed__
));
struct
crypto_hash
;
struct
btrfs_fs_info
{
struct
btrfs_root
*
extent_root
;
struct
btrfs_root
*
tree_root
;
struct
btrfs_root
*
inode_root
;
struct
btrfs_key
current_insert
;
struct
btrfs_key
last_insert
;
struct
radix_tree_root
fs_roots_radix
;
struct
radix_tree_root
pending_del_radix
;
struct
radix_tree_root
pinned_radix
;
u64
last_inode_alloc
;
u64
generation
;
u64
highest_inode
;
struct
btrfs_transaction
*
running_transaction
;
struct
btrfs_super_block
*
disk_super
;
struct
buffer_head
*
sb_buffer
;
...
...
@@ -272,6 +263,8 @@ struct btrfs_root {
u32
blocksize
;
int
ref_cows
;
u32
type
;
u64
highest_inode
;
u64
last_inode_alloc
;
};
/* the lower bits in the key flags defines the item type */
...
...
@@ -320,16 +313,11 @@ struct btrfs_root {
*/
#define BTRFS_EXTENT_ITEM_KEY 8
/*
* the inode map records which inode numbers are in use and where
* they actually live on disk
*/
#define BTRFS_INODE_MAP_ITEM_KEY 9
/*
* string items are for debugging. They just store a short string of
* data in the FS
*/
#define BTRFS_STRING_ITEM_KEY
10
#define BTRFS_STRING_ITEM_KEY
9
static
inline
u64
btrfs_inode_generation
(
struct
btrfs_inode_item
*
i
)
{
...
...
@@ -883,17 +871,6 @@ static inline void btrfs_set_file_extent_num_blocks(struct
e
->
num_blocks
=
cpu_to_le64
(
val
);
}
static
inline
u32
btrfs_inode_map_refs
(
struct
btrfs_inode_map_item
*
m
)
{
return
le32_to_cpu
(
m
->
refs
);
}
static
inline
void
btrfs_set_inode_map_refs
(
struct
btrfs_inode_map_item
*
m
,
u32
val
)
{
m
->
refs
=
cpu_to_le32
(
val
);
}
static
inline
struct
btrfs_root
*
btrfs_sb
(
struct
super_block
*
sb
)
{
return
sb
->
s_fs_info
;
...
...
@@ -996,12 +973,6 @@ int btrfs_match_dir_item_name(struct btrfs_root *root, struct btrfs_path *path,
int
btrfs_find_free_objectid
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
fs_root
,
u64
dirid
,
u64
*
objectid
);
int
btrfs_insert_inode_map
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
root
,
u64
objectid
,
struct
btrfs_key
*
location
);
int
btrfs_lookup_inode_map
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
root
,
struct
btrfs_path
*
path
,
u64
objectid
,
int
mod
);
int
btrfs_find_highest_inode
(
struct
btrfs_root
*
fs_root
,
u64
*
objectid
);
/* inode-item.c */
...
...
fs/btrfs/disk-io.c
View file @
1b05da2e
...
...
@@ -264,6 +264,8 @@ static int __setup_root(int blocksize,
root
->
fs_info
=
fs_info
;
root
->
objectid
=
objectid
;
root
->
last_trans
=
0
;
root
->
highest_inode
=
0
;
root
->
last_inode_alloc
=
0
;
memset
(
&
root
->
root_key
,
0
,
sizeof
(
root
->
root_key
));
memset
(
&
root
->
root_item
,
0
,
sizeof
(
root
->
root_item
));
return
0
;
...
...
@@ -295,6 +297,7 @@ struct btrfs_root *btrfs_read_fs_root(struct btrfs_fs_info *fs_info,
struct
btrfs_root
*
tree_root
=
fs_info
->
tree_root
;
struct
btrfs_path
*
path
;
struct
btrfs_leaf
*
l
;
u64
highest_inode
;
int
ret
=
0
;
printk
(
"read_fs_root looking for %Lu %Lu %u
\n
"
,
location
->
objectid
,
location
->
offset
,
location
->
flags
);
...
...
@@ -354,6 +357,12 @@ printk("radix_tree_insert gives us %d\n", ret);
kfree
(
root
);
return
ERR_PTR
(
ret
);
}
ret
=
btrfs_find_highest_inode
(
root
,
&
highest_inode
);
if
(
ret
==
0
)
{
root
->
highest_inode
=
highest_inode
;
root
->
last_inode_alloc
=
highest_inode
;
printk
(
"highest inode is %Lu
\n
"
,
highest_inode
);
}
printk
(
"all worked
\n
"
);
return
root
;
}
...
...
@@ -364,8 +373,6 @@ struct btrfs_root *open_ctree(struct super_block *sb)
GFP_NOFS
);
struct
btrfs_root
*
tree_root
=
kmalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
struct
btrfs_root
*
inode_root
=
kmalloc
(
sizeof
(
struct
btrfs_root
),
GFP_NOFS
);
struct
btrfs_fs_info
*
fs_info
=
kmalloc
(
sizeof
(
*
fs_info
),
GFP_NOFS
);
int
ret
;
...
...
@@ -378,9 +385,6 @@ struct btrfs_root *open_ctree(struct super_block *sb)
fs_info
->
running_transaction
=
NULL
;
fs_info
->
tree_root
=
tree_root
;
fs_info
->
extent_root
=
extent_root
;
fs_info
->
inode_root
=
inode_root
;
fs_info
->
last_inode_alloc
=
0
;
fs_info
->
highest_inode
=
0
;
fs_info
->
sb
=
sb
;
fs_info
->
btree_inode
=
new_inode
(
sb
);
fs_info
->
btree_inode
->
i_ino
=
1
;
...
...
@@ -425,14 +429,7 @@ struct btrfs_root *open_ctree(struct super_block *sb)
BTRFS_EXTENT_TREE_OBJECTID
,
extent_root
);
BUG_ON
(
ret
);
ret
=
find_and_setup_root
(
sb
->
s_blocksize
,
tree_root
,
fs_info
,
BTRFS_INODE_MAP_OBJECTID
,
inode_root
);
BUG_ON
(
ret
);
fs_info
->
generation
=
btrfs_super_generation
(
disk_super
)
+
1
;
ret
=
btrfs_find_highest_inode
(
tree_root
,
&
fs_info
->
last_inode_alloc
);
if
(
ret
==
0
)
fs_info
->
highest_inode
=
fs_info
->
last_inode_alloc
;
memset
(
&
fs_info
->
kobj
,
0
,
sizeof
(
fs_info
->
kobj
));
kobj_set_kset_s
(
fs_info
,
btrfs_subsys
);
kobject_set_name
(
&
fs_info
->
kobj
,
"%s"
,
sb
->
s_id
);
...
...
@@ -512,9 +509,6 @@ int close_ctree(struct btrfs_root *root)
if
(
fs_info
->
extent_root
->
node
)
btrfs_block_release
(
fs_info
->
extent_root
,
fs_info
->
extent_root
->
node
);
if
(
fs_info
->
inode_root
->
node
)
btrfs_block_release
(
fs_info
->
inode_root
,
fs_info
->
inode_root
->
node
);
if
(
fs_info
->
tree_root
->
node
)
btrfs_block_release
(
fs_info
->
tree_root
,
fs_info
->
tree_root
->
node
);
...
...
@@ -524,7 +518,6 @@ int close_ctree(struct btrfs_root *root)
iput
(
fs_info
->
btree_inode
);
del_fs_roots
(
fs_info
);
kfree
(
fs_info
->
extent_root
);
kfree
(
fs_info
->
inode_root
);
kfree
(
fs_info
->
tree_root
);
kobject_unregister
(
&
fs_info
->
kobj
);
return
0
;
...
...
fs/btrfs/inode-item.c
View file @
1b05da2e
...
...
@@ -22,6 +22,8 @@ int btrfs_insert_inode(struct btrfs_trans_handle *trans, struct btrfs_root
sizeof
(
*
inode_item
));
btrfs_release_path
(
root
,
path
);
btrfs_free_path
(
path
);
if
(
ret
==
0
&&
objectid
>
root
->
highest_inode
)
root
->
highest_inode
=
objectid
;
return
ret
;
}
...
...
fs/btrfs/inode-map.c
View file @
1b05da2e
...
...
@@ -3,12 +3,11 @@
#include "disk-io.h"
#include "transaction.h"
int
btrfs_find_highest_inode
(
struct
btrfs_root
*
fs_
root
,
u64
*
objectid
)
int
btrfs_find_highest_inode
(
struct
btrfs_root
*
root
,
u64
*
objectid
)
{
struct
btrfs_path
*
path
;
int
ret
;
struct
btrfs_leaf
*
l
;
struct
btrfs_root
*
root
=
fs_root
->
fs_info
->
inode_root
;
struct
btrfs_key
search_key
;
int
slot
;
...
...
@@ -38,7 +37,7 @@ int btrfs_find_highest_inode(struct btrfs_root *fs_root, u64 *objectid)
* walks the btree of allocated inodes and find a hole.
*/
int
btrfs_find_free_objectid
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
fs_
root
,
struct
btrfs_root
*
root
,
u64
dirid
,
u64
*
objectid
)
{
struct
btrfs_path
*
path
;
...
...
@@ -49,16 +48,13 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
u64
last_ino
=
0
;
int
start_found
;
struct
btrfs_leaf
*
l
;
struct
btrfs_root
*
root
=
fs_root
->
fs_info
->
inode_root
;
struct
btrfs_key
search_key
;
u64
search_start
=
dirid
;
path
=
btrfs_alloc_path
();
BUG_ON
(
!
path
);
search_key
.
flags
=
0
;
btrfs_set_key_type
(
&
search_key
,
BTRFS_INODE_MAP_ITEM_KEY
);
search_start
=
fs_root
->
fs_info
->
last_inode_alloc
;
search_start
=
root
->
last_inode_alloc
;
search_start
=
max
(
search_start
,
BTRFS_FIRST_FREE_OBJECTID
);
search_key
.
objectid
=
search_start
;
search_key
.
offset
=
0
;
...
...
@@ -108,7 +104,7 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
}
// FIXME -ENOSPC
found:
root
->
fs_info
->
last_inode_alloc
=
*
objectid
;
root
->
last_inode_alloc
=
*
objectid
;
btrfs_release_path
(
root
,
path
);
btrfs_free_path
(
path
);
BUG_ON
(
*
objectid
<
search_start
);
...
...
@@ -118,56 +114,3 @@ int btrfs_find_free_objectid(struct btrfs_trans_handle *trans,
btrfs_free_path
(
path
);
return
ret
;
}
int
btrfs_insert_inode_map
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
fs_root
,
u64
objectid
,
struct
btrfs_key
*
location
)
{
int
ret
=
0
;
struct
btrfs_path
*
path
;
struct
btrfs_inode_map_item
*
inode_item
;
struct
btrfs_key
key
;
struct
btrfs_root
*
inode_root
=
fs_root
->
fs_info
->
inode_root
;
key
.
objectid
=
objectid
;
key
.
flags
=
0
;
btrfs_set_key_type
(
&
key
,
BTRFS_INODE_MAP_ITEM_KEY
);
key
.
offset
=
0
;
path
=
btrfs_alloc_path
();
BUG_ON
(
!
path
);
btrfs_init_path
(
path
);
ret
=
btrfs_insert_empty_item
(
trans
,
inode_root
,
path
,
&
key
,
sizeof
(
struct
btrfs_inode_map_item
));
if
(
ret
)
goto
out
;
inode_item
=
btrfs_item_ptr
(
btrfs_buffer_leaf
(
path
->
nodes
[
0
]),
path
->
slots
[
0
],
struct
btrfs_inode_map_item
);
btrfs_cpu_key_to_disk
(
&
inode_item
->
key
,
location
);
btrfs_mark_buffer_dirty
(
path
->
nodes
[
0
]);
if
(
objectid
>
fs_root
->
fs_info
->
highest_inode
)
fs_root
->
fs_info
->
highest_inode
=
objectid
;
out:
btrfs_release_path
(
inode_root
,
path
);
btrfs_free_path
(
path
);
return
ret
;
}
int
btrfs_lookup_inode_map
(
struct
btrfs_trans_handle
*
trans
,
struct
btrfs_root
*
fs_root
,
struct
btrfs_path
*
path
,
u64
objectid
,
int
mod
)
{
int
ret
;
struct
btrfs_key
key
;
int
ins_len
=
mod
<
0
?
-
1
:
0
;
int
cow
=
mod
!=
0
;
struct
btrfs_root
*
inode_root
=
fs_root
->
fs_info
->
inode_root
;
key
.
objectid
=
objectid
;
key
.
flags
=
0
;
key
.
offset
=
0
;
btrfs_set_key_type
(
&
key
,
BTRFS_INODE_MAP_ITEM_KEY
);
ret
=
btrfs_search_slot
(
trans
,
inode_root
,
&
key
,
path
,
ins_len
,
cow
);
return
ret
;
}
fs/btrfs/print-tree.c
View file @
1b05da2e
...
...
@@ -10,7 +10,6 @@ void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l)
struct
btrfs_extent_item
*
ei
;
struct
btrfs_root_item
*
ri
;
struct
btrfs_dir_item
*
di
;
struct
btrfs_inode_map_item
*
mi
;
struct
btrfs_inode_item
*
ii
;
u32
type
;
...
...
@@ -54,13 +53,6 @@ void btrfs_print_leaf(struct btrfs_root *root, struct btrfs_leaf *l)
printk
(
"
\t\t
extent data refs %u owner %Lu
\n
"
,
btrfs_extent_refs
(
ei
),
btrfs_extent_owner
(
ei
));
break
;
case
BTRFS_INODE_MAP_ITEM_KEY
:
mi
=
btrfs_item_ptr
(
l
,
i
,
struct
btrfs_inode_map_item
);
printk
(
"
\t\t
inode map key %Lu %u %Lu
\n
"
,
btrfs_disk_key_objectid
(
&
mi
->
key
),
btrfs_disk_key_flags
(
&
mi
->
key
),
btrfs_disk_key_offset
(
&
mi
->
key
));
break
;
case
BTRFS_STRING_ITEM_KEY
:
printk
(
"
\t\t
item data %.*s
\n
"
,
btrfs_item_size
(
item
),
btrfs_leaf_data
(
l
)
+
btrfs_item_offset
(
item
));
...
...
fs/btrfs/super.c
View file @
1b05da2e
...
...
@@ -45,14 +45,6 @@ static struct inode_operations btrfs_file_inode_operations;
static
struct
address_space_operations
btrfs_aops
;
static
struct
file_operations
btrfs_file_operations
;
static
int
check_inode
(
struct
inode
*
inode
)
{
struct
btrfs_inode
*
ei
=
BTRFS_I
(
inode
);
WARN_ON
(
ei
->
magic
!=
0xDEADBEEF
);
WARN_ON
(
ei
->
magic2
!=
0xDEADBEAF
);
return
0
;
}
static
void
btrfs_read_locked_inode
(
struct
inode
*
inode
)
{
struct
btrfs_path
*
path
;
...
...
@@ -66,15 +58,12 @@ static void btrfs_read_locked_inode(struct inode *inode)
btrfs_init_path
(
path
);
mutex_lock
(
&
root
->
fs_info
->
fs_mutex
);
check_inode
(
inode
);
memcpy
(
&
location
,
&
BTRFS_I
(
inode
)
->
location
,
sizeof
(
location
));
ret
=
btrfs_lookup_inode
(
NULL
,
root
,
path
,
&
location
,
0
);
if
(
ret
)
{
btrfs_free_path
(
path
);
goto
make_bad
;
}
check_inode
(
inode
);
inode_item
=
btrfs_item_ptr
(
btrfs_buffer_leaf
(
path
->
nodes
[
0
]),
path
->
slots
[
0
],
struct
btrfs_inode_item
);
...
...
@@ -97,7 +86,7 @@ static void btrfs_read_locked_inode(struct inode *inode)
inode_item
=
NULL
;
mutex_unlock
(
&
root
->
fs_info
->
fs_mutex
);
check_inode
(
inode
);
switch
(
inode
->
i_mode
&
S_IFMT
)
{
#if 0
default:
...
...
@@ -121,7 +110,6 @@ static void btrfs_read_locked_inode(struct inode *inode)
// inode->i_op = &page_symlink_inode_operations;
break
;
}
check_inode
(
inode
);
return
;
make_bad:
...
...
@@ -272,10 +260,7 @@ static int btrfs_free_inode(struct btrfs_trans_handle *trans,
struct
btrfs_root
*
root
,
struct
inode
*
inode
)
{
u64
objectid
=
inode
->
i_ino
;
struct
btrfs_path
*
path
;
struct
btrfs_inode_map_item
*
map
;
struct
btrfs_key
stat_data_key
;
int
ret
;
clear_inode
(
inode
);
...
...
@@ -283,26 +268,11 @@ static int btrfs_free_inode(struct btrfs_trans_handle *trans,
path
=
btrfs_alloc_path
();
BUG_ON
(
!
path
);
btrfs_init_path
(
path
);
ret
=
btrfs_lookup_inode_map
(
trans
,
root
,
path
,
objectid
,
-
1
);
if
(
ret
)
{
if
(
ret
>
0
)
ret
=
-
ENOENT
;
goto
error
;
}
map
=
btrfs_item_ptr
(
btrfs_buffer_leaf
(
path
->
nodes
[
0
]),
path
->
slots
[
0
],
struct
btrfs_inode_map_item
);
btrfs_disk_key_to_cpu
(
&
stat_data_key
,
&
map
->
key
);
ret
=
btrfs_del_item
(
trans
,
root
->
fs_info
->
inode_root
,
path
);
BUG_ON
(
ret
);
btrfs_release_path
(
root
,
path
);
ret
=
btrfs_lookup_inode
(
trans
,
root
,
path
,
&
BTRFS_I
(
inode
)
->
location
,
-
1
);
BUG_ON
(
ret
);
ret
=
btrfs_del_item
(
trans
,
root
,
path
);
BUG_ON
(
ret
);
error:
btrfs_release_path
(
root
,
path
);
btrfs_free_path
(
path
);
return
ret
;
}
...
...
@@ -432,7 +402,6 @@ static int btrfs_inode_by_name(struct inode *dir, struct dentry *dentry,
out:
btrfs_release_path
(
root
,
path
);
btrfs_free_path
(
path
);
check_inode
(
dir
);
return
ret
;
}
...
...
@@ -540,9 +509,7 @@ printk("adding new root for inode %lu root %p (found %p)\n", inode->i_ino, sub_r
btrfs_read_locked_inode
(
inode
);
unlock_new_inode
(
inode
);
}
check_inode
(
inode
);
}
check_inode
(
dir
);
return
d_splice_alias
(
inode
,
dentry
);
}
...
...
@@ -566,7 +533,6 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
/* FIXME, use a real flag for deciding about the key type */
if
(
root
->
fs_info
->
tree_root
==
root
)
key_type
=
BTRFS_DIR_ITEM_KEY
;
mutex_lock
(
&
root
->
fs_info
->
fs_mutex
);
key
.
objectid
=
inode
->
i_ino
;
key
.
flags
=
0
;
...
...
@@ -575,9 +541,8 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
path
=
btrfs_alloc_path
();
btrfs_init_path
(
path
);
ret
=
btrfs_search_slot
(
NULL
,
root
,
&
key
,
path
,
0
,
0
);
if
(
ret
<
0
)
{
if
(
ret
<
0
)
goto
err
;
}
advance
=
0
;
while
(
1
)
{
leaf
=
btrfs_buffer_leaf
(
path
->
nodes
[
0
]);
...
...
@@ -601,8 +566,7 @@ static int btrfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
if
(
btrfs_disk_key_objectid
(
&
item
->
key
)
!=
key
.
objectid
)
break
;
if
(
key_type
==
BTRFS_DIR_INDEX_KEY
&&
btrfs_disk_key_offset
(
&
item
->
key
)
>
root
->
fs_info
->
highest_inode
)
btrfs_disk_key_offset
(
&
item
->
key
)
>
root
->
highest_inode
)
break
;
if
(
btrfs_disk_key_type
(
&
item
->
key
)
!=
key_type
)
continue
;
...
...
@@ -707,7 +671,6 @@ static void fill_inode_item(struct btrfs_inode_item *item,
btrfs_set_timespec_nsec
(
&
item
->
ctime
,
inode
->
i_ctime
.
tv_nsec
);
btrfs_set_inode_nblocks
(
item
,
inode
->
i_blocks
);
btrfs_set_inode_generation
(
item
,
inode
->
i_generation
);
check_inode
(
inode
);
}
static
int
btrfs_update_inode
(
struct
btrfs_trans_handle
*
trans
,
...
...
@@ -721,7 +684,6 @@ static int btrfs_update_inode(struct btrfs_trans_handle *trans,
path
=
btrfs_alloc_path
();
BUG_ON
(
!
path
);
btrfs_init_path
(
path
);
ret
=
btrfs_lookup_inode
(
trans
,
root
,
path
,
&
BTRFS_I
(
inode
)
->
location
,
1
);
if
(
ret
)
{
...
...
@@ -736,11 +698,11 @@ static int btrfs_update_inode(struct btrfs_trans_handle *trans,
fill_inode_item
(
inode_item
,
inode
);
btrfs_mark_buffer_dirty
(
path
->
nodes
[
0
]);
ret
=
0
;
failed:
btrfs_release_path
(
root
,
path
);
btrfs_free_path
(
path
);
check_inode
(
inode
);
return
0
;
return
ret
;
}
static
int
btrfs_write_inode
(
struct
inode
*
inode
,
int
wait
)
...
...
@@ -757,7 +719,6 @@ static int btrfs_write_inode(struct inode *inode, int wait)
else
btrfs_end_transaction
(
trans
,
root
);
mutex_unlock
(
&
root
->
fs_info
->
fs_mutex
);
check_inode
(
inode
);
return
ret
;
}
...
...
@@ -767,7 +728,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
struct
inode
*
inode
;
struct
btrfs_inode_item
inode_item
;
struct
btrfs_root
*
root
=
BTRFS_I
(
dir
)
->
root
;
struct
btrfs_key
*
key
;
struct
btrfs_key
*
location
;
int
ret
;
u64
objectid
;
...
...
@@ -776,8 +737,6 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
return
ERR_PTR
(
-
ENOMEM
);
BTRFS_I
(
inode
)
->
root
=
BTRFS_I
(
dir
)
->
root
;
key
=
&
BTRFS_I
(
inode
)
->
location
;
check_inode
(
inode
);
ret
=
btrfs_find_free_objectid
(
trans
,
root
,
dir
->
i_ino
,
&
objectid
);
BUG_ON
(
ret
);
...
...
@@ -788,20 +747,16 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,
inode
->
i_blocks
=
0
;
inode
->
i_mtime
=
inode
->
i_atime
=
inode
->
i_ctime
=
CURRENT_TIME
;
fill_inode_item
(
&
inode_item
,
inode
);
key
->
objectid
=
objectid
;
key
->
flags
=
0
;
key
->
offset
=
0
;
btrfs_set_key_type
(
key
,
BTRFS_INODE_ITEM_KEY
);
ret
=
btrfs_insert_inode_map
(
trans
,
root
,
objectid
,
key
);
BUG_ON
(
ret
);
location
=
&
BTRFS_I
(
inode
)
->
location
;
location
->
objectid
=
objectid
;
location
->
flags
=
0
;
location
->
offset
=
0
;
btrfs_set_key_type
(
location
,
BTRFS_INODE_ITEM_KEY
);
ret
=
btrfs_insert_inode
(
trans
,
root
,
objectid
,
&
inode_item
);
BUG_ON
(
ret
);
insert_inode_hash
(
inode
);
check_inode
(
inode
);
check_inode
(
dir
);
return
inode
;
}
...
...
@@ -825,8 +780,6 @@ static int btrfs_add_link(struct btrfs_trans_handle *trans,
ret
=
btrfs_update_inode
(
trans
,
root
,
dentry
->
d_parent
->
d_inode
);
}
check_inode
(
inode
);
check_inode
(
dentry
->
d_parent
->
d_inode
);
return
ret
;
}
...
...
@@ -840,7 +793,6 @@ static int btrfs_add_nondir(struct btrfs_trans_handle *trans,
}
if
(
err
>
0
)
err
=
-
EEXIST
;
check_inode
(
inode
);
return
err
;
}
...
...
@@ -872,8 +824,6 @@ static int btrfs_create(struct inode *dir, struct dentry *dentry,
out_unlock:
btrfs_end_transaction
(
trans
,
root
);
mutex_unlock
(
&
root
->
fs_info
->
fs_mutex
);
check_inode
(
inode
);
check_inode
(
dir
);
if
(
drop_inode
)
{
inode_dec_link_count
(
inode
);
...
...
@@ -1701,20 +1651,14 @@ static int create_snapshot(struct btrfs_root *root, char *name, int namelen)
ret
=
btrfs_update_inode
(
trans
,
root
,
root
->
inode
);
BUG_ON
(
ret
);
ret
=
btrfs_find_free_objectid
(
trans
,
root
,
0
,
&
objectid
);
ret
=
btrfs_find_free_objectid
(
trans
,
root
->
fs_info
->
tree_root
,
0
,
&
objectid
);
BUG_ON
(
ret
);
memset
(
&
new_root_item
,
0
,
sizeof
(
new_root_item
));
memcpy
(
&
new_root_item
,
&
root
->
root_item
,
sizeof
(
new_root_item
));
key
.
objectid
=
objectid
;
key
.
flags
=
0
;
key
.
offset
=
0
;
btrfs_set_key_type
(
&
key
,
BTRFS_INODE_ITEM_KEY
);
ret
=
btrfs_insert_inode_map
(
trans
,
root
,
objectid
,
&
key
);
BUG_ON
(
ret
);
key
.
objectid
=
objectid
;
key
.
offset
=
1
;
key
.
flags
=
0
;
...
...
@@ -1791,21 +1735,14 @@ static struct inode *btrfs_alloc_inode(struct super_block *sb)
ei
=
kmem_cache_alloc
(
btrfs_inode_cachep
,
GFP_NOFS
);
if
(
!
ei
)
return
NULL
;
ei
->
magic
=
0xDEADBEEF
;
ei
->
magic2
=
0xDEADBEAF
;
return
&
ei
->
vfs_inode
;
}
static
void
btrfs_destroy_inode
(
struct
inode
*
inode
)
{
struct
btrfs_inode
*
ei
=
BTRFS_I
(
inode
);
WARN_ON
(
ei
->
magic
!=
0xDEADBEEF
);
WARN_ON
(
ei
->
magic2
!=
0xDEADBEAF
);
WARN_ON
(
!
list_empty
(
&
inode
->
i_dentry
));
WARN_ON
(
inode
->
i_data
.
nrpages
);
ei
->
magic
=
0
;
ei
->
magic2
=
0
;
kmem_cache_free
(
btrfs_inode_cachep
,
BTRFS_I
(
inode
));
}
...
...
fs/btrfs/transaction.c
View file @
1b05da2e
...
...
@@ -115,14 +115,7 @@ int btrfs_commit_tree_roots(struct btrfs_trans_handle *trans,
struct
btrfs_fs_info
*
fs_info
=
root
->
fs_info
;
struct
btrfs_root
*
tree_root
=
fs_info
->
tree_root
;
struct
btrfs_root
*
extent_root
=
fs_info
->
extent_root
;
struct
btrfs_root
*
inode_root
=
fs_info
->
inode_root
;
btrfs_set_root_blocknr
(
&
inode_root
->
root_item
,
inode_root
->
node
->
b_blocknr
);
ret
=
btrfs_update_root
(
trans
,
tree_root
,
&
inode_root
->
root_key
,
&
inode_root
->
root_item
);
BUG_ON
(
ret
);
while
(
1
)
{
old_extent_block
=
btrfs_root_blocknr
(
&
extent_root
->
root_item
);
if
(
old_extent_block
==
extent_root
->
node
->
b_blocknr
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment