/* * 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 #include #include #include #include #include #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); }