1122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak/****************************************************************************** 256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * Copyright (c) International Business Machines Corp., 2007 397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang * Author: Sharyathi Nagesh <sharyathi@in.ibm.com> 4122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak ******************************************************************************/ 5122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 6122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak/*************************************************************************** 756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * This program is free software; you can redistribute it and/or modify 856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * it under the terms of the GNU General Public License as published by 956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * the Free Software Foundation; either version 2 of the License, or 1056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * (at your option) any later version. 1156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * 1256207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * This program is distributed in the hope that it will be useful, 1356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * but WITHOUT ANY WARRANTY; without even the implied warranty of 1456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * GNU Library General Public License for more details. 1656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * 1756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * You should have received a copy of the GNU General Public License 1856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * along with this program; if not, write to the Free Software 1956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 2056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak***************************************************************************/ 21122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 2297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang/* 2397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang * DESCRIPTION 2497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang * check fallocate() with various error conditions that should produce 253015af25ab48cbee1f479c3d90df920d5f71aa9cZeng Linggang * EBADF, EINVAL and EFBIG. 2697a54fc064301f9fa23caa805284a83ad205219eZeng Linggang */ 27122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 2819602e68457b7a09217e6e8a5816b8abcd608e21Xiaoguang Wang#define _GNU_SOURCE 2919602e68457b7a09217e6e8a5816b8abcd608e21Xiaoguang Wang 30122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#include <stdio.h> 31122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#include <stdlib.h> 32187f2519c2d28a773053eac796c8cb1c67439624Garrett Cooper#include <endian.h> 33122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#include <errno.h> 34122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#include <sys/stat.h> 35122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#include <sys/types.h> 36122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#include <fcntl.h> 374a5373fbea70484bd96b2c7c89c3fbc7141ac423vapier#include <inttypes.h> 38df18bd071ec40d9c7b3cc7a481f1c00c3b45b87asubrata_modak#include <sys/utsname.h> 39122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 40122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#include "test.h" 4197a54fc064301f9fa23caa805284a83ad205219eZeng Linggang#include "safe_macros.h" 42b731859c7c628511b7012f5403002ca39163fbe8Jakub Racek#include "lapi/fallocate.h" 43122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 4497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang#define BLOCKS_WRITTEN 12 45122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#ifdef TEST_DEFAULT 4697a54fc064301f9fa23caa805284a83ad205219eZeng Linggang# define DEFAULT_TEST_MODE 0 47122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#else 4897a54fc064301f9fa23caa805284a83ad205219eZeng Linggang# define DEFAULT_TEST_MODE 1 49122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak#endif 5097a54fc064301f9fa23caa805284a83ad205219eZeng Linggang#define OFFSET 12 5197a54fc064301f9fa23caa805284a83ad205219eZeng Linggang#define FNAMER "test_file1" 5297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang#define FNAMEW "test_file2" 5397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang#define BLOCK_SIZE 1024 543015af25ab48cbee1f479c3d90df920d5f71aa9cZeng Linggang#define MAX_FILESIZE (LLONG_MAX / 1024) 55122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 5697a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic void setup(void); 5797a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic void fallocate_verify(int); 5897a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic void cleanup(void); 59122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 6097a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic int fdw; 6197a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic int fdr; 62122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 6397a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic struct test_data_t { 6497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang int *fd; 6597a54fc064301f9fa23caa805284a83ad205219eZeng Linggang char *fname; 66122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak int mode; 67122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak loff_t offset; 68122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak loff_t len; 694bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak int error; 704bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak} test_data[] = { 7197a54fc064301f9fa23caa805284a83ad205219eZeng Linggang {&fdr, FNAMER, DEFAULT_TEST_MODE, 0, 1, EBADF}, 7297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang {&fdw, FNAMEW, DEFAULT_TEST_MODE, -1, 1, EINVAL}, 7397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang {&fdw, FNAMEW, DEFAULT_TEST_MODE, 1, -1, EINVAL}, 7497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang {&fdw, FNAMEW, DEFAULT_TEST_MODE, BLOCKS_WRITTEN, 0, EINVAL}, 7597a54fc064301f9fa23caa805284a83ad205219eZeng Linggang {&fdw, FNAMEW, DEFAULT_TEST_MODE, BLOCKS_WRITTEN, -1, EINVAL}, 7697a54fc064301f9fa23caa805284a83ad205219eZeng Linggang {&fdw, FNAMEW, DEFAULT_TEST_MODE, -(BLOCKS_WRITTEN+OFFSET), 1, EINVAL}, 77b24ce8f6bcf315078bdc48bbddf780b964ffa59aCyril Hrubis#if __WORDSIZE == 64 || _FILE_OFFSET_BITS == 64 783015af25ab48cbee1f479c3d90df920d5f71aa9cZeng Linggang {&fdw, FNAMEW, DEFAULT_TEST_MODE, MAX_FILESIZE, 1, EFBIG}, 793015af25ab48cbee1f479c3d90df920d5f71aa9cZeng Linggang {&fdw, FNAMEW, DEFAULT_TEST_MODE, 1, MAX_FILESIZE, EFBIG}, 80b24ce8f6bcf315078bdc48bbddf780b964ffa59aCyril Hrubis#endif 81122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak}; 82354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao 8397a54fc064301f9fa23caa805284a83ad205219eZeng LinggangTCID_DEFINE(fallocate02); 8497a54fc064301f9fa23caa805284a83ad205219eZeng Linggangint TST_TOTAL = ARRAY_SIZE(test_data); 85fdce7d5e2a219d201a2b0e3bab6b61b01ec1d716Cyril Hrubis 8697a54fc064301f9fa23caa805284a83ad205219eZeng Linggangint main(int ac, char **av) 87122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak{ 8897a54fc064301f9fa23caa805284a83ad205219eZeng Linggang int lc; 8997a54fc064301f9fa23caa805284a83ad205219eZeng Linggang int i; 90bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 91d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis tst_parse_opts(ac, av, NULL, NULL); 92bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 9397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang setup(); 94122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 9597a54fc064301f9fa23caa805284a83ad205219eZeng Linggang for (lc = 0; TEST_LOOPING(lc); lc++) { 9697a54fc064301f9fa23caa805284a83ad205219eZeng Linggang 9797a54fc064301f9fa23caa805284a83ad205219eZeng Linggang tst_count = 0; 9897a54fc064301f9fa23caa805284a83ad205219eZeng Linggang 9997a54fc064301f9fa23caa805284a83ad205219eZeng Linggang for (i = 0; i < TST_TOTAL; i++) 10097a54fc064301f9fa23caa805284a83ad205219eZeng Linggang fallocate_verify(i); 10197a54fc064301f9fa23caa805284a83ad205219eZeng Linggang } 10297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang 10397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang cleanup(); 10497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang 10597a54fc064301f9fa23caa805284a83ad205219eZeng Linggang tst_exit(); 106122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak} 107122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 10897a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic void setup(void) 109122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak{ 11097a54fc064301f9fa23caa805284a83ad205219eZeng Linggang int i; 1112c28215423293e443469a07ae7011135d058b671Garrett Cooper 11297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang tst_sig(NOFORK, DEF_HANDLER, cleanup); 11356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 11456207cec7732e09c216c751c0b5f88a242bacae6subrata_modak TEST_PAUSE; 11556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 11656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak tst_tmpdir(); 11756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 11897a54fc064301f9fa23caa805284a83ad205219eZeng Linggang fdr = SAFE_OPEN(cleanup, FNAMER, O_RDONLY | O_CREAT, S_IRUSR); 11956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak 12097a54fc064301f9fa23caa805284a83ad205219eZeng Linggang fdw = SAFE_OPEN(cleanup, FNAMEW, O_RDWR | O_CREAT, S_IRWXU); 121122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 12297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang char buf[BLOCK_SIZE]; 12397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang memset(buf, 'A', BLOCK_SIZE); 12497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang for (i = 0; i < BLOCKS_WRITTEN; i++) 12597a54fc064301f9fa23caa805284a83ad205219eZeng Linggang SAFE_WRITE(cleanup, 1, fdw, buf, BLOCK_SIZE); 126122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak} 127bdbaec51a423e715c2b03ed9e497e9a1fba6103esubrata_modak 12897a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic void fallocate_verify(int i) 129122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak{ 13097a54fc064301f9fa23caa805284a83ad205219eZeng Linggang TEST(fallocate(*test_data[i].fd, test_data[i].mode, 13197a54fc064301f9fa23caa805284a83ad205219eZeng Linggang test_data[i].offset * BLOCK_SIZE, 13297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang test_data[i].len * BLOCK_SIZE)); 13397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang if (TEST_ERRNO != test_data[i].error) { 13497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang if (TEST_ERRNO == EOPNOTSUPP || 13597a54fc064301f9fa23caa805284a83ad205219eZeng Linggang TEST_ERRNO == ENOSYS) { 13697a54fc064301f9fa23caa805284a83ad205219eZeng Linggang tst_brkm(TCONF, cleanup, 13797a54fc064301f9fa23caa805284a83ad205219eZeng Linggang "fallocate system call is not implemented"); 13897a54fc064301f9fa23caa805284a83ad205219eZeng Linggang } 13997a54fc064301f9fa23caa805284a83ad205219eZeng Linggang tst_resm(TFAIL | TTERRNO, 14097a54fc064301f9fa23caa805284a83ad205219eZeng Linggang "fallocate(%s:%d, %d, %" PRId64 ", %" PRId64 ") " 14197a54fc064301f9fa23caa805284a83ad205219eZeng Linggang "failed, expected errno:%d", test_data[i].fname, 14297a54fc064301f9fa23caa805284a83ad205219eZeng Linggang *test_data[i].fd, test_data[i].mode, 14397a54fc064301f9fa23caa805284a83ad205219eZeng Linggang test_data[i].offset * BLOCK_SIZE, 14497a54fc064301f9fa23caa805284a83ad205219eZeng Linggang test_data[i].len * BLOCK_SIZE, test_data[i].error); 14597a54fc064301f9fa23caa805284a83ad205219eZeng Linggang } else { 14697a54fc064301f9fa23caa805284a83ad205219eZeng Linggang tst_resm(TPASS | TTERRNO, 14797a54fc064301f9fa23caa805284a83ad205219eZeng Linggang "fallocate(%s:%d, %d, %" PRId64 ", %" PRId64 ") " 14897a54fc064301f9fa23caa805284a83ad205219eZeng Linggang "returned %d", test_data[i].fname, *test_data[i].fd, 14997a54fc064301f9fa23caa805284a83ad205219eZeng Linggang test_data[i].mode, test_data[i].offset * BLOCK_SIZE, 15097a54fc064301f9fa23caa805284a83ad205219eZeng Linggang test_data[i].len * BLOCK_SIZE, TEST_ERRNO); 15156207cec7732e09c216c751c0b5f88a242bacae6subrata_modak } 152122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak} 153122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak 15497a54fc064301f9fa23caa805284a83ad205219eZeng Linggangstatic void cleanup(void) 155122c603f55a00c3bb7667ba8fdfd2a6cf83d9787subrata_modak{ 15697a54fc064301f9fa23caa805284a83ad205219eZeng Linggang if (fdw > 0) 15797a54fc064301f9fa23caa805284a83ad205219eZeng Linggang SAFE_CLOSE(NULL, fdw); 15897a54fc064301f9fa23caa805284a83ad205219eZeng Linggang if (fdr > 0) 15997a54fc064301f9fa23caa805284a83ad205219eZeng Linggang SAFE_CLOSE(NULL, fdr); 1602c28215423293e443469a07ae7011135d058b671Garrett Cooper 16197a54fc064301f9fa23caa805284a83ad205219eZeng Linggang tst_rmdir(); 162187f2519c2d28a773053eac796c8cb1c67439624Garrett Cooper} 163