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