119
119
#include <sys/fs/zfs.h>
120
120
#include <libnvpair.h>
121
121
122
- #define ZTEST_FD_DATA 3
123
- #define ZTEST_FD_RAND 4
122
+ static int ztest_fd_data = -1 ;
123
+ static int ztest_fd_rand = -1 ;
124
124
125
125
typedef struct ztest_shared_hdr {
126
126
uint64_t zh_hdr_size ;
@@ -708,14 +708,17 @@ process_options(int argc, char **argv)
708
708
UINT64_MAX >> 2 );
709
709
710
710
if (strlen (altdir ) > 0 ) {
711
- char cmd [ MAXNAMELEN ] ;
712
- char realaltdir [ MAXNAMELEN ] ;
711
+ char * cmd ;
712
+ char * realaltdir ;
713
713
char * bin ;
714
714
char * ztest ;
715
715
char * isa ;
716
716
int isalen ;
717
717
718
- (void ) realpath (getexecname (), cmd );
718
+ cmd = umem_alloc (MAXPATHLEN , UMEM_NOFAIL );
719
+ realaltdir = umem_alloc (MAXPATHLEN , UMEM_NOFAIL );
720
+
721
+ VERIFY (NULL != realpath (getexecname (), cmd ));
719
722
if (0 != access (altdir , F_OK )) {
720
723
ztest_dump_core = B_FALSE ;
721
724
fatal (B_TRUE , "invalid alternate ztest path: %s" ,
@@ -746,6 +749,9 @@ process_options(int argc, char **argv)
746
749
fatal (B_TRUE , "invalid alternate lib directory %s" ,
747
750
zo -> zo_alt_libpath );
748
751
}
752
+
753
+ umem_free (cmd , MAXPATHLEN );
754
+ umem_free (realaltdir , MAXPATHLEN );
749
755
}
750
756
}
751
757
@@ -762,10 +768,12 @@ ztest_random(uint64_t range)
762
768
{
763
769
uint64_t r ;
764
770
771
+ ASSERT3S (ztest_fd_rand , >=, 0 );
772
+
765
773
if (range == 0 )
766
774
return (0 );
767
775
768
- if (read (ZTEST_FD_RAND , & r , sizeof (r )) != sizeof (r ))
776
+ if (read (ztest_fd_rand , & r , sizeof (r )) != sizeof (r ))
769
777
fatal (1 , "short read from /dev/urandom" );
770
778
771
779
return (r % range );
@@ -5661,20 +5669,16 @@ ztest_init(ztest_shared_t *zs)
5661
5669
}
5662
5670
5663
5671
static void
5664
- setup_fds (void )
5672
+ setup_data_fd (void )
5665
5673
{
5666
- int fd ;
5674
+ static char ztest_name_data [] = "/tmp/ztest.data.XXXXXX" ;
5667
5675
5668
- char * tmp = tempnam (NULL , NULL );
5669
- fd = open (tmp , O_RDWR | O_CREAT , 0700 );
5670
- ASSERT3U (fd , = = , ZTEST_FD_DATA );
5671
- (void ) unlink (tmp );
5672
- free (tmp );
5673
-
5674
- fd = open ("/dev/urandom" , O_RDONLY );
5675
- ASSERT3U (fd , = = , ZTEST_FD_RAND );
5676
+ ztest_fd_data = mkstemp (ztest_name_data );
5677
+ ASSERT3S (ztest_fd_data , >=, 0 );
5678
+ (void ) unlink (ztest_name_data );
5676
5679
}
5677
5680
5681
+
5678
5682
static int
5679
5683
shared_data_size (ztest_shared_hdr_t * hdr )
5680
5684
{
@@ -5696,10 +5700,10 @@ setup_hdr(void)
5696
5700
ztest_shared_hdr_t * hdr ;
5697
5701
5698
5702
hdr = (void * )mmap (0 , P2ROUNDUP (sizeof (* hdr ), getpagesize ()),
5699
- PROT_READ | PROT_WRITE , MAP_SHARED , ZTEST_FD_DATA , 0 );
5703
+ PROT_READ | PROT_WRITE , MAP_SHARED , ztest_fd_data , 0 );
5700
5704
ASSERT (hdr != MAP_FAILED );
5701
5705
5702
- VERIFY3U (0 , = = , ftruncate (ZTEST_FD_DATA , sizeof (ztest_shared_hdr_t )));
5706
+ VERIFY3U (0 , = = , ftruncate (ztest_fd_data , sizeof (ztest_shared_hdr_t )));
5703
5707
5704
5708
hdr -> zh_hdr_size = sizeof (ztest_shared_hdr_t );
5705
5709
hdr -> zh_opts_size = sizeof (ztest_shared_opts_t );
@@ -5710,7 +5714,7 @@ setup_hdr(void)
5710
5714
hdr -> zh_ds_count = ztest_opts .zo_datasets ;
5711
5715
5712
5716
size = shared_data_size (hdr );
5713
- VERIFY3U (0 , = = , ftruncate (ZTEST_FD_DATA , size ));
5717
+ VERIFY3U (0 , = = , ftruncate (ztest_fd_data , size ));
5714
5718
5715
5719
(void ) munmap ((caddr_t )hdr , P2ROUNDUP (sizeof (* hdr ), getpagesize ()));
5716
5720
}
@@ -5723,14 +5727,14 @@ setup_data(void)
5723
5727
uint8_t * buf ;
5724
5728
5725
5729
hdr = (void * )mmap (0 , P2ROUNDUP (sizeof (* hdr ), getpagesize ()),
5726
- PROT_READ , MAP_SHARED , ZTEST_FD_DATA , 0 );
5730
+ PROT_READ , MAP_SHARED , ztest_fd_data , 0 );
5727
5731
ASSERT (hdr != MAP_FAILED );
5728
5732
5729
5733
size = shared_data_size (hdr );
5730
5734
5731
5735
(void ) munmap ((caddr_t )hdr , P2ROUNDUP (sizeof (* hdr ), getpagesize ()));
5732
5736
hdr = ztest_shared_hdr = (void * )mmap (0 , P2ROUNDUP (size , getpagesize ()),
5733
- PROT_READ | PROT_WRITE , MAP_SHARED , ZTEST_FD_DATA , 0 );
5737
+ PROT_READ | PROT_WRITE , MAP_SHARED , ztest_fd_data , 0 );
5734
5738
ASSERT (hdr != MAP_FAILED );
5735
5739
buf = (uint8_t * )hdr ;
5736
5740
@@ -5749,12 +5753,13 @@ exec_child(char *cmd, char *libpath, boolean_t ignorekill, int *statusp)
5749
5753
{
5750
5754
pid_t pid ;
5751
5755
int status ;
5752
- char cmdbuf [ MAXPATHLEN ] ;
5756
+ char * cmdbuf = NULL ;
5753
5757
5754
5758
pid = fork ();
5755
5759
5756
5760
if (cmd == NULL ) {
5757
- (void ) strlcpy (cmdbuf , getexecname (), sizeof (cmdbuf ));
5761
+ cmdbuf = umem_alloc (MAXPATHLEN , UMEM_NOFAIL );
5762
+ (void ) strlcpy (cmdbuf , getexecname (), MAXPATHLEN );
5758
5763
cmd = cmdbuf ;
5759
5764
}
5760
5765
@@ -5763,9 +5768,16 @@ exec_child(char *cmd, char *libpath, boolean_t ignorekill, int *statusp)
5763
5768
5764
5769
if (pid == 0 ) { /* child */
5765
5770
char * emptyargv [2 ] = { cmd , NULL };
5771
+ char fd_data_str [12 ];
5766
5772
5767
5773
struct rlimit rl = { 1024 , 1024 };
5768
5774
(void ) setrlimit (RLIMIT_NOFILE , & rl );
5775
+
5776
+ (void ) close (ztest_fd_rand );
5777
+ VERIFY3U (11 , >=,
5778
+ snprintf (fd_data_str , 12 , "%d" , ztest_fd_data ));
5779
+ VERIFY0 (setenv ("ZTEST_FD_DATA" , fd_data_str , 1 ));
5780
+
5769
5781
(void ) enable_extended_FILE_stdio (-1 , -1 );
5770
5782
if (libpath != NULL )
5771
5783
VERIFY (0 == setenv ("LD_LIBRARY_PATH" , libpath , 1 ));
@@ -5774,6 +5786,11 @@ exec_child(char *cmd, char *libpath, boolean_t ignorekill, int *statusp)
5774
5786
fatal (B_TRUE , "exec failed: %s" , cmd );
5775
5787
}
5776
5788
5789
+ if (cmdbuf != NULL ) {
5790
+ umem_free (cmdbuf , MAXPATHLEN );
5791
+ cmd = NULL ;
5792
+ }
5793
+
5777
5794
while (waitpid (pid , & status , 0 ) != pid )
5778
5795
continue ;
5779
5796
if (statusp != NULL )
@@ -5838,39 +5855,41 @@ main(int argc, char **argv)
5838
5855
char timebuf [100 ];
5839
5856
char numbuf [6 ];
5840
5857
spa_t * spa ;
5841
- char cmd [ MAXNAMELEN ] ;
5858
+ char * cmd ;
5842
5859
boolean_t hasalt ;
5843
-
5844
- boolean_t ischild = (0 == lseek (ZTEST_FD_DATA , 0 , SEEK_CUR ));
5845
- ASSERT (ischild || errno == EBADF );
5860
+ char * fd_data_str = getenv ("ZTEST_FD_DATA" );
5846
5861
5847
5862
(void ) setvbuf (stdout , NULL , _IOLBF , 0 );
5848
5863
5849
5864
dprintf_setup (& argc , argv );
5850
5865
5851
- if (!ischild ) {
5866
+ ztest_fd_rand = open ("/dev/urandom" , O_RDONLY );
5867
+ ASSERT3S (ztest_fd_rand , >=, 0 );
5868
+
5869
+ if (!fd_data_str ) {
5852
5870
process_options (argc , argv );
5853
5871
5854
- setup_fds ();
5872
+ setup_data_fd ();
5855
5873
setup_hdr ();
5856
5874
setup_data ();
5857
5875
bcopy (& ztest_opts , ztest_shared_opts ,
5858
5876
sizeof (* ztest_shared_opts ));
5859
5877
} else {
5878
+ ztest_fd_data = atoi (fd_data_str );
5860
5879
setup_data ();
5861
5880
bcopy (ztest_shared_opts , & ztest_opts , sizeof (ztest_opts ));
5862
5881
}
5863
5882
ASSERT3U (ztest_opts .zo_datasets , = = , ztest_shared_hdr -> zh_ds_count );
5864
5883
5865
5884
/* Override location of zpool.cache */
5866
- ( void ) asprintf ((char * * )& spa_config_path , "%s/zpool.cache" ,
5867
- ztest_opts .zo_dir );
5885
+ VERIFY3U ( asprintf ((char * * )& spa_config_path , "%s/zpool.cache" ,
5886
+ ztest_opts .zo_dir ), ! = , -1 ) ;
5868
5887
5869
5888
ztest_ds = umem_alloc (ztest_opts .zo_datasets * sizeof (ztest_ds_t ),
5870
5889
UMEM_NOFAIL );
5871
5890
zs = ztest_shared ;
5872
5891
5873
- if (ischild ) {
5892
+ if (fd_data_str ) {
5874
5893
metaslab_gang_bang = ztest_opts .zo_metaslab_gang_bang ;
5875
5894
metaslab_df_alloc_threshold =
5876
5895
zs -> zs_metaslab_df_alloc_threshold ;
@@ -5893,7 +5912,8 @@ main(int argc, char **argv)
5893
5912
(u_longlong_t )ztest_opts .zo_time );
5894
5913
}
5895
5914
5896
- (void ) strlcpy (cmd , getexecname (), sizeof (cmd ));
5915
+ cmd = umem_alloc (MAXNAMELEN , UMEM_NOFAIL );
5916
+ (void ) strlcpy (cmd , getexecname (), MAXNAMELEN );
5897
5917
5898
5918
zs -> zs_do_init = B_TRUE ;
5899
5919
if (strlen (ztest_opts .zo_alt_ztest ) != 0 ) {
@@ -6034,5 +6054,7 @@ main(int argc, char **argv)
6034
6054
kills , iters - kills , (100.0 * kills ) / MAX (1 , iters ));
6035
6055
}
6036
6056
6057
+ umem_free (cmd , MAXNAMELEN );
6058
+
6037
6059
return (0 );
6038
6060
}
0 commit comments