From mboxrd@z Thu Jan 1 00:00:00 1970
From: bugzilla-daemon@bugzilla.kernel.org
Subject: [Bug 50981] New: ext4 : DATA CORRUPTION read and write on same 4096
page range
Date: Sun, 25 Nov 2012 16:31:58 +0000 (UTC)
Message-ID:
Mime-Version: 1.0
Content-Type: text/plain; charset="UTF-8"
To: linux-ext4@vger.kernel.org
Return-path:
Received: from mail.kernel.org ([198.145.19.201]:47310 "EHLO mail.kernel.org"
rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP
id S1753111Ab2KYQcD (ORCPT );
Sun, 25 Nov 2012 11:32:03 -0500
Received: from mail.kernel.org (localhost [127.0.0.1])
by mail.kernel.org (Postfix) with ESMTP id 7C906201C1
for ; Sun, 25 Nov 2012 16:32:01 +0000 (UTC)
Received: from bugzilla.kernel.org (bugzilla.kernel.org [198.145.19.217])
by mail.kernel.org (Postfix) with ESMTP id 368D9201BC
for ; Sun, 25 Nov 2012 16:32:00 +0000 (UTC)
Sender: linux-ext4-owner@vger.kernel.org
List-ID:
https://bugzilla.kernel.org/show_bug.cgi?id=50981
Summary: ext4 : DATA CORRUPTION read and write on same 4096
page range
Product: File System
Version: 2.5
Kernel Version: 2.6.32 Red Hat Enterprise Linux Workstation release
6.2 (Santiago)
Platform: All
OS/Version: Linux
Tree: Mainline
Status: NEW
Severity: high
Priority: P1
Component: ext4
AssignedTo: fs_ext4@kernel-bugs.osdl.org
ReportedBy: meetmehiro@gmail.com
Regression: No
Kernal version and Red hat
2.6.32 , Red Hat Enterprise Linux Workstation release 6.2 (Santiago)
I have one scientific application, that is running on ext4 , after three to
fours days, I have started to seen that data is not correct.. then i tried to
find simple reproducer for the same.
Pl. find the reproducer for the same with this issue is hitting easily.
Logs :
./sim ext4_write
creating the threads
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
reader thread has opened the file, fd : 4
reader..checking data integrity
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
reader..checking data integrity
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
reader..checking data integrity
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
reader..checking data integrity
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
reader..checking data integrity
writing B at offset 0...
writing A at offset 0...
reader..checking data integrity
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
reader..checking data integrity
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
writing B at offset 0...
writing A at offset 0...
writing B at offset 0...
reader..checking data integrity
writing A at offset 0...
reader.. corrupted data, at offset : 511
writing B at offset 0...
C program :
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
pthread_t reader_id, writer_id;
char write_buf [4096] = {0,};
char read_buf[4096] = {0,};
char datafile[256] = {0,};
int stop_write = 0;
void * writer (void * arg)
{
int fd = -1;
int count = 0;
/* this thread will open the file and write 4k data to it alternatively
* of a different data set to the same offset
*/
/* opening the file */
assert((fd = open(datafile, O_CREAT|O_RDWR, 0777)) != -1);
while (1) {
if (stop_write)
{
close(fd);
printf("write stopped\n");
return NULL;
}
if (count % 2 == 0)
memset(write_buf, 'A', sizeof(write_buf));
else
memset(write_buf, 'B', sizeof(write_buf));
assert(lseek(fd, 0, SEEK_SET) == 0);
printf("writing %c at offset 0...\n", write_buf[0]);
assert(write(fd, write_buf, 4096) == 4096);
count ++;
}
//pthread_exit((void *)0);
close(fd);
return NULL;
}
void * reader(void * arg)
{
int fd = -1;
int count = 0;
/* this thread will open the file and write 4k data to it alternatively
* of a different data set to the same offset
*/
/* opening the file */
assert((fd = open(datafile, O_CREAT|O_RDWR, 0777)) != -1);
printf("reader thread has opened the file, fd : %d\n", fd);
while (1) {
memset(read_buf, '\0', 4096);
assert(lseek(fd, 0, SEEK_SET) == 0);
assert(read(fd, read_buf, 4096) == 4096);
count ++;
printf("reader..checking data integrity\n");
int i=0;
for (i=0; i < 4095; i++)
{
int prev_char = read_buf[i];
int next_char = read_buf[i+1];
if (prev_char != next_char)
{
printf("reader.. corrupted data, at offset :
%d\n", i);
stop_write = 1;
int output_fd = open("res.txt", O_CREAT|O_RDWR,
0777);
assert(write(output_fd, read_buf, 4096) ==
4096);
close(output_fd);
close(fd);
return NULL;
}
}
}
//pthread_exit((void *)0);
close(fd);
return NULL;
}
int main (int argc, char *argv[])
{
pthread_attr_t attr;
void * arg = NULL;
int *status;
int err = 0;
if (argc != 2) {
printf("usage : ./reader_writer \n");
exit(1);
}
memset(datafile, '\0', sizeof(datafile));
strcpy(datafile, argv[1]);
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
/* create the reader and writer thread */
printf("creating the threads\n");
if ((err = pthread_create(&writer_id, &attr, writer, (void *)arg)) !=
0) {
printf ("pthread_create failed err no :%d\n", err);
}
if ((err = pthread_create(&reader_id, &attr, reader, (void *)arg)) !=
0) {
printf ("pthread_create failed err no :%d\n", err);
}
pthread_attr_destroy(&attr);
/* Wait on the other threads */
assert(pthread_join(writer_id, (void *)&status) == 0);
assert(pthread_join(reader_id, (void *)&status) == 0);
pthread_exit(NULL);
}
How to run
gcc program.c -o ext4_program -lpthread
./ext4_program ext4_write
--
Configure bugmail: https://bugzilla.kernel.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are watching the assignee of the bug.