From: Jakub Jermar <jermar@itbs.cz>

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; off<BFS_BSIZE; off+=BFS_DIRENT_SIZE) {
 			de = (struct bfs_dirent *)(bh->b_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;

_