1*08ae7ca2SJerry Jelinek#!/bin/ksh -p
2*08ae7ca2SJerry Jelinek#
3*08ae7ca2SJerry Jelinek# CDDL HEADER START
4*08ae7ca2SJerry Jelinek#
5*08ae7ca2SJerry Jelinek# This file and its contents are supplied under the terms of the
6*08ae7ca2SJerry Jelinek# Common Development and Distribution License ("CDDL"), version 1.0.
7*08ae7ca2SJerry Jelinek# You may only use this file in accordance with the terms of version
8*08ae7ca2SJerry Jelinek# 1.0 of the CDDL.
9*08ae7ca2SJerry Jelinek#
10*08ae7ca2SJerry Jelinek# A full copy of the text of the CDDL should have accompanied this
11*08ae7ca2SJerry Jelinek# source.  A copy of the CDDL is also available via the Internet at
12*08ae7ca2SJerry Jelinek# http://www.illumos.org/license/CDDL.
13*08ae7ca2SJerry Jelinek#
14*08ae7ca2SJerry Jelinek# CDDL HEADER END
15*08ae7ca2SJerry Jelinek#
16*08ae7ca2SJerry Jelinek
17*08ae7ca2SJerry Jelinek#
18*08ae7ca2SJerry Jelinek# Copyright 2019 Joyent, Inc.
19*08ae7ca2SJerry Jelinek#
20*08ae7ca2SJerry Jelinek
21*08ae7ca2SJerry Jelinek. $STF_SUITE/tests/functional/rsend/rsend.kshlib
22*08ae7ca2SJerry Jelinek
23*08ae7ca2SJerry Jelinek#
24*08ae7ca2SJerry Jelinek# DESCRIPTION:
25*08ae7ca2SJerry Jelinek# Verify that the parent dataset is passed to the kernel's zfs_secpolicy_recv
26*08ae7ca2SJerry Jelinek# function during a zfs receive.
27*08ae7ca2SJerry Jelinek#
28*08ae7ca2SJerry Jelinek# STRATEGY:
29*08ae7ca2SJerry Jelinek# 1. Create a hierarchy of datasets.
30*08ae7ca2SJerry Jelinek# 2. Take a snapshot of the final child dataset and send it to a file.
31*08ae7ca2SJerry Jelinek# 3. Use DTrace to run the zfs recv command and simultaneously monitor the
32*08ae7ca2SJerry Jelinek#    zc_name member of the zfs_cmd_t structure that is validated in
33*08ae7ca2SJerry Jelinek#    zfs_secpolicy_recv.
34*08ae7ca2SJerry Jelinek# 4. Verify that the zc_name member is the parent dataset, as expected.
35*08ae7ca2SJerry Jelinek#
36*08ae7ca2SJerry Jelinek
37*08ae7ca2SJerry Jelinekverify_runnable "both"
38*08ae7ca2SJerry Jelinek
39*08ae7ca2SJerry Jelinekfunction cleanup
40*08ae7ca2SJerry Jelinek{
41*08ae7ca2SJerry Jelinek	destroy_dataset $TESTPOOL/testfs2 "-r"
42*08ae7ca2SJerry Jelinek	destroy_dataset $TESTPOOL/testfs1 "-r"
43*08ae7ca2SJerry Jelinek	[[ -f $sendfile ]] && log_must rm $sendfile
44*08ae7ca2SJerry Jelinek}
45*08ae7ca2SJerry Jelineklog_onexit cleanup
46*08ae7ca2SJerry Jelinek
47*08ae7ca2SJerry Jelineklog_assert "Verify zfs_secpolicy_recv is passed the proper trimmed name"
48*08ae7ca2SJerry Jelinek
49*08ae7ca2SJerry Jelinektypeset sendfile=$TESTDIR/sendfile
50*08ae7ca2SJerry Jelinek
51*08ae7ca2SJerry Jelineklog_must zfs create $TESTPOOL/testfs1
52*08ae7ca2SJerry Jelineklog_must zfs create $TESTPOOL/testfs1/data
53*08ae7ca2SJerry Jelineklog_must zfs create $TESTPOOL/testfs1/data/foo
54*08ae7ca2SJerry Jelinek
55*08ae7ca2SJerry Jelineklog_must zfs create $TESTPOOL/testfs2
56*08ae7ca2SJerry Jelineklog_must zfs create $TESTPOOL/testfs2/data
57*08ae7ca2SJerry Jelinek
58*08ae7ca2SJerry Jelineklog_must mkfile 4k /$TESTPOOL/testfs1/data/foo/testfile0
59*08ae7ca2SJerry Jelinek
60*08ae7ca2SJerry Jelineklog_must zfs snap $TESTPOOL/testfs1/data/foo@1
61*08ae7ca2SJerry Jelinek
62*08ae7ca2SJerry Jelineklog_must eval "zfs send $TESTPOOL/testfs1/data/foo@1 > $sendfile"
63*08ae7ca2SJerry Jelinek
64*08ae7ca2SJerry Jelinekzc_name=$(/usr/sbin/dtrace -q -n \
65*08ae7ca2SJerry Jelinek   'fbt::zfs_secpolicy_recv:entry {printf("%s", stringof(args[0]->zc_name));}' \
66*08ae7ca2SJerry Jelinek    -c "zfs receive $TESTPOOL/testfs2/data/foo" < $sendfile)
67*08ae7ca2SJerry Jelinek
68*08ae7ca2SJerry Jelinek[[ "$zc_name" == "$TESTPOOL/testfs2/data" ]] || \
69*08ae7ca2SJerry Jelinek    log_fail "zc_name mismatch: $zc_name != $TESTPOOL/testfs2/data"
70*08ae7ca2SJerry Jelinek
71*08ae7ca2SJerry Jelineklog_pass "zfs_secpolicy_recv is passed the proper trimmed name"
72