return ret;
 }
 
-static int create_snapshot(struct btrfs_root *root, struct dentry *dentry,
-                          char *name, int namelen, u64 *async_transid,
-                          bool readonly, struct btrfs_qgroup_inherit *inherit)
+static int create_snapshot(struct btrfs_root *root, struct inode *dir,
+                          struct dentry *dentry, char *name, int namelen,
+                          u64 *async_transid, bool readonly,
+                          struct btrfs_qgroup_inherit *inherit)
 {
        struct inode *inode;
        struct btrfs_pending_snapshot *pending_snapshot;
        pending_snapshot->dentry = dentry;
        pending_snapshot->root = root;
        pending_snapshot->readonly = readonly;
+       pending_snapshot->dir = dir;
        pending_snapshot->inherit = inherit;
 
        trans = btrfs_start_transaction(root->fs_info->extent_root, 6);
                goto out_up_read;
 
        if (snap_src) {
-               error = create_snapshot(snap_src, dentry, name, namelen,
+               error = create_snapshot(snap_src, dir, dentry, name, namelen,
                                        async_transid, readonly, inherit);
        } else {
                error = create_subvol(BTRFS_I(dir)->root, dentry,
 
        struct inode *parent_inode;
        struct btrfs_path *path;
        struct btrfs_dir_item *dir_item;
-       struct dentry *parent;
        struct dentry *dentry;
        struct extent_buffer *tmp;
        struct extent_buffer *old;
        trans->bytes_reserved = trans->block_rsv->reserved;
 
        dentry = pending->dentry;
-       parent = dget_parent(dentry);
-       parent_inode = parent->d_inode;
+       parent_inode = pending->dir;
        parent_root = BTRFS_I(parent_inode)->root;
        record_root_in_trans(trans, parent_root);
 
        if (ret)
                btrfs_abort_transaction(trans, root, ret);
 fail:
-       dput(parent);
        trans->block_rsv = rsv;
        trans->bytes_reserved = 0;
 no_free_objectid: