lkml.org 
[lkml]   [1996]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: pre 2.0.5 2.0.6 hang with /dev/fd0
Alex Gitelman:

: pre 2.0.5 and 2.0.6 always hang then I mount /dev/fd0 with minix
: and try to delete some files. File created by touch was deleted but
: files of biger size cause hang. No messages - just total freezing.
: 2.0.4 - OK.

Yes. The problem is a mix-up between signed and unsigned variables.
It was triggered by the change

diff -u --recursive --new-file pre2.0.4/linux/include/linux/fs.h linux/include/\linux/fs.h
--- pre2.0.4/linux/include/linux/fs.h Wed May 15 11:01:15 1996
+++ linux/include/linux/fs.h Fri May 17 15:05:01 1996
@@ -272,7 +272,7 @@
uid_t i_uid;
gid_t i_gid;
kdev_t i_rdev;
- off_t i_size;
+ unsigned long i_size;
time_t i_atime;
time_t i_mtime;
time_t i_ctime;
and what actually goes wrong is the code

repeat:
for (i = INDIRECT_BLOCK(offset) ; i < 512 ; i++) {
if (i < 0)
i = 0;
if (i < INDIRECT_BLOCK(offset))
goto repeat;
in minix/truncate.c. The above patch made INDIRECT_BLOCK(offset)
unsigned, and when it is negative we have a loop.

When I first noticed this loop I fixed minix/truncate.c by adding
a cast:

#define DIRECT_BLOCK (((off_t) inode->i_size + 1023) >> 10)

but maybe it is better to revert the above patch on fs.h.
I don't know why it was made (to allow 2TB files instead of 1TB ones?)
but it is too dangerous to make such changes just before 2.0.

Andries


\
 
 \ /
  Last update: 2005-03-22 13:37    [W:0.072 / U:1.764 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site