diff -urN -X dontdiff linux/Documentation/Configure.help 2325-bfs/Documentation/Configure.help
--- linux/Documentation/Configure.help Fri Oct 29 21:19:49 1999
+++ 2325-bfs/Documentation/Configure.help Wed Nov 3 12:05:45 1999
@@ -7970,14 +7970,16 @@
compiled as a module, and so this could be dangerous. Most everyone
wants to say Y here.
-SCO UnixWare BFS Support
+SCO UnixWare BFS Support (EXPERIMENTAL)
CONFIG_BFS_FS
Boot Filesystem (BFS) is a filesystem used under SCO UnixWare to
allow bootloader access the kernel image and other important files
during the boot process. It is usually mounted under /stand and
corresponds to the slice marked as "STAND" in the UnixWare
partition. This is useful if you want to access files on your /stand
- slice from Linux. If you don't know what it is, say N.
+ slice from Linux. More information on this filesystem can be found in
+ Documentation/filesystems/bfs.txt file. If you do not know what it is,
+ say N.
If you want to compile this as a module ( = code which can be
inserted in and removed from the running kernel whenever you want),
diff -urN -X dontdiff linux/Documentation/filesystems/bfs.txt 2325-bfs/Documentation/filesystems/bfs.txt
--- linux/Documentation/filesystems/bfs.txt Thu Oct 28 22:45:16 1999
+++ 2325-bfs/Documentation/filesystems/bfs.txt Wed Nov 3 12:09:54 1999
@@ -1,8 +1,13 @@
The BFS filesystem is used on SCO UnixWare machines for /stand slice.
-There are no special mount options supported by bfs at this time.
-You can mount it only read-only at this stage. Even if you attempt to
-mount it read-write it will be automatically mounted read-only, unless
-you have enabled "BFS write support" when configuring the kernel.
+By default, if you attempt to mount it read-write it will be automatically
+mounted read-only. If you want to enable (limited) write support, you need
+to select "BFS write support" when configuring the kernel. The write support
+at this stage is limited to the blocks preallocated for a given inode.
+This means that writes beyond the value of inode->iu_eblock will fail with EIO.
+In particular, this means you can create empty files but not write data to them
+or you can write data to the existing files and increase their size but not the
+number of blocks allocated to them. I am currently working on removing this
+limitation, i.e. ability to migrate inodes within BFS filesystem.
In order to access /stand partition under Linux you obviously need to
know the partition number and the kernel must support UnixWare disk slices
diff -urN -X dontdiff linux/fs/Config.in 2325-bfs/fs/Config.in
--- linux/fs/Config.in Thu Oct 28 22:45:16 1999
+++ 2325-bfs/fs/Config.in Tue Nov 2 15:49:20 1999
@@ -14,6 +14,12 @@
tristate 'Amiga FFS filesystem support' CONFIG_AFFS_FS
tristate 'Apple Macintosh filesystem support (EXPERIMENTAL)' CONFIG_HFS_FS
# msdos filesystems
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+ tristate 'BFS filesystem (read only) support (EXPERIMENTAL)' CONFIG_BFS_FS
+ if [ "$CONFIG_BFS_FS" != "n" ]; then
+ bool ' BFS filesystem write support (DANGEROUS)' CONFIG_BFS_FS_WRITE
+ fi
+fi
tristate 'DOS FAT fs support' CONFIG_FAT_FS
dep_tristate ' MSDOS fs support' CONFIG_MSDOS_FS $CONFIG_FAT_FS
dep_tristate ' UMSDOS: Unix-like filesystem on top of standard MSDOS filesystem' CONFIG_UMSDOS_FS $CONFIG_MSDOS_FS
@@ -58,12 +64,6 @@
fi
tristate 'ROM filesystem support' CONFIG_ROMFS_FS
tristate 'Second extended fs support' CONFIG_EXT2_FS
-if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
- tristate 'BFS filesystem (read only) support (EXPERIMENTAL)' CONFIG_BFS_FS
- if [ "$CONFIG_BFS_FS" != "n" ]; then
- bool ' BFS filesystem write support (DANGEROUS)' CONFIG_BFS_FS_WRITE
- fi
-fi
tristate 'System V and Coherent filesystem support' CONFIG_SYSV_FS
if [ "$CONFIG_SYSV_FS" != "n" -a "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool ' SYSV filesystem write support (DANGEROUS)' CONFIG_SYSV_FS_WRITE
diff -urN -X dontdiff linux/fs/bfs/dir.c 2325-bfs/fs/bfs/dir.c
--- linux/fs/bfs/dir.c Fri Oct 29 19:05:08 1999
+++ 2325-bfs/fs/bfs/dir.c Tue Nov 2 15:48:25 1999
@@ -51,7 +51,7 @@
while (f->f_pos < dir->i_size) {
offset = f->f_pos & (BFS_BSIZE-1);
- block = dir->iu_sblock + f->f_pos/BFS_BSIZE;
+ block = dir->iu_sblock + (f->f_pos >> BFS_BSIZE_BITS);
bh = bread(dev, block, BFS_BSIZE);
if (!bh) {
f->f_pos += BFS_BSIZE - offset;
diff -urN -X dontdiff linux/fs/bfs/file.c 2325-bfs/fs/bfs/file.c
--- linux/fs/bfs/file.c Thu Oct 28 22:45:16 1999
+++ 2325-bfs/fs/bfs/file.c Wed Nov 3 13:43:43 1999
@@ -41,14 +41,14 @@
static int bfs_get_block(struct inode * inode, long block,
struct buffer_head * bh_result, int create)
{
- if (!create) {
+ long phys = inode->iu_sblock + block;
+ if (!create || phys <= inode->iu_eblock) {
bh_result->b_dev = inode->i_dev;
- bh_result->b_blocknr = inode->iu_sblock + block;
+ bh_result->b_blocknr = phys;
bh_result->b_state |= (1UL << BH_Mapped);
return 0;
- } else
- DBG(KERN_ERR "BFS-fs: %s(create=%d) impossible!\n",
- __FUNCTION__, create);
+ }
+ /* no support for file migration, working on it */
return -EIO;
}