blob: c381b45036501d8f5108513c13c2e45fb2740e05 [file] [log] [blame]
/*
* Metadata stress testing program for file system
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public
* License as published by the Free Software Foundation; version
* 2.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should find a copy of v2 of the GNU General Public License somewhere
* on your Linux system; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This program helps you to generate a k-tree in recusive.
*
* A k-tree is a tranformation of binary tree, A binary has 2
* children at most in each node, but a k-tree has k sub-nodes.
* We test both file and directory entries, So we do some changes.
* We create k sub directories and k text file in each parent.
*
* Copyright (C) 2009, Intel Corp.
* Author: Shaohui Zheng <shaohui.zheng@intel.com>
*/
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define MAX_PATH 8192
/*
* k tree generator.
*
* parameters:
* lvl: tree level number from button to top
* node_nr: the maximun nodes number
* return val: if it is leaf, return 0, or return 1
*/
int k_tree_gen(int lvl, int node_nr)
{
int cnt;
char dir[MAX_PATH], cwd[MAX_PATH], leaf[MAX_PATH];
if (lvl <= 0)
return 0;
for (cnt = 0; cnt < node_nr; cnt++) {
int fd = 0, fd2;
// generate dir name or file name
sprintf(dir, "%d-d", cnt);
sprintf(leaf, "%d-f", cnt);
// create an empty file
// API: open,close,dup,read,write,lseek
fd = open(leaf, O_CREAT | O_RDWR);
fd2 = dup(fd);
close(fd);
fd = fd2;
write(fd, leaf, 3);
lseek(fd, SEEK_SET, 0);
read(fd, leaf, 3);
close(fd);
// create directory entry
mkdir(dir, 0777);
getcwd(cwd, sizeof(cwd));
chdir(dir);
k_tree_gen(lvl - 1, node_nr);
chdir(cwd);
}
return 1;
}
int main(int argc, char **argv)
{
if (argc < 2) {
printf("Usage: k-tree tree_depth tree_width\n");
return 1;
}
printf("Generate k tree (depth: %s, width: %s) ...\n", argv[1],
argv[2]);
k_tree_gen(atoi(argv[1]), atoi(argv[2]));
printf("Generate k tree (depth: %s, width: %s), done\n", argv[1],
argv[2]);
return 0;
}