From: Jakub Jermar I found out that BFS filesystem will eventually try to read and interpret garbage past the end of directory in bfs_add_entry(). If the garbage (interpreted as i-node number) is not set to zero (does it have to be?) bfs_add_entry() will consider it a regular directory entry. This causes weird things like this: # touch a # rm a # ls # touch b # ls a My patch detects an attempt to read past the end of directory and explicitly clears the garbage that represents i-node number. Thus the correct behaviour is achieved. --- 25-akpm/fs/bfs/dir.c | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) diff -puN fs/bfs/dir.c~bfs-filesystem-read-past-the-end-of-dir fs/bfs/dir.c --- 25/fs/bfs/dir.c~bfs-filesystem-read-past-the-end-of-dir Tue May 4 18:05:28 2004 +++ 25-akpm/fs/bfs/dir.c Tue May 4 18:05:28 2004 @@ -274,7 +274,7 @@ static int bfs_add_entry(struct inode * { struct buffer_head * bh; struct bfs_dirent * de; - int block, sblock, eblock, off; + int block, sblock, eblock, off, eoff; int i; dprintf("name=%s, namelen=%d\n", name, namelen); @@ -286,12 +286,17 @@ static int bfs_add_entry(struct inode * sblock = BFS_I(dir)->i_sblock; eblock = BFS_I(dir)->i_eblock; + eoff = dir->i_size % BFS_BSIZE; for (block=sblock; block<=eblock; block++) { bh = sb_bread(dir->i_sb, block); if(!bh) return -ENOSPC; for (off=0; offb_data + off); + if (block==eblock && off>=eoff) { + /* Do not read/interpret the garbage in the end of eblock. */ + de->ino = 0; + } if (!de->ino) { if ((block-sblock)*BFS_BSIZE + off >= dir->i_size) { dir->i_size += BFS_DIRENT_SIZE; _