Skip to content

Commit

Permalink
btrfs: preallocate path for snapshot creation at ioctl time
Browse files Browse the repository at this point in the history
We can also preallocate btrfs_path that's used during pending snapshot
creation and avoid another late ENOMEM failure.

Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
David Sterba committed Jan 7, 2016
1 parent b0c0ea6 commit 8546b57
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 6 deletions.
4 changes: 3 additions & 1 deletion fs/btrfs/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -661,7 +661,8 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,

pending_snapshot->root_item = kzalloc(sizeof(struct btrfs_root_item),
GFP_NOFS);
if (!pending_snapshot->root_item) {
pending_snapshot->path = btrfs_alloc_path();
if (!pending_snapshot->root_item || !pending_snapshot->path) {
ret = -ENOMEM;
goto free_pending;
}
Expand Down Expand Up @@ -747,6 +748,7 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,
wake_up_atomic_t(&root->will_be_snapshoted);
free_pending:
kfree(pending_snapshot->root_item);
btrfs_free_path(pending_snapshot->path);
kfree(pending_snapshot);

return ret;
Expand Down
9 changes: 4 additions & 5 deletions fs/btrfs/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -1319,11 +1319,8 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
u64 root_flags;
uuid_le new_uuid;

path = btrfs_alloc_path();
if (!path) {
pending->error = -ENOMEM;
return 0;
}
ASSERT(pending->path);
path = pending->path;

ASSERT(pending->root_item);
new_root_item = pending->root_item;
Expand Down Expand Up @@ -1561,6 +1558,8 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
kfree(new_root_item);
pending->root_item = NULL;
btrfs_free_path(path);
pending->path = NULL;

return ret;
}

Expand Down
1 change: 1 addition & 0 deletions fs/btrfs/transaction.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ struct btrfs_pending_snapshot {
struct btrfs_root_item *root_item;
struct btrfs_root *snap;
struct btrfs_qgroup_inherit *inherit;
struct btrfs_path *path;
/* block reservation for the operation */
struct btrfs_block_rsv block_rsv;
u64 qgroup_reserved;
Expand Down

0 comments on commit 8546b57

Please sign in to comment.