2015-07-01 22:23:09 +00:00
|
|
|
/*
|
|
|
|
* CDDL HEADER START
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the terms of the
|
|
|
|
* Common Development and Distribution License (the "License").
|
|
|
|
* You may not use this file except in compliance with the License.
|
|
|
|
*
|
|
|
|
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
2022-07-11 21:16:13 +00:00
|
|
|
* or https://opensource.org/licenses/CDDL-1.0.
|
2015-07-01 22:23:09 +00:00
|
|
|
* See the License for the specific language governing permissions
|
|
|
|
* and limitations under the License.
|
|
|
|
*
|
|
|
|
* When distributing Covered Code, include this CDDL HEADER in each
|
|
|
|
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
|
|
|
* If applicable, add the following below this CDDL HEADER, with the
|
|
|
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
|
|
|
* information: Portions Copyright [yyyy] [name of copyright owner]
|
|
|
|
*
|
|
|
|
* CDDL HEADER END
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
|
|
|
|
* Use is subject to license terms.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (c) 2012 by Delphix. All rights reserved.
|
|
|
|
*/
|
|
|
|
|
2022-03-22 19:09:47 +00:00
|
|
|
#include "file_common.h"
|
2015-07-01 22:23:09 +00:00
|
|
|
#include <sys/param.h>
|
|
|
|
#include <signal.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
2019-10-02 17:39:48 +00:00
|
|
|
#include <sys/stdtypes.h>
|
2015-07-01 22:23:09 +00:00
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* --------------------------------------------------------------
|
|
|
|
*
|
|
|
|
* Assertion:
|
|
|
|
* The last byte of the largest file size can be
|
|
|
|
* accessed without any errors. Also, the writing
|
|
|
|
* beyond the last byte of the largest file size
|
|
|
|
* will produce an errno of EFBIG.
|
|
|
|
*
|
|
|
|
* --------------------------------------------------------------
|
|
|
|
* If the write() system call below returns a "1",
|
|
|
|
* then the last byte can be accessed.
|
|
|
|
* --------------------------------------------------------------
|
|
|
|
*/
|
|
|
|
static void sigxfsz(int);
|
|
|
|
static void usage(char *);
|
|
|
|
|
|
|
|
int
|
|
|
|
main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
int fd = 0;
|
|
|
|
offset_t offset = (MAXOFFSET_T - 1);
|
|
|
|
offset_t llseek_ret = 0;
|
|
|
|
int write_ret = 0;
|
|
|
|
int err = 0;
|
2016-10-13 21:38:59 +00:00
|
|
|
char mybuf[5] = "aaaa\0";
|
2015-07-01 22:23:09 +00:00
|
|
|
char *testfile;
|
|
|
|
mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
|
2019-04-09 16:58:03 +00:00
|
|
|
struct sigaction sa;
|
2015-07-01 22:23:09 +00:00
|
|
|
|
|
|
|
if (argc != 2) {
|
|
|
|
usage(argv[0]);
|
|
|
|
}
|
|
|
|
|
2019-04-09 16:58:03 +00:00
|
|
|
if (sigemptyset(&sa.sa_mask) == -1)
|
|
|
|
return (errno);
|
|
|
|
sa.sa_flags = 0;
|
|
|
|
sa.sa_handler = sigxfsz;
|
|
|
|
if (sigaction(SIGXFSZ, &sa, NULL) == -1)
|
|
|
|
return (errno);
|
2015-07-01 22:23:09 +00:00
|
|
|
|
|
|
|
testfile = strdup(argv[1]);
|
Handle possible null pointers from malloc/strdup/strndup()
GCC 12.1.1_p20220625's static analyzer caught these.
Of the two in the btree test, one had previously been caught by Coverity
and Smatch, but GCC flagged it as a false positive. Upon examining how
other test cases handle this, the solution was changed from
`ASSERT3P(node, !=, NULL);` to using `perror()` to be consistent with
the fixes to the other fixes done to the ZTS code.
That approach was also used in ZED since I did not see a better way of
handling this there. Also, upon inspection, additional unchecked
pointers from malloc()/calloc()/strdup() were found in ZED, so those
were handled too.
In other parts of the code, the existing methods to avoid issues from
memory allocators returning NULL were used, such as using
`umem_alloc(size, UMEM_NOFAIL)` or returning `ENOMEM`.
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #13979
2022-10-07 00:18:40 +00:00
|
|
|
if (testfile == NULL)
|
|
|
|
return (errno);
|
2015-07-01 22:23:09 +00:00
|
|
|
|
|
|
|
fd = open(testfile, O_CREAT | O_RDWR, mode);
|
|
|
|
if (fd < 0) {
|
|
|
|
err = errno;
|
2016-10-13 21:38:59 +00:00
|
|
|
perror("Failed to create testfile");
|
|
|
|
free(testfile);
|
|
|
|
return (err);
|
2015-07-01 22:23:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
llseek_ret = lseek64(fd, offset, SEEK_SET);
|
|
|
|
if (llseek_ret < 0) {
|
|
|
|
err = errno;
|
2016-10-13 21:38:59 +00:00
|
|
|
perror("Failed to seek to end of testfile");
|
2015-07-01 22:23:09 +00:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
write_ret = write(fd, mybuf, 1);
|
|
|
|
if (write_ret < 0) {
|
|
|
|
err = errno;
|
2016-10-13 21:38:59 +00:00
|
|
|
perror("Failed to write to end of file");
|
2015-07-01 22:23:09 +00:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
offset = 0;
|
|
|
|
llseek_ret = lseek64(fd, offset, SEEK_CUR);
|
|
|
|
if (llseek_ret < 0) {
|
|
|
|
err = errno;
|
2016-10-13 21:38:59 +00:00
|
|
|
perror("Failed to seek to end of file");
|
2015-07-01 22:23:09 +00:00
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
write_ret = write(fd, mybuf, 1);
|
|
|
|
if (write_ret < 0) {
|
Enable remaining tests
Enable most of the remaining test cases which were previously
disabled. The required fixes are as follows:
* cache_001_pos - No changes required.
* cache_010_neg - Updated to use losetup under Linux. Loopback
cache devices are allowed, ZVOLs as cache devices are not.
Disabled until all the builders pass reliably.
* cachefile_001_pos, cachefile_002_pos, cachefile_003_pos,
cachefile_004_pos - Set set_device_dir path in cachefile.cfg,
updated CPATH1 and CPATH2 to reference unique files.
* zfs_clone_005_pos - Wait for udev to create volumes.
* zfs_mount_007_pos - Updated mount options to expected Linux names.
* zfs_mount_009_neg, zfs_mount_all_001_pos - No changes required.
* zfs_unmount_005_pos, zfs_unmount_009_pos, zfs_unmount_all_001_pos -
Updated to expect -f to not unmount busy mount points under Linux.
* rsend_019_pos - Observed to occasionally take a long time on both
32-bit systems and the kmemleak builder.
* zfs_written_property_001_pos - Switched sync(1) to sync_pool.
* devices_001_pos, devices_002_neg - Updated create_dev_file() helper
for Linux.
* exec_002_neg.ksh - Fixed mmap_exec.c to preserve errno. Updated
test case to expect EPERM from Linux as described by mmap(2).
* grow_pool_001_pos - Adding missing setup.ksh and cleanup.ksh
scripts from OpenZFS.
* grow_replicas_001_pos.ksh - Added missing $SLICE_* variables.
* history_004_pos, history_006_neg, history_008_pos - Fixed by
previous commits and were not enabled. No changes required.
* zfs_allow_010_pos - Added missing spaces after assorted zfs
commands in delegate_common.kshlib.
* inuse_* - Illumos dump device tests skipped. Remaining test
cases updated to correctly create required partitions.
* large_files_001_pos - Fixed largest_file.c to accept EINVAL
as well as EFBIG as described in write(2).
* link_count_001 - Added nproc to required commands.
* umountall_001 - Updated to use umount -a.
* online_offline_001_* - Pull in OpenZFS change to file_trunc.c
to make the '-c 0' option run the test in a loop. Included
online_offline.cfg file in all test cases.
* rename_dirs_001_pos - Updated to use the rename_dir test binary,
pkill restricted to exact matches and total runtime reduced.
* slog_013_neg, write_dirs_002_pos - No changes required.
* slog_013_pos.ksh - Updated to use losetup under Linux.
* slog_014_pos.ksh - ZED will not be running, manually degrade
the damaged vdev as expected.
* nopwrite_varying_compression, nopwrite_volume - Forced pool
sync with sync_pool to ensure up to date property values.
* Fixed typos in ZED log messages. Refactored zed_* helper
functions to resolve all-syslog exit=1 errors in zedlog.
* zfs_copies_005_neg, zfs_get_004_pos, zpool_add_004_pos,
zpool_destroy_001_pos, largest_pool_001_pos, clone_001_pos.ksh,
clone_001_pos, - Skip until layering pools on zvols is solid.
* largest_pool_001_pos - Limited to 7eb pool, maximum
supported size in 8eb-1 on Linux.
* zpool_expand_001_pos, zpool_expand_003_neg - Requires
additional support from the ZED, updated skip reason.
* zfs_rollback_001_pos, zfs_rollback_002_pos - Properly cleanup
busy mount points under Linux between test loops.
* privilege_001_pos, privilege_003_pos, rollback_003_pos,
threadsappend_001_pos - Skip with log_unsupported.
* snapshot_016_pos - No changes required.
* snapshot_008_pos - Increased LIMIT from 512K to 2M and added
sync_pool to avoid false positives.
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #6128
2017-05-19 00:21:15 +00:00
|
|
|
if (errno == EFBIG || errno == EINVAL) {
|
|
|
|
(void) printf("write errno=EFBIG|EINVAL: success\n");
|
2015-07-01 22:23:09 +00:00
|
|
|
err = 0;
|
|
|
|
} else {
|
|
|
|
err = errno;
|
2016-10-13 21:38:59 +00:00
|
|
|
perror("Did not receive EFBIG");
|
2015-07-01 22:23:09 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
(void) printf("write completed successfully, test failed\n");
|
|
|
|
err = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
out:
|
|
|
|
(void) unlink(testfile);
|
|
|
|
free(testfile);
|
2016-10-13 21:38:59 +00:00
|
|
|
close(fd);
|
2015-07-01 22:23:09 +00:00
|
|
|
return (err);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
usage(char *name)
|
|
|
|
{
|
|
|
|
(void) printf("%s <testfile>\n", name);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
sigxfsz(int signo)
|
|
|
|
{
|
2021-12-11 01:24:35 +00:00
|
|
|
(void) signo;
|
2015-07-01 22:23:09 +00:00
|
|
|
(void) printf("\nlargest_file: sigxfsz() caught SIGXFSZ\n");
|
|
|
|
}
|