blob: 954cddddf1b8770f3ff628f0f662b11caa339f7a [file] [log] [blame]
/*
* Copyright (c) International Business Machines Corp., 2001-2004
*
* 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; either version 2 of the License, or
* (at your option) any later version.
*
* 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 have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "ffsb.h"
#include "metaops.h"
#include "rand.h"
#include "filelist.h"
/* metaops:
* createdir
* removedir
* renamedir
* renamefile
*/
void metaops_metadir(ffsb_fs_t * fs, unsigned opnum)
{
fs_set_opdata(fs, fs_get_metafiles(fs), opnum);
}
static void createdir(struct benchfiles *dirs, randdata_t * rd)
{
struct ffsb_file *newdir;
newdir = add_file(dirs, 0, rd);
if (mkdir(newdir->name, S_IRWXU) < 0) {
perror("mkdir");
exit(1);
}
unlock_file_writer(newdir);
}
static void removedir(struct benchfiles *dirs, randdata_t * rd)
{
struct ffsb_file *deldir;
deldir = choose_file_writer(dirs, rd);
remove_file(dirs, deldir);
if (rmdir(deldir->name) < 0) {
perror("rmdir");
exit(1);
}
unlock_file_writer(deldir);
}
static void renamedir(struct benchfiles *dirs, randdata_t * rd)
{
struct ffsb_file *dir;
char *oldname;
dir = choose_file_writer(dirs, rd);
oldname = dir->name;
rename_file(dir);
if (rename(oldname, dir->name) < 0) {
perror("rename");
exit(1);
}
unlock_file_writer(dir);
free(oldname);
}
void ffsb_metaops(ffsb_thread_t * ft, ffsb_fs_t * fs, unsigned opnum)
{
struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
randdata_t *rd = ft_get_randdata(ft);
createdir(bf, rd);
createdir(bf, rd);
removedir(bf, rd);
renamedir(bf, rd);
ft_incr_op(ft, opnum, 1, 0);
}
void ffsb_createdir(ffsb_thread_t * ft, ffsb_fs_t * fs, unsigned opnum)
{
struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum);
struct ffsb_file *newdir;
randdata_t *rd = ft_get_randdata(ft);
newdir = add_dir(bf, 0, rd);
if (mkdir(newdir->name, S_IRWXU) < 0) {
perror("mkdir");
exit(1);
}
unlock_file_writer(newdir);
ft_incr_op(ft, opnum, 1, 0);
}