d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/*
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * CDDL HEADER START
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * The contents of this file are subject to the terms of the
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Common Development and Distribution License (the "License").
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * You may not use this file except in compliance with the License.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * or http://www.opensolaris.org/os/licensing.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * See the License for the specific language governing permissions
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * and limitations under the License.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * When distributing Covered Code, include this CDDL HEADER in each
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * If applicable, add the following below this CDDL HEADER, with the
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * fields enclosed by brackets "[]" replaced with your own identifying
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * information: Portions Copyright [yyyy] [name of copyright owner]
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * CDDL HEADER END
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/*
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Use is subject to license terms.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/*
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * Copyright (c) 2012 by Delphix. All rights reserved.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/*
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * --------------------------------------------------------------------
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * The purpose of this test is to see if the bug reported (#4723351) for
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * UFS exists when using a ZFS file system.
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy * --------------------------------------------------------------------
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#define _REENTRANT 1
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <stdio.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <fcntl.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <pthread.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <thread.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <errno.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <sys/types.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <sys/stat.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <stdlib.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <unistd.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy#include <strings.h>
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedystatic const int TRUE = 1;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedystatic char *filebase;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedystatic int
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedypickidx()
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy return (random() % 1000);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/* ARGSUSED */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedystatic void *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedymover(void *a)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy char buf[256];
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy int idx, len, ret;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy len = strlen(filebase) + 5;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy while (TRUE) {
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy idx = pickidx();
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) snprintf(buf, len, "%s.%03d", filebase, idx);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy ret = rename(filebase, buf);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if (ret < 0 && errno != ENOENT)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) perror("renaming file");
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy }
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy return (NULL);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy/* ARGSUSED */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedystatic void *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedycleaner(void *a)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy char buf[256];
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy int idx, len, ret;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy len = strlen(filebase) + 5;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy while (TRUE) {
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy idx = pickidx();
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) snprintf(buf, len, "%s.%03d", filebase, idx);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy ret = remove(buf);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if (ret < 0 && errno != ENOENT)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) perror("removing file");
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy }
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy return (NULL);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedystatic void *
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedywriter(void *a)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy int *fd = (int *)a;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy while (TRUE) {
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) close (*fd);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy *fd = open(filebase, O_APPEND | O_RDWR | O_CREAT, 0644);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if (*fd < 0)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy perror("refreshing file");
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) write(*fd, "test\n", 5);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy }
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy return (NULL);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedyint
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedymain(int argc, char **argv)
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy{
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy int fd;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy pthread_t tid;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if (argc == 1) {
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) printf("Usage: %s <filebase>\n", argv[0]);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy exit(-1);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy }
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy filebase = argv[1];
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy fd = open(filebase, O_APPEND | O_RDWR | O_CREAT, 0644);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if (fd < 0) {
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy perror("creating test file");
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy exit(-1);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy }
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) thr_setconcurrency(4); /* 3 threads + main */
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) pthread_create(&tid, NULL, mover, NULL);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) pthread_create(&tid, NULL, cleaner, NULL);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) pthread_create(&tid, NULL, writer, (void *) &fd);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy while (TRUE) {
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy int ret;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy struct stat st;
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy ret = stat(filebase, &st);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy if (ret == 0 && (st.st_nlink > 2 || st.st_nlink < 1)) {
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) printf("st.st_nlink = %d, exiting\n", \
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (int)st.st_nlink);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy exit(0);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy }
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy (void) sleep(1);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy }
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy return (0);
d583b39bfb4e2571d3e41097c5c357ffe353ad45John Wren Kennedy}