To: linux-m68k@lists.linux-m68k.org
Subject: L68K: 2.1.85
X-Yow: ..  Do you like ``TENDER VITTLES?''?
From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
Date: 09 Feb 1998 10:27:58 +0100
Sender: owner-linux-m68k@phil.uni-sb.de

And here are the usual patches :-)

Andreas.

----------------------------------------------------------------------
--- linux-2.1.85/arch/m68k/config.in.~1~	Fri Feb  6 20:26:12 1998
+++ linux-2.1.85/arch/m68k/config.in	Fri Feb  6 21:21:41 1998
@@ -61,6 +61,7 @@
 
 bool 'Networking support' CONFIG_NET
 bool 'System V IPC' CONFIG_SYSVIPC
+bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT
 bool 'Sysctl support' CONFIG_SYSCTL
 tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT
 tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
@@ -137,6 +138,9 @@
 if [ "$CONFIG_BLK_DEV_MD" = "y" ]; then
   tristate '   Linear (append) mode' CONFIG_MD_LINEAR
   tristate '   RAID-0 (striping) mode' CONFIG_MD_STRIPED
+fi
+if [ "$CONFIG_MD_LINEAR" = "y" -o "$CONFIG_MD_STRIPED" = "y" ]; then
+  bool '      Boot support (linear, striped)' CONFIG_MD_BOOT
 fi
 tristate 'RAM disk support' CONFIG_BLK_DEV_RAM
 if [ "$CONFIG_BLK_DEV_RAM" = "y" ]; then
--- linux-2.1.85/arch/m68k/kernel/ptrace.c.~1~	Sat Dec 20 00:59:44 1997
+++ linux-2.1.85/arch/m68k/kernel/ptrace.c	Wed Feb  4 19:57:10 1998
@@ -439,7 +439,7 @@
 			long tmp;
 
 			ret = -EIO;
-			if ((unsigned long) data >= _NSIG)
+			if ((unsigned long) data > _NSIG)
 				goto out;
 			if (request == PTRACE_SYSCALL)
 				child->flags |= PF_TRACESYS;
@@ -477,7 +477,7 @@
 			long tmp;
 
 			ret = -EIO;
-			if ((unsigned long) data >= _NSIG)
+			if ((unsigned long) data > _NSIG)
 				goto out;
 			child->flags &= ~PF_TRACESYS;
 			tmp = get_reg(child, PT_SR) | (TRACE_BITS << 16);
@@ -494,7 +494,7 @@
 			long tmp;
 
 			ret = -EIO;
-			if ((unsigned long) data >= _NSIG)
+			if ((unsigned long) data > _NSIG)
 				goto out;
 			child->flags &= ~(PF_PTRACED|PF_TRACESYS);
 			wake_up_process(child);
--- linux-2.1.85/drivers/scsi/sd.c.~1~	Wed Jan 14 21:40:28 1998
+++ linux-2.1.85/drivers/scsi/sd.c	Thu Jan 29 10:16:01 1998
@@ -91,7 +91,7 @@
 {
     if( disknum <= 26 )
     {
-        sprintf(buffer, "sd%c", 'a' + (disknum >> 4));
+        sprintf(buffer, "sd%c", 'a' + disknum);
     }
     else
     {
@@ -101,8 +101,8 @@
          * For larger numbers of disks, we need to go to a new
          * naming scheme.
          */
-        min1 = (disknum >> 4) / 26;
-        min2 = (disknum >> 4) % 26;
+        min1 = disknum / 26;
+        min2 = disknum % 26;
         sprintf(buffer, "sd%c%c", 'a' + min1, 'a' + min2);
     }
 }
@@ -677,7 +677,7 @@
 	goto repeat;
     }
 
-    sd_devname(devm, nbuff);
+    sd_devname(devm >> 4, nbuff);
     SCSI_LOG_HLQUEUE(2,printk("%s : real dev = /dev/%d, block = %d\n",
 	   nbuff, dev, block));
 
--- linux-2.1.85/fs/minix/bitmap.c.~1~	Fri Jan  9 18:14:34 1998
+++ linux-2.1.85/fs/minix/bitmap.c	Fri Jan 23 22:32:20 1998
@@ -36,16 +36,17 @@
 
 	if (numblocks==0 || !(bh=map[numblocks-1]))
 		return(0);
-	i = (numbits-(numblocks-1)*BLOCK_SIZE*8)/8;
+	i = ((numbits-(numblocks-1)*BLOCK_SIZE*8)/16)*2;
 	for (j=0; j<i; j++) {
 		sum += nibblemap[bh->b_data[j] & 0xf]
 			+ nibblemap[(bh->b_data[j]>>4) & 0xf];
 	}
 
-	i = numbits%8;
+	i = numbits%16;
 	if (i!=0) {
-		i = bh->b_data[j] | ~((1<<i) - 1);
+		i = *(__u16 *)(&bh->b_data[j]) | ~((1<<i) - 1);
 		sum += nibblemap[i & 0xf] + nibblemap[(i>>4) & 0xf];
+		sum += nibblemap[(i>>8) & 0xf] + nibblemap[(i>>12) & 0xf];
 	}
 	return(sum);
 }
@@ -71,11 +72,11 @@
 	zone = block - sb->u.minix_sb.s_firstdatazone + 1;
 	bit = zone & 8191;
 	zone >>= 13;
-	bh = sb->u.minix_sb.s_zmap[zone];
-	if (!bh) {
+	if (zone >= sb->u.minix_sb.s_zmap_blocks) {
 		printk("minix_free_block: nonexistent bitmap buffer\n");
 		return;
 	}
+	bh = sb->u.minix_sb.s_zmap[zone];
 	if (!minix_clear_bit(bit,bh->b_data))
 		printk("free_block (%s:%d): bit already cleared\n",
 		       kdevname(sb->s_dev), block);
@@ -94,11 +95,13 @@
 	}
 repeat:
 	j = 8192;
-	for (i=0 ; i<64 ; i++)
-		if ((bh=sb->u.minix_sb.s_zmap[i]) != NULL)
-			if ((j=minix_find_first_zero_bit(bh->b_data, 8192)) < 8192)
-				break;
-	if (i>=64 || !bh || j>=8192)
+	bh = NULL;
+	for (i = 0; i < sb->u.minix_sb.s_zmap_blocks; i++) {
+		bh = sb->u.minix_sb.s_zmap[i];
+		if ((j = minix_find_first_zero_bit(bh->b_data, 8192)) < 8192)
+			break;
+	}
+	if (!bh || j >= 8192)
 		return 0;
 	if (minix_set_bit(j,bh->b_data)) {
 		printk("new_block: bit already set");
@@ -134,7 +137,7 @@
 	int ino, block;
 
 	ino = inode->i_ino;
-	if (!ino || ino >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {
 		printk("Bad inode number on dev %s: %d is out of range\n",
 		       kdevname(inode->i_dev), ino);
 		return 0;
@@ -162,7 +165,7 @@
 	int ino, block;
 
 	ino = inode->i_ino;
-	if (!ino || ino >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {
 		printk("Bad inode number on dev %s: %d is out of range\n",
 		       kdevname(inode->i_dev), ino);
 		return 0;
@@ -218,15 +221,16 @@
 		printk("free_inode: inode on nonexistent device\n");
 		return;
 	}
-	if (inode->i_ino < 1 || inode->i_ino >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (inode->i_ino < 1 || inode->i_ino > inode->i_sb->u.minix_sb.s_ninodes) {
 		printk("free_inode: inode 0 or nonexistent inode\n");
 		return;
 	}
 	ino = inode->i_ino;
-	if (!(bh=inode->i_sb->u.minix_sb.s_imap[ino >> 13])) {
+	if ((ino >> 13) >= inode->i_sb->u.minix_sb.s_imap_blocks) {
 		printk("free_inode: nonexistent imap in superblock\n");
 		return;
 	}
+	bh = inode->i_sb->u.minix_sb.s_imap[ino >> 13];
 	minix_clear_inode(inode);
 	clear_inode(inode);
 	if (!minix_clear_bit(ino & 8191, bh->b_data))
@@ -247,10 +251,12 @@
 	inode->i_sb = sb;
 	inode->i_flags = inode->i_sb->s_flags;
 	j = 8192;
-	for (i=0 ; i<8 ; i++)
-		if ((bh = inode->i_sb->u.minix_sb.s_imap[i]) != NULL)
-			if ((j=minix_find_first_zero_bit(bh->b_data, 8192)) < 8192)
-				break;
+	bh = NULL;
+	for (i = 0; i < sb->u.minix_sb.s_imap_blocks; i++) {
+		bh = inode->i_sb->u.minix_sb.s_imap[i];
+		if ((j = minix_find_first_zero_bit(bh->b_data, 8192)) < 8192)
+			break;
+	}
 	if (!bh || j >= 8192) {
 		iput(inode);
 		return NULL;
@@ -262,7 +268,7 @@
 	}
 	mark_buffer_dirty(bh, 1);
 	j += i*8192;
-	if (!j || j >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (!j || j > inode->i_sb->u.minix_sb.s_ninodes) {
 		iput(inode);
 		return NULL;
 	}
--- linux-2.1.85/fs/minix/inode.c.~1~	Fri Feb  6 20:28:52 1998
+++ linux-2.1.85/fs/minix/inode.c	Wed Feb  4 20:19:27 1998
@@ -64,9 +64,9 @@
 		sb->u.minix_sb.s_ms->s_state = sb->u.minix_sb.s_mount_state;
 		mark_buffer_dirty(sb->u.minix_sb.s_sbh, 1);
 	}
-	for(i = 0 ; i < MINIX_I_MAP_SLOTS ; i++)
+	for (i = 0; i < sb->u.minix_sb.s_imap_blocks; i++)
 		brelse(sb->u.minix_sb.s_imap[i]);
-	for(i = 0 ; i < MINIX_Z_MAP_SLOTS ; i++)
+	for (i = 0; i < sb->u.minix_sb.s_zmap_blocks; i++)
 		brelse(sb->u.minix_sb.s_zmap[i]);
 	brelse (sb->u.minix_sb.s_sbh);
 	kfree(sb->u.minix_sb.s_imap);
@@ -175,7 +175,8 @@
 	const char * errmsg;
 	struct inode *root_inode;
 	
-	/* N.B. These should be compile-time tests */
+	/* N.B. These should be compile-time tests.
+	   Unfortunately that is impossible. */
 	if (32 != sizeof (struct minix_inode))
 		panic("bad V1 i-node size");
 	if (64 != sizeof(struct minix2_inode))
@@ -205,33 +206,37 @@
 		s->u.minix_sb.s_version = MINIX_V1;
 		s->u.minix_sb.s_dirsize = 16;
 		s->u.minix_sb.s_namelen = 14;
+		s->u.minix_sb.s_link_max = MINIX_LINK_MAX;
 	} else if (s->s_magic == MINIX_SUPER_MAGIC2) {
 		s->u.minix_sb.s_version = MINIX_V1;
 		s->u.minix_sb.s_dirsize = 32;
 		s->u.minix_sb.s_namelen = 30;
+		s->u.minix_sb.s_link_max = MINIX_LINK_MAX;
 	} else if (s->s_magic == MINIX2_SUPER_MAGIC) {
 		s->u.minix_sb.s_version = MINIX_V2;
+		s->u.minix_sb.s_nzones = ms->s_zones;
 		s->u.minix_sb.s_dirsize = 16;
 		s->u.minix_sb.s_namelen = 14;
+		s->u.minix_sb.s_link_max = MINIX2_LINK_MAX;
 	} else if (s->s_magic == MINIX2_SUPER_MAGIC2) {
 		s->u.minix_sb.s_version = MINIX_V2;
+		s->u.minix_sb.s_nzones = ms->s_zones;
 		s->u.minix_sb.s_dirsize = 32;
 		s->u.minix_sb.s_namelen = 30;
+		s->u.minix_sb.s_link_max = MINIX2_LINK_MAX;
 	} else
 		goto out_no_fs;
 
-	if (s->u.minix_sb.s_zmap_blocks > MINIX_Z_MAP_SLOTS)
-		goto out_too_big;
 	/*
 	 * Allocate the buffer map to keep the superblock small.
 	 */
-	i = (MINIX_I_MAP_SLOTS + MINIX_Z_MAP_SLOTS) * sizeof(bh);
+	i = (s->u.minix_sb.s_imap_blocks + s->u.minix_sb.s_zmap_blocks) * sizeof(bh);
 	map = kmalloc(i, GFP_KERNEL);
 	if (!map)
 		goto out_no_map;
 	memset(map, 0, i);
 	s->u.minix_sb.s_imap = &map[0];
-	s->u.minix_sb.s_zmap = &map[MINIX_I_MAP_SLOTS];
+	s->u.minix_sb.s_zmap = &map[s->u.minix_sb.s_imap_blocks];
 
 	block=2;
 	for (i=0 ; i < s->u.minix_sb.s_imap_blocks ; i++) {
@@ -244,8 +249,6 @@
 			goto out_no_bitmap;
 		block++;
 	}
-	if (block != 2+s->u.minix_sb.s_imap_blocks+s->u.minix_sb.s_zmap_blocks)
-		goto out_no_bitmap;
 
 	minix_set_bit(0,s->u.minix_sb.s_imap[0]->b_data);
 	minix_set_bit(0,s->u.minix_sb.s_zmap[0]->b_data);
@@ -265,6 +268,8 @@
 	if (!s->s_root)
 		goto out_iput;
 
+	s->s_root->d_op = &minix_dentry_operations;
+
 	if (!(s->s_flags & MS_RDONLY)) {
 		ms->s_state &= ~MINIX_VALID_FS;
 		mark_buffer_dirty(bh, 1);
@@ -294,9 +299,9 @@
 out_no_bitmap:
 	printk("MINIX-fs: bad superblock or unable to read bitmaps\n");
     out_freemap:
-	for(i=0;i<MINIX_I_MAP_SLOTS;i++)
+	for (i = 0; i < s->u.minix_sb.s_imap_blocks; i++)
 		brelse(s->u.minix_sb.s_imap[i]);
-	for(i=0;i<MINIX_Z_MAP_SLOTS;i++)
+	for (i = 0; i < s->u.minix_sb.s_zmap_blocks; i++)
 		brelse(s->u.minix_sb.s_zmap[i]);
 	kfree(s->u.minix_sb.s_imap);
 	goto out_release;
@@ -306,11 +311,6 @@
 		printk ("MINIX-fs: can't allocate map\n");
 	goto out_release;
 
-out_too_big:
-	if (!silent)
-		printk ("MINIX-fs: filesystem too big\n");
-	goto out_release;
-
 out_no_fs:
 	if (!silent)
 		printk("VFS: Can't find a minix or minix V2 filesystem on dev "
@@ -731,7 +731,7 @@
 	ino = inode->i_ino;
 	inode->i_op = NULL;
 	inode->i_mode = 0;
-	if (!ino || ino >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {
 		printk("Bad inode number on dev %s"
 		       ": %d is out of range\n",
 			kdevname(inode->i_dev), ino);
@@ -785,7 +785,7 @@
 	ino = inode->i_ino;
 	inode->i_op = NULL;
 	inode->i_mode = 0;
-	if (!ino || ino >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {
 		printk("Bad inode number on dev %s"
 		       ": %d is out of range\n",
 			kdevname(inode->i_dev), ino);
@@ -850,7 +850,7 @@
 	int ino, block;
 
 	ino = inode->i_ino;
-	if (!ino || ino >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {
 		printk("Bad inode number on dev %s"
 		       ": %d is out of range\n",
 			kdevname(inode->i_dev), ino);
@@ -888,7 +888,7 @@
 	int ino, block;
 
 	ino = inode->i_ino;
-	if (!ino || ino >= inode->i_sb->u.minix_sb.s_ninodes) {
+	if (!ino || ino > inode->i_sb->u.minix_sb.s_ninodes) {
 		printk("Bad inode number on dev %s"
 		       ": %d is out of range\n",
 			kdevname(inode->i_dev), ino);
--- linux-2.1.85/fs/minix/namei.c.~1~	Fri Jan 23 23:37:36 1998
+++ linux-2.1.85/fs/minix/namei.c	Thu Feb  5 14:06:25 1998
@@ -48,10 +48,13 @@
 	if (!dir || !dir->i_sb)
 		return NULL;
 	info = &dir->i_sb->u.minix_sb;
+	if (namelen > info->s_namelen) {
 #ifdef NO_TRUNCATE
-	if (namelen > info->s_namelen)
 		return NULL;
+#else
+		namelen = info->s_namelen;
 #endif
+	}
 	bh = NULL;
 	block = offset = 0;
 	while (block*BLOCK_SIZE+offset < dir->i_size) {
@@ -161,10 +164,13 @@
 	if (!dir || !dir->i_sb)
 		return -ENOENT;
 	info = &dir->i_sb->u.minix_sb;
+	if (namelen > info->s_namelen) {
 #ifdef NO_TRUNCATE
-	if (namelen > info->s_namelen)
 		return -ENAMETOOLONG;
+#else
+		namelen = info->s_namelen;
 #endif
+	}
 	if (!namelen)
 		return -ENOENT;
 	bh = NULL;
@@ -308,7 +314,7 @@
 		brelse(bh);
 		return -EEXIST;
 	}
-	if (dir->i_nlink >= MINIX_LINK_MAX)
+	if (dir->i_nlink >= info->s_link_max)
 		return -EMLINK;
 	inode = minix_new_inode(dir);
 	if (!inode)
@@ -585,7 +591,7 @@
 	if (S_ISDIR(inode->i_mode))
 		return -EPERM;
 
-	if (inode->i_nlink >= MINIX_LINK_MAX)
+	if (inode->i_nlink >= inode->i_sb->u.minix_sb.s_link_max)
 		return -EMLINK;
 
 	bh = minix_find_entry(dir, dentry->d_name.name,
@@ -611,24 +617,6 @@
 	return 0;
 }
 
-static int subdir(struct dentry * new_dentry, struct dentry * old_dentry)
-{
-	int result = 0;
-
-	for (;;) {
-		if (new_dentry != old_dentry) {
-			struct dentry * parent = new_dentry->d_parent;
-			if (parent == new_dentry)
-				break;
-			new_dentry = parent;
-			continue;
-		}
-		result = 1;
-		break;
-	}
-	return result;
-}
-
 #define PARENT_INO(buffer) \
 (((struct minix_dir_entry *) ((buffer)+info->s_dirsize))->inode)
 
@@ -691,7 +679,7 @@
 		if (!S_ISDIR(old_inode->i_mode))
 			goto end_rename;
 		retval = -EINVAL;
-		if (subdir(new_dentry, old_dentry))
+		if (is_subdir(new_dentry, old_dentry))
 			goto end_rename;
 		retval = -ENOTEMPTY;
 		if (!empty_dir(new_inode))
@@ -710,7 +698,7 @@
 		if (new_inode && !S_ISDIR(new_inode->i_mode))
 			goto end_rename;
 		retval = -EINVAL;
-		if (subdir(new_dentry, old_dentry))
+		if (is_subdir(new_dentry, old_dentry))
 			goto end_rename;
 		retval = -EIO;
 		dir_bh = minix_bread(old_inode,0,0);
@@ -719,7 +707,7 @@
 		if (PARENT_INO(dir_bh->b_data) != old_dir->i_ino)
 			goto end_rename;
 		retval = -EMLINK;
-		if (!new_inode && new_dir->i_nlink >= MINIX_LINK_MAX)
+		if (!new_inode && new_dir->i_nlink >= info->s_link_max)
 			goto end_rename;
 	}
 	if (!new_bh) {
--- linux-2.1.85/include/linux/minix_fs.h.~1~	Fri Jan  9 21:31:23 1998
+++ linux-2.1.85/include/linux/minix_fs.h	Fri Jan 23 23:57:41 1998
@@ -15,6 +15,7 @@
 
 /* Not the same as the bogus LINK_MAX in <linux/limits.h>. Oh well. */
 #define MINIX_LINK_MAX	250
+#define MINIX2_LINK_MAX	65530
 
 #define MINIX_I_MAP_SLOTS	8
 #define MINIX_Z_MAP_SLOTS	64
--- linux-2.1.85/include/linux/minix_fs_sb.h.~1~	Fri Feb  6 20:30:12 1998
+++ linux-2.1.85/include/linux/minix_fs_sb.h	Wed Feb  4 19:30:01 1998
@@ -12,8 +12,9 @@
 			unsigned long s_firstdatazone;
 			unsigned long s_log_zone_size;
 			unsigned long s_max_size;
-			unsigned long s_dirsize;
-			unsigned long s_namelen;
+			int s_dirsize;
+			int s_namelen;
+			int s_link_max;
 			struct buffer_head ** s_imap;
 			struct buffer_head ** s_zmap;
 			struct buffer_head * s_sbh;
