|
@@ -61,7 +61,7 @@
|
|
#include "props.h"
|
|
#include "props.h"
|
|
|
|
|
|
struct btrfs_iget_args {
|
|
struct btrfs_iget_args {
|
|
- u64 ino;
|
|
|
|
|
|
+ struct btrfs_key *location;
|
|
struct btrfs_root *root;
|
|
struct btrfs_root *root;
|
|
};
|
|
};
|
|
|
|
|
|
@@ -4977,7 +4977,9 @@ again:
|
|
static int btrfs_init_locked_inode(struct inode *inode, void *p)
|
|
static int btrfs_init_locked_inode(struct inode *inode, void *p)
|
|
{
|
|
{
|
|
struct btrfs_iget_args *args = p;
|
|
struct btrfs_iget_args *args = p;
|
|
- inode->i_ino = args->ino;
|
|
|
|
|
|
+ inode->i_ino = args->location->objectid;
|
|
|
|
+ memcpy(&BTRFS_I(inode)->location, args->location,
|
|
|
|
+ sizeof(*args->location));
|
|
BTRFS_I(inode)->root = args->root;
|
|
BTRFS_I(inode)->root = args->root;
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
@@ -4985,19 +4987,19 @@ static int btrfs_init_locked_inode(struct inode *inode, void *p)
|
|
static int btrfs_find_actor(struct inode *inode, void *opaque)
|
|
static int btrfs_find_actor(struct inode *inode, void *opaque)
|
|
{
|
|
{
|
|
struct btrfs_iget_args *args = opaque;
|
|
struct btrfs_iget_args *args = opaque;
|
|
- return args->ino == btrfs_ino(inode) &&
|
|
|
|
|
|
+ return args->location->objectid == BTRFS_I(inode)->location.objectid &&
|
|
args->root == BTRFS_I(inode)->root;
|
|
args->root == BTRFS_I(inode)->root;
|
|
}
|
|
}
|
|
|
|
|
|
static struct inode *btrfs_iget_locked(struct super_block *s,
|
|
static struct inode *btrfs_iget_locked(struct super_block *s,
|
|
- u64 objectid,
|
|
|
|
|
|
+ struct btrfs_key *location,
|
|
struct btrfs_root *root)
|
|
struct btrfs_root *root)
|
|
{
|
|
{
|
|
struct inode *inode;
|
|
struct inode *inode;
|
|
struct btrfs_iget_args args;
|
|
struct btrfs_iget_args args;
|
|
- unsigned long hashval = btrfs_inode_hash(objectid, root);
|
|
|
|
|
|
+ unsigned long hashval = btrfs_inode_hash(location->objectid, root);
|
|
|
|
|
|
- args.ino = objectid;
|
|
|
|
|
|
+ args.location = location;
|
|
args.root = root;
|
|
args.root = root;
|
|
|
|
|
|
inode = iget5_locked(s, hashval, btrfs_find_actor,
|
|
inode = iget5_locked(s, hashval, btrfs_find_actor,
|
|
@@ -5014,13 +5016,11 @@ struct inode *btrfs_iget(struct super_block *s, struct btrfs_key *location,
|
|
{
|
|
{
|
|
struct inode *inode;
|
|
struct inode *inode;
|
|
|
|
|
|
- inode = btrfs_iget_locked(s, location->objectid, root);
|
|
|
|
|
|
+ inode = btrfs_iget_locked(s, location, root);
|
|
if (!inode)
|
|
if (!inode)
|
|
return ERR_PTR(-ENOMEM);
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
if (inode->i_state & I_NEW) {
|
|
if (inode->i_state & I_NEW) {
|
|
- BTRFS_I(inode)->root = root;
|
|
|
|
- memcpy(&BTRFS_I(inode)->location, location, sizeof(*location));
|
|
|
|
btrfs_read_locked_inode(inode);
|
|
btrfs_read_locked_inode(inode);
|
|
if (!is_bad_inode(inode)) {
|
|
if (!is_bad_inode(inode)) {
|
|
inode_tree_add(inode);
|
|
inode_tree_add(inode);
|