1/* 2 * Copyright (c) International Business Machines Corp., 2001-2004 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12 * the GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18#include <unistd.h> 19#include <sys/stat.h> 20#include <sys/types.h> 21#include <string.h> 22#include <stdio.h> 23#include <stdlib.h> 24 25#include "ffsb.h" 26#include "metaops.h" 27#include "rand.h" 28#include "filelist.h" 29 30/* metaops: 31 * createdir 32 * removedir 33 * renamedir 34 * renamefile 35 */ 36 37void metaops_metadir(ffsb_fs_t * fs, unsigned opnum) 38{ 39 fs_set_opdata(fs, fs_get_metafiles(fs), opnum); 40} 41 42static void createdir(struct benchfiles *dirs, randdata_t * rd) 43{ 44 struct ffsb_file *newdir; 45 46 newdir = add_file(dirs, 0, rd); 47 if (mkdir(newdir->name, S_IRWXU) < 0) { 48 perror("mkdir"); 49 exit(1); 50 } 51 unlock_file_writer(newdir); 52} 53 54static void removedir(struct benchfiles *dirs, randdata_t * rd) 55{ 56 struct ffsb_file *deldir; 57 58 deldir = choose_file_writer(dirs, rd); 59 remove_file(dirs, deldir); 60 61 if (rmdir(deldir->name) < 0) { 62 perror("rmdir"); 63 exit(1); 64 } 65 unlock_file_writer(deldir); 66} 67 68static void renamedir(struct benchfiles *dirs, randdata_t * rd) 69{ 70 struct ffsb_file *dir; 71 char *oldname; 72 73 dir = choose_file_writer(dirs, rd); 74 oldname = dir->name; 75 rename_file(dir); 76 77 if (rename(oldname, dir->name) < 0) { 78 perror("rename"); 79 exit(1); 80 } 81 unlock_file_writer(dir); 82 free(oldname); 83} 84 85void ffsb_metaops(ffsb_thread_t * ft, ffsb_fs_t * fs, unsigned opnum) 86{ 87 struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum); 88 randdata_t *rd = ft_get_randdata(ft); 89 90 createdir(bf, rd); 91 createdir(bf, rd); 92 removedir(bf, rd); 93 renamedir(bf, rd); 94 95 ft_incr_op(ft, opnum, 1, 0); 96} 97 98void ffsb_createdir(ffsb_thread_t * ft, ffsb_fs_t * fs, unsigned opnum) 99{ 100 struct benchfiles *bf = (struct benchfiles *)fs_get_opdata(fs, opnum); 101 struct ffsb_file *newdir; 102 randdata_t *rd = ft_get_randdata(ft); 103 104 newdir = add_dir(bf, 0, rd); 105 if (mkdir(newdir->name, S_IRWXU) < 0) { 106 perror("mkdir"); 107 exit(1); 108 } 109 unlock_file_writer(newdir); 110 111 ft_incr_op(ft, opnum, 1, 0); 112} 113