4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or https://opensource.org/licenses/CDDL-1.0.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
28 * Copyright (c) 2012 by Delphix. All rights reserved.
32 * --------------------------------------------------------------------
33 * The purpose of this test is to see if the bug reported (#4723351) for
34 * UFS exists when using a ZFS file system.
35 * --------------------------------------------------------------------
44 #include <sys/types.h>
49 static char *filebase
;
54 return (random() % 1000);
64 len
= strlen(filebase
) + 5;
68 (void) snprintf(buf
, len
, "%s.%03d", filebase
, idx
);
69 ret
= rename(filebase
, buf
);
70 if (ret
< 0 && errno
!= ENOENT
)
71 (void) perror("renaming file");
84 len
= strlen(filebase
) + 5;
88 (void) snprintf(buf
, len
, "%s.%03d", filebase
, idx
);
90 if (ret
< 0 && errno
!= ENOENT
)
91 (void) perror("removing file");
107 *fd
= open(filebase
, O_APPEND
| O_RDWR
| O_CREAT
, 0644);
109 perror("fail to open test file, refreshing it");
113 ret
= write(*fd
, "test\n", 5);
115 perror("writing file");
122 main(int argc
, char **argv
)
128 (void) printf("Usage: %s <filebase>\n", argv
[0]);
133 fd
= open(filebase
, O_APPEND
| O_RDWR
| O_CREAT
, 0644);
135 perror("creating test file");
139 (void) pthread_setconcurrency(4); /* 3 threads + main */
140 (void) pthread_create(&tid
, NULL
, mover
, NULL
);
141 (void) pthread_create(&tid
, NULL
, cleaner
, NULL
);
142 (void) pthread_create(&tid
, NULL
, writer
, (void *) &fd
);
148 ret
= stat(filebase
, &st
);
149 if (ret
== 0 && (st
.st_nlink
> 2 || st
.st_nlink
< 1)) {
150 (void) printf("st.st_nlink = %d, exiting\n", \