#include <sys/types.h>
#include <sys/sysctl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <err.h>
#include "stress.h"
static unsigned long size;
int
setup(int nb)
{
int64_t in;
int64_t bl;
int64_t reserve_in;
int64_t reserve_bl;
int pct;
if (nb == 0) {
getdf(&bl, &in);
size = in / op->incarnations;
pct = 90;
if (op->hog == 0)
pct = random_int(1, 90);
size = size / 100 * pct + 1;
size = size % 200;
while (size > 0) {
reserve_in = 1 * size * op->incarnations;
reserve_bl = 4096 * size * op->incarnations;
if (reserve_bl <= bl && reserve_in <= in)
break;
size = size / 2;
}
if (size == 0)
reserve_bl = reserve_in = 0;
if (op->verbose > 1)
printf("mkdir(size=%lu, incarnations=%d). Free(%jdk, %jd), reserve(%jdk, %jd)\n",
size, op->incarnations, bl/1024, in, reserve_bl/1024, reserve_in);
reservedf(reserve_bl, reserve_in);
putval(size);
} else
size = getval();
if (size == 0)
exit(0);
return (0);
}
void
cleanup(void)
{
}
static void
mkDir(char *path, int level) {
char newPath[MAXPATHLEN + 1];
if (mkdir(path, 0770) == -1) {
warn("mkdir(%s), level %d. %s:%d", path, level, __FILE__, __LINE__);
size = level;
} else
chdir(path);
if (done_testing == 1)
size = level;
if (level < (int)size) {
sprintf(newPath,"d%d", level+1);
mkDir(newPath, level+1);
}
}
static void
rmDir(char *path, int level) {
char newPath[MAXPATHLEN + 1];
if (level < (int)size) {
sprintf(newPath,"d%d", level+1);
rmDir(newPath, level+1);
}
chdir ("..");
if (rmdir(path) == -1) {
err(1, "rmdir(%s), %s:%d", path, __FILE__, __LINE__);
}
}
int
test(void)
{
char path[MAXPATHLEN + 1];
umask(0);
sprintf(path,"p%05d.d%d", getpid(), 1);
mkDir(path, 1);
rmDir(path, 1);
return (0);
}