[LTP] Last NFSD update breaks nfsv4.2 copy_file_range

Murphy Zhou jencce.kernel@gmail.com
Tue Nov 10 05:18:45 CET 2020


Hi,

copy_file_range for NFSv4.2 is broke by this

commit 9f0b5792f07d8f0745c3620d577d6930ff2a96fd
Author: Anna Schumaker <Anna.Schumaker@Netapp.com>
Date:   Mon Sep 28 13:09:01 2020 -0400

    NFSD: Encode a full READ_PLUS reply


LTP copy_file_range01 repeats this failure:
copy_file_range01.c:144: TFAIL: file contents do not match

Revert this commit then the failure gone.

Attached simplified reproducer for your ref.

-- 
Murphy
-------------- next part --------------
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	int fd_in, fd_out;
	struct stat stat;
	loff_t len;
	ssize_t ret;
	char buf[2];
	loff_t in = 0, out, i2, o2, to_cp, copied;

	if (argc != 6) {
		fprintf(stderr, "Usage: %s <src> <dest> inoff outoff len\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	fd_in = open(argv[1], O_RDONLY);
	if (fd_in == -1) {
		perror("open (argv[1])");
		exit(EXIT_FAILURE);
	}

	fd_out = open(argv[2], O_CREAT|O_WRONLY|O_TRUNC|O_SYNC, 0644);
	if (fd_out == -1) {
		perror("open (argv[2])");
		exit(EXIT_FAILURE);
	}

	in = strtoul(argv[3], NULL, 0);
	out = strtoul(argv[4], NULL, 0);
	len = strtoul(argv[5], NULL, 0);
	i2 = in;
	o2 = out;
	to_cp = len;

	do {
		ret = copy_file_range(fd_in, &in, fd_out, &out, to_cp, 0);
		if (ret == -1) {
			perror("copy_file_range");
			exit(EXIT_FAILURE);
		}
		copied += ret;
		to_cp -= ret;
	} while (to_cp > 0 && ret > 0);

	close(fd_in);
	close(fd_out);
	sync();

	FILE *fp1, *fp2;
	int ch1, ch2, count = 0;

	fp1 = fopen(argv[1], "r");
	if (fseek(fp1, i2, SEEK_SET)) {
		perror("fseek fp1");
		exit(EXIT_FAILURE);
	}
	fp2 = fopen(argv[2], "r");
	if (fseek(fp2, o2, SEEK_SET)) {
		perror("fseek fp2");
		exit(EXIT_FAILURE);
	}

	do {
		ch1 = fgetc(fp1);
		ch2 = fgetc(fp2);
		count++;
	} while ((count < len) && (ch1 == ch2));
	fclose(fp1);
	fclose(fp2);

	if (ch1 != ch2) {
		printf("%d %d %d copied %d ch1 %c ch2 %c count %d file content corrupted\n", i2, o2, len, copied, ch1, ch2, count);
		return 1;
	}
	return 0;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: nfs_copy_range.sh
Type: application/x-sh
Size: 638 bytes
Desc: not available
URL: <http://lists.linux.it/pipermail/ltp/attachments/20201110/b17885bd/attachment.sh>


More information about the ltp mailing list