unsigned int nofs_flag;
struct inode *inode;
+ /* Only meant to be called for subvolume roots and not for log roots. */
+ ASSERT(is_fstree(btrfs_root_id(root)));
+
/*
* We're holding a transaction handle whether we are logging or
* replaying a log tree, so we must make sure NOFS semantics apply
return 0;
}
-/*
- * simple helper to read an inode off the disk from a given root
- * This can only be called for subvolume roots and not for the log
- */
-static noinline struct inode *read_one_inode(struct btrfs_root *root,
- u64 objectid)
-{
- struct btrfs_inode *inode;
-
- inode = btrfs_iget_logging(objectid, root);
- if (IS_ERR(inode))
- return NULL;
- return &inode->vfs_inode;
-}
/* replays a single extent in 'eb' at 'slot' with 'key' into the
* subvolume 'root'. path is released on entry and should be released
goto out;
}
- inode = read_one_inode(root, key->objectid);
- if (!inode) {
- ret = -EIO;
- goto out;
+ {
+ struct btrfs_inode *btrfs_inode;
+
+ btrfs_inode = btrfs_iget_logging(key->objectid, root);
+ if (IS_ERR(btrfs_inode)) {
+ ret = PTR_ERR(btrfs_inode);
+ goto out;
+ }
+ inode = &btrfs_inode->vfs_inode;
}
/*
btrfs_release_path(path);
- inode = read_one_inode(root, location.objectid);
- if (!inode) {
- ret = -EIO;
- goto out;
+ {
+ struct btrfs_inode *btrfs_inode;
+
+ btrfs_inode = btrfs_iget_logging(location.objectid, root);
+ if (IS_ERR(btrfs_inode)) {
+ ret = PTR_ERR(btrfs_inode);
+ inode = NULL;
+ goto out;
+ }
+ inode = &btrfs_inode->vfs_inode;
}
ret = link_to_fixup_dir(trans, root, path, location.objectid);
kfree(victim_name.name);
return ret;
} else if (!ret) {
- ret = -ENOENT;
- victim_parent = read_one_inode(root,
- parent_objectid);
- if (victim_parent) {
+ struct btrfs_inode *btrfs_victim;
+
+ btrfs_victim = btrfs_iget_logging(parent_objectid, root);
+ if (IS_ERR(btrfs_victim)) {
+ ret = PTR_ERR(btrfs_victim);
+ } else {
+ victim_parent = &btrfs_victim->vfs_inode;
inc_nlink(&inode->vfs_inode);
btrfs_release_path(path);
ret = unlink_inode_for_log_replay(trans,
BTRFS_I(victim_parent),
inode, &victim_name);
+ iput(victim_parent);
}
- iput(victim_parent);
kfree(victim_name.name);
if (ret)
return ret;
struct inode *dir;
btrfs_release_path(path);
- dir = read_one_inode(root, parent_id);
- if (!dir) {
- ret = -ENOENT;
- kfree(name.name);
- goto out;
+ {
+ struct btrfs_inode *btrfs_dir;
+
+ btrfs_dir = btrfs_iget_logging(parent_id, root);
+ if (IS_ERR(btrfs_dir)) {
+ ret = PTR_ERR(btrfs_dir);
+ kfree(name.name);
+ goto out;
+ }
+ dir = &btrfs_dir->vfs_inode;
}
ret = unlink_inode_for_log_replay(trans, BTRFS_I(dir),
inode, &name);
* copy the back ref in. The link count fixup code will take
* care of the rest
*/
- dir = read_one_inode(root, parent_objectid);
- if (!dir) {
- ret = -ENOENT;
- goto out;
+ {
+ struct btrfs_inode *btrfs_dir;
+
+ btrfs_dir = btrfs_iget_logging(parent_objectid, root);
+ if (IS_ERR(btrfs_dir)) {
+ ret = PTR_ERR(btrfs_dir);
+ dir = NULL;
+ goto out;
+ }
+ dir = &btrfs_dir->vfs_inode;
}
- inode = read_one_inode(root, inode_objectid);
- if (!inode) {
- ret = -EIO;
- goto out;
+ {
+ struct btrfs_inode *btrfs_inode;
+
+ btrfs_inode = btrfs_iget_logging(inode_objectid, root);
+ if (IS_ERR(btrfs_inode)) {
+ ret = PTR_ERR(btrfs_inode);
+ inode = NULL;
+ goto out;
+ }
+ inode = &btrfs_inode->vfs_inode;
}
while (ref_ptr < ref_end) {
* parent object can change from one array
* item to another.
*/
- if (!dir)
- dir = read_one_inode(root, parent_objectid);
if (!dir) {
- ret = -ENOENT;
- goto out;
+ struct btrfs_inode *btrfs_dir;
+
+ btrfs_dir = btrfs_iget_logging(parent_objectid, root);
+ if (IS_ERR(btrfs_dir)) {
+ ret = PTR_ERR(btrfs_dir);
+ dir = NULL;
+ goto out;
+ }
+ dir = &btrfs_dir->vfs_inode;
}
} else {
ret = ref_get_fields(eb, ref_ptr, &name, &ref_index);
break;
btrfs_release_path(path);
- inode = read_one_inode(root, key.offset);
- if (!inode) {
- ret = -EIO;
- break;
+ {
+ struct btrfs_inode *btrfs_inode;
+
+ btrfs_inode = btrfs_iget_logging(key.offset, root);
+ if (IS_ERR(btrfs_inode)) {
+ ret = PTR_ERR(btrfs_inode);
+ break;
+ }
+ inode = &btrfs_inode->vfs_inode;
}
ret = fixup_inode_link_count(trans, inode);
int ret = 0;
struct inode *inode;
- inode = read_one_inode(root, objectid);
- if (!inode)
- return -EIO;
+ {
+ struct btrfs_inode *btrfs_inode;
+
+ btrfs_inode = btrfs_iget_logging(objectid, root);
+ if (IS_ERR(btrfs_inode))
+ return PTR_ERR(btrfs_inode);
+ inode = &btrfs_inode->vfs_inode;
+ }
key.objectid = BTRFS_TREE_LOG_FIXUP_OBJECTID;
key.type = BTRFS_ORPHAN_ITEM_KEY;
struct inode *dir;
int ret;
- inode = read_one_inode(root, location->objectid);
- if (!inode)
- return -ENOENT;
+ {
+ struct btrfs_inode *btrfs_inode;
- dir = read_one_inode(root, dirid);
- if (!dir) {
- iput(inode);
- return -EIO;
+ btrfs_inode = btrfs_iget_logging(location->objectid, root);
+ if (IS_ERR(btrfs_inode))
+ return PTR_ERR(btrfs_inode);
+ inode = &btrfs_inode->vfs_inode;
+ }
+
+ {
+ struct btrfs_inode *btrfs_dir;
+
+ btrfs_dir = btrfs_iget_logging(dirid, root);
+ if (IS_ERR(btrfs_dir)) {
+ iput(inode);
+ return PTR_ERR(btrfs_dir);
+ }
+ dir = &btrfs_dir->vfs_inode;
}
ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode), name,
bool update_size = true;
bool name_added = false;
- dir = read_one_inode(root, key->objectid);
- if (!dir)
- return -EIO;
+ {
+ struct btrfs_inode *btrfs_dir;
+
+ btrfs_dir = btrfs_iget_logging(key->objectid, root);
+ if (IS_ERR(btrfs_dir))
+ return PTR_ERR(btrfs_dir);
+ dir = &btrfs_dir->vfs_inode;
+ }
ret = read_alloc_one_name(eb, di + 1, btrfs_dir_name_len(eb, di), &name);
if (ret)
btrfs_dir_item_key_to_cpu(eb, di, &location);
btrfs_release_path(path);
btrfs_release_path(log_path);
- inode = read_one_inode(root, location.objectid);
- if (!inode) {
- ret = -EIO;
- goto out;
+ {
+ struct btrfs_inode *btrfs_inode;
+
+ btrfs_inode = btrfs_iget_logging(location.objectid, root);
+ if (IS_ERR(btrfs_inode)) {
+ ret = PTR_ERR(btrfs_inode);
+ inode = NULL;
+ goto out;
+ }
+ inode = &btrfs_inode->vfs_inode;
}
ret = link_to_fixup_dir(trans, root, path, location.objectid);
if (!log_path)
return -ENOMEM;
- dir = read_one_inode(root, dirid);
- /* it isn't an error if the inode isn't there, that can happen
- * because we replay the deletes before we copy in the inode item
- * from the log
- */
- if (!dir) {
- btrfs_free_path(log_path);
- return 0;
+ {
+ struct btrfs_inode *btrfs_dir;
+
+ btrfs_dir = btrfs_iget_logging(dirid, root);
+ /*
+ * It isn't an error if the inode isn't there, that can happen because
+ * we replay the deletes before we copy in the inode item from the log.
+ */
+ if (IS_ERR(btrfs_dir)) {
+ btrfs_free_path(log_path);
+ ret = PTR_ERR(btrfs_dir);
+ if (ret == -ENOENT)
+ ret = 0;
+ return ret;
+ }
+ dir = &btrfs_dir->vfs_inode;
}
range_start = 0;
struct inode *inode;
u64 from;
- inode = read_one_inode(root, key.objectid);
- if (!inode) {
- ret = -EIO;
- break;
+ {
+ struct btrfs_inode *btrfs_inode;
+
+ btrfs_inode = btrfs_iget_logging(key.objectid, root);
+ if (IS_ERR(btrfs_inode)) {
+ ret = PTR_ERR(btrfs_inode);
+ break;
+ }
+ inode = &btrfs_inode->vfs_inode;
}
from = ALIGN(i_size_read(inode),
root->fs_info->sectorsize);