xref: /freebsd-src/sys/contrib/openzfs/tests/zfs-tests/tests/functional/append/file_append.ksh (revision 271171e0d97b88ba2a7c3bf750c9672b484c1c13)
1716fd348SMartin Matuska#!/bin/ksh -p
2716fd348SMartin Matuska#
3716fd348SMartin Matuska# CDDL HEADER START
4716fd348SMartin Matuska#
5716fd348SMartin Matuska# The contents of this file are subject to the terms of the
6716fd348SMartin Matuska# Common Development and Distribution License (the "License").
7716fd348SMartin Matuska# You may not use this file except in compliance with the License.
8716fd348SMartin Matuska#
9716fd348SMartin Matuska# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*271171e0SMartin Matuska# or https://opensource.org/licenses/CDDL-1.0.
11716fd348SMartin Matuska# See the License for the specific language governing permissions
12716fd348SMartin Matuska# and limitations under the License.
13716fd348SMartin Matuska#
14716fd348SMartin Matuska# When distributing Covered Code, include this CDDL HEADER in each
15716fd348SMartin Matuska# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16716fd348SMartin Matuska# If applicable, add the following below this CDDL HEADER, with the
17716fd348SMartin Matuska# fields enclosed by brackets "[]" replaced with your own identifying
18716fd348SMartin Matuska# information: Portions Copyright [yyyy] [name of copyright owner]
19716fd348SMartin Matuska#
20716fd348SMartin Matuska# CDDL HEADER END
21716fd348SMartin Matuska#
22716fd348SMartin Matuska
23716fd348SMartin Matuska#
24716fd348SMartin Matuska# Copyright (c) 2022 by Triad National Security, LCC
25716fd348SMartin Matuska#
26716fd348SMartin Matuska
27716fd348SMartin Matuska. $STF_SUITE/include/libtest.shlib
28716fd348SMartin Matuska
29716fd348SMartin Matuska#
30716fd348SMartin Matuska# DESCRIPTION:
31716fd348SMartin Matuska# Tests file offset using O_APPEND.
32716fd348SMartin Matuska#
33716fd348SMartin Matuska# STRATEGY:
34716fd348SMartin Matuska# 1. Open file using O_APPEND
35716fd348SMartin Matuska# 2. Write to the file using random number of blocks (1, 2, or 3)
36716fd348SMartin Matuska# 3. Verify that the file offset is correct using lseek after the write
37716fd348SMartin Matuska# 4. Repeat steps 2 and 3, 5 times
38716fd348SMartin Matuska# 5. Close the file.
39716fd348SMartin Matuska# 6. Repeat steps 1-5 but also open file with O_DIRECT
40716fd348SMartin Matuska#
41716fd348SMartin Matuska
42716fd348SMartin Matuskaverify_runnable "global"
43716fd348SMartin Matuska
44716fd348SMartin Matuskalog_assert "Ensure file offset is updated correctly when opened with O_APPEND"
45716fd348SMartin Matuska
46716fd348SMartin Matuskamntpt=$(get_prop mountpoint $TESTPOOL/$TESTFS)
47716fd348SMartin Matuskafilename=$mntpt/append_file.txt
48716fd348SMartin Matuskabs=131072
49716fd348SMartin MatuskaITERATIONS=5
50716fd348SMartin Matuskaexpected=0
51716fd348SMartin Matuska
52716fd348SMartin Matuska# First test using buffered writes with O_APPEND
53716fd348SMartin Matuskafor i in $(seq $ITERATIONS); do
54716fd348SMartin Matuska	num_blocks=$(random_int_between 1 3)
55716fd348SMartin Matuska	expected=$((expected + ( bs * num_blocks)))
56716fd348SMartin Matuska	log_must file_append -f $filename -e $expected -b $bs -n $num_blocks
57716fd348SMartin Matuska	curr_offset=$expected
58716fd348SMartin Matuskadone
59716fd348SMartin Matuska
60716fd348SMartin Matuskalog_must rm -f $filename
61716fd348SMartin Matuska
62716fd348SMartin Matuskaexpected=0
63716fd348SMartin Matuska
64716fd348SMartin Matuska# Repeat same test using O_DIRECT writes with O_APPEND
65716fd348SMartin Matuskafor i in $(seq $ITERATIONS); do
66716fd348SMartin Matuska	num_blocks=$(random_int_between 1 3)
67716fd348SMartin Matuska	expected=$((expected + ( bs * num_blocks)))
68716fd348SMartin Matuska	log_must file_append -f $filename -e $expected -b $bs -n $num_blocks -d
69716fd348SMartin Matuskadone
70716fd348SMartin Matuska
71716fd348SMartin Matuskalog_must rm -f $filename
72716fd348SMartin Matuska
73716fd348SMartin Matuskalog_pass "File offset updated correctly when opening a file with O_APPEND."
74