Skip to content

Commit

Permalink
pwritev/pwritev01.c: add new testcase
Browse files Browse the repository at this point in the history
Test pwritev(2) with some basic functions.
Pwritev(2) should succeed to write the expected content of data and
the file offset is not changed after writing the file.

Signed-off-by: Xiao Yang <yangx.jy@cn.fujitsu.com>
Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
  • Loading branch information
yangx-jy authored and metan-ucw committed Dec 15, 2015
1 parent 1274a3c commit 4ca27ac
Show file tree
Hide file tree
Showing 9 changed files with 238 additions and 0 deletions.
1 change: 1 addition & 0 deletions configure.ac
Expand Up @@ -182,5 +182,6 @@ LTP_CHECK_IF_LINK
LTP_CHECK_KCMP
LTP_CHECK_KCMP_TYPE
LTP_CHECK_PREADV
LTP_CHECK_PWRITEV

AC_OUTPUT
23 changes: 23 additions & 0 deletions m4/ltp-pwritev.m4
@@ -0,0 +1,23 @@
dnl
dnl Copyright (c) 2015 Fujitsu Ltd.
dnl Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
dnl
dnl This program is free software; you can redistribute it and/or modify it
dnl under the terms of version 2 of the GNU General Public License as
dnl published by the Free Software Foundation.
dnl
dnl This program is distributed in the hope that it would be useful, but
dnl WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
dnl
dnl You should have received a copy of the GNU General Public License
dnl alone with this program.
dnl

dnl
dnl LTP_CHECK_PWRITEV
dnl ----------------------------
dnl
AC_DEFUN([LTP_CHECK_PWRITEV],[
AC_CHECK_FUNCS(pwritev,,)
])
2 changes: 2 additions & 0 deletions runtest/ltplite
Expand Up @@ -608,6 +608,8 @@ pwrite01_64 pwrite01_64
pwrite02_64 pwrite02_64
pwrite04_64 pwrite04_64

pwritev01 pwritev01

read01 read01
read02 read02
read03 read03
Expand Down
2 changes: 2 additions & 0 deletions runtest/stress.part3
Expand Up @@ -517,6 +517,8 @@ pwrite01_64 pwrite01_64
pwrite02_64 pwrite02_64
pwrite04_64 pwrite04_64

pwritev01 pwritev01

read01 read01
read02 read02
read03 read03
Expand Down
3 changes: 3 additions & 0 deletions runtest/syscalls
Expand Up @@ -813,6 +813,9 @@ pwrite01_64 pwrite01_64
pwrite02_64 pwrite02_64
pwrite04_64 pwrite04_64

pwritev01 pwritev01
pwritev01_64 pwritev01_64

quotactl01 quotactl01
quotactl02 quotactl02

Expand Down
2 changes: 2 additions & 0 deletions testcases/kernel/syscalls/.gitignore
Expand Up @@ -678,6 +678,8 @@
/pwrite/pwrite02_64
/pwrite/pwrite04
/pwrite/pwrite04_64
/pwritev/pwritev01
/pwritev/pwritev01_64
/quotactl/quotactl01
/quotactl/quotactl02
/read/read01
Expand Down
28 changes: 28 additions & 0 deletions testcases/kernel/syscalls/pwritev/Makefile
@@ -0,0 +1,28 @@
#
# Copyright (c) 2015 Fujitsu Ltd.
# Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
#
# 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.
#
#

top_srcdir ?= ../../../..

include $(top_srcdir)/include/mk/testcases.mk

include $(abs_srcdir)/../utils/newer_64.mk

%_64: CPPFLAGS += -D_FILE_OFFSET_BITS=64

include $(top_srcdir)/include/mk/generic_leaf_target.mk
31 changes: 31 additions & 0 deletions testcases/kernel/syscalls/pwritev/pwritev.h
@@ -0,0 +1,31 @@
/*
* Copyright (c) 2015 Fujitsu Ltd.
* Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU General Public License
* alone with this program.
*/

#ifndef PWRITEV_H
#define PWRITEV_H

#include <sys/types.h>
#include "config.h"
#include "linux_syscall_numbers.h"

#if !defined(HAVE_PWRITEV)
int pwritev(int fd, const struct iovec *iov, int iovcnt, off_t offset)
{
return ltp_syscall(__NR_pwritev, fd, iov, iovcnt, offset);
}
#endif

#endif /* PWRITEV_H */
146 changes: 146 additions & 0 deletions testcases/kernel/syscalls/pwritev/pwritev01.c
@@ -0,0 +1,146 @@
/*
* Copyright (c) 2015 Fujitsu Ltd.
* Author: Xiao Yang <yangx.jy@cn.fujitsu.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU General Public License
* alone with this program.
*/

/*
* Test Name: pwritev01
*
* Test Description:
* Testcase to check the basic functionality of the pwritev(2).
* pwritev(2) should succeed to write the expected content of data
* and after writing the file, the file offset is not changed.
*/

#include <errno.h>

#include "test.h"
#include "pwritev.h"
#include "safe_macros.h"

#define CHUNK 64

static char buf[CHUNK];
static char initbuf[CHUNK * 2];
static char preadbuf[CHUNK];
static int fd;

static struct iovec wr_iovec[] = {
{buf, CHUNK},
{NULL, 0},
};

static struct test_case_t {
int count;
off_t offset;
ssize_t size;
} tc[] = {
{1, 0, CHUNK},
{2, 0, CHUNK},
{1, CHUNK/2, CHUNK},
};

void verify_pwritev(struct test_case_t *);
void setup(void);
void cleanup(void);

char *TCID = "pwritev01";
int TST_TOTAL = ARRAY_SIZE(tc);

int main(int ac, char **av)
{
int lc;
int i;

tst_parse_opts(ac, av, NULL, NULL);

setup();

for (lc = 0; TEST_LOOPING(lc); lc++) {
tst_count = 0;

for (i = 0; i < TST_TOTAL; i++)
verify_pwritev(&tc[i]);
}
cleanup();
tst_exit();
}

void verify_pwritev(struct test_case_t *tc)
{
int i;

SAFE_PWRITE(cleanup, 1, fd, initbuf, sizeof(initbuf), 0);

SAFE_LSEEK(cleanup, fd, 0, SEEK_SET);

TEST(pwritev(fd, wr_iovec, tc->count, tc->offset));
if (TEST_RETURN < 0) {
tst_resm(TFAIL | TTERRNO, "Pwritev(2) failed");
return;
}

if (TEST_RETURN != tc->size) {
tst_resm(TFAIL, "Pwritev(2) write %li bytes, expected %li",
TEST_RETURN, tc->size);
return;
}

if (SAFE_LSEEK(cleanup, fd, 0, SEEK_CUR) != 0) {
tst_resm(TFAIL, "Pwritev(2) has changed file offset");
return;
}

SAFE_PREAD(cleanup, 1, fd, preadbuf, tc->size, tc->offset);

for (i = 0; i < tc->size; i++) {
if (preadbuf[i] != 0x61)
break;
}

if (i != tc->size) {
tst_resm(TFAIL, "Buffer wrong at %i have %02x expected 61",
i, preadbuf[i]);
return;
}

tst_resm(TPASS, "Pwritev(2) write %li bytes successfully "
"with content 'a' expectedly ", tc->size);
}

void setup(void)
{
if ((tst_kvercmp(2, 6, 30)) < 0) {
tst_brkm(TCONF, NULL, "This test can only run on kernels "
"that are 2.6.30 and higher");
}

tst_sig(NOFORK, DEF_HANDLER, cleanup);

TEST_PAUSE;

tst_tmpdir();

memset(&buf, 0x61, CHUNK);

fd = SAFE_OPEN(cleanup, "file", O_RDWR | O_CREAT, 0644);
}

void cleanup(void)
{
if (fd > 0 && close(fd))
tst_resm(TWARN | TERRNO, "Failed to close file");

tst_rmdir();
}

0 comments on commit 4ca27ac

Please sign in to comment.