On Mon, Aug 01, 2022 at 11:54:40AM -0700, Boris Burkov wrote: > +static int process_new_verity(struct send_ctx *sctx) > +{ > + int ret = 0; > + struct btrfs_fs_info *fs_info = sctx->send_root->fs_info; > + struct inode *inode; > + struct fs_path *p; > + > + inode = btrfs_iget(fs_info->sb, sctx->cur_ino, sctx->send_root); > + if (IS_ERR(inode)) > + return PTR_ERR(inode); > + > + ret = fs_info->sb->s_vop->get_verity_descriptor(inode, NULL, 0); This is a long way to call btrfs_get_verity_descriptor from fs/btrfs/verity.c , is there a reason we can't call it directly? > + if (ret < 0) > + goto iput; > + > + if (ret > FS_VERITY_MAX_DESCRIPTOR_SIZE) { > + ret = -EMSGSIZE; > + goto iput; > + } > + if (!sctx->verity_descriptor) { > + sctx->verity_descriptor = kvmalloc(FS_VERITY_MAX_DESCRIPTOR_SIZE, GFP_KERNEL); > + if (!sctx->verity_descriptor) { > + ret = -ENOMEM; > + goto iput; > + } > + } > + > + ret = fs_info->sb->s_vop->get_verity_descriptor(inode, sctx->verity_descriptor, ret); > + if (ret < 0) > + goto iput; > + > + p = fs_path_alloc(); > + if (!p) { > + ret = -ENOMEM; > + goto iput; > + } > + ret = get_cur_path(sctx, sctx->cur_ino, sctx->cur_inode_gen, p); > + if (ret < 0) > + goto free_path; > + > + ret = send_verity(sctx, p, sctx->verity_descriptor); > + if (ret < 0) > + goto free_path; > + > +free_path: > + fs_path_free(p); > +iput: > + iput(inode); > + return ret; > +}