diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 0a9b10c5b0a..d340f63d8f0 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -2509,6 +2509,11 @@ static void btrfs_read_locked_inode(struct inode *inode)  	int maybe_acls;  	u32 rdev;  	int ret; +	bool filled = false; + +	ret = btrfs_fill_inode(inode, &rdev); +	if (!ret) +		filled = true;  	path = btrfs_alloc_path();  	BUG_ON(!path); @@ -2520,6 +2525,10 @@ static void btrfs_read_locked_inode(struct inode *inode)  		goto make_bad;  	leaf = path->nodes[0]; + +	if (filled) +		goto cache_acl; +  	inode_item = btrfs_item_ptr(leaf, path->slots[0],  				    struct btrfs_inode_item);  	if (!leaf->map_token) @@ -2556,7 +2565,7 @@ static void btrfs_read_locked_inode(struct inode *inode)  	BTRFS_I(inode)->index_cnt = (u64)-1;  	BTRFS_I(inode)->flags = btrfs_inode_flags(leaf, inode_item); - +cache_acl:  	/*  	 * try to precache a NULL acl entry for files that don't have  	 * any xattrs or acls @@ -2572,7 +2581,6 @@ static void btrfs_read_locked_inode(struct inode *inode)  	}  	btrfs_free_path(path); -	inode_item = NULL;  	switch (inode->i_mode & S_IFMT) {  	case S_IFREG: @@ -4520,6 +4528,7 @@ static struct inode *btrfs_new_inode(struct btrfs_trans_handle *trans,  	inode_tree_add(inode);  	trace_btrfs_inode_new(inode); +	btrfs_set_inode_last_trans(trans, inode);  	return inode;  fail:  |