patch-1.3.60 linux/fs/msdos/buffer.c
Next file: linux/fs/msdos/dir.c
Previous file: linux/fs/msdos/Makefile
Back to the patch index
Back to the overall index
- Lines: 151
- Date:
Thu Jan 1 02:00:00 1970
- Orig file:
v1.3.59/linux/fs/msdos/buffer.c
- Orig date:
Mon Nov 27 12:48:32 1995
diff -u --recursive --new-file v1.3.59/linux/fs/msdos/buffer.c linux/fs/msdos/buffer.c
@@ -1,150 +0,0 @@
-/*
- * linux/fs/msdos/buffer.c
- *
- *
- */
-
-#include <linux/mm.h>
-#include <linux/malloc.h>
-#include <linux/string.h>
-#include <linux/fs.h>
-#include <linux/msdos_fs.h>
-
-struct buffer_head *msdos_bread (
- struct super_block *sb,
- int block)
-{
- struct buffer_head *ret = NULL;
- if (sb->s_blocksize == 512){
- ret = bread (sb->s_dev,block,512);
- }else{
- struct buffer_head *real = bread (sb->s_dev,block>>1,1024);
- if (real != NULL){
- ret = (struct buffer_head *)kmalloc (sizeof(struct buffer_head)
- ,GFP_KERNEL);
- if (ret != NULL){
- /* #Specification: msdos / strategy / special device / dummy blocks
- Many special device (Scsi optical disk for one) use
- larger hardware sector size. This allows for higher
- capacity.
-
- Most of the time, the MsDOS file system that sit
- on this device is totally unaligned. It use logically
- 512 bytes sector size, with logical sector starting
- in the middle of a hardware block. The bad news is
- that a hardware sector may hold data own by two
- different files. This means that the hardware sector
- must be read, patch and written almost all the time.
-
- Needless to say that it kills write performance
- on all OS.
-
- Internally the linux msdos fs is using 512 bytes
- logical sector. When accessing such a device, we
- allocate dummy buffer cache blocks, that we stuff
- with the information of a real one (1k large).
-
- This strategy is used to hide this difference to
- the core of the msdos fs. The slowdown is not
- hidden though!
- */
- /*
- The memset is there only to catch errors. The msdos
- fs is only using b_data
- */
- memset (ret,0,sizeof(*ret));
- ret->b_data = real->b_data;
- if (block & 1) ret->b_data += 512;
- ret->b_next = real;
- }else{
- brelse (real);
- }
- }
- }
- return ret;
-}
-struct buffer_head *msdos_getblk (
- struct super_block *sb,
- int block)
-{
- struct buffer_head *ret = NULL;
- if (sb->s_blocksize == 512){
- ret = getblk (sb->s_dev,block,512);
- }else{
- /* #Specification: msdos / special device / writing
- A write is always preceded by a read of the complete block
- (large hardware sector size). This defeat write performance.
- There is a possibility to optimize this when writing large
- chunk by making sure we are filling large block. Volunteer ?
- */
- ret = msdos_bread (sb,block);
- }
- return ret;
-}
-
-void msdos_brelse (
- struct super_block *sb,
- struct buffer_head *bh)
-{
- if (bh != NULL){
- if (sb->s_blocksize == 512){
- brelse (bh);
- }else{
- brelse (bh->b_next);
- /* We can free the dummy because a new one is allocated at
- each msdos_getblk() and msdos_bread().
- */
- kfree (bh);
- }
- }
-}
-
-void msdos_mark_buffer_dirty (
- struct super_block *sb,
- struct buffer_head *bh,
- int dirty_val)
-{
- if (sb->s_blocksize != 512){
- bh = bh->b_next;
- }
- mark_buffer_dirty (bh,dirty_val);
-}
-
-void msdos_set_uptodate (
- struct super_block *sb,
- struct buffer_head *bh,
- int val)
-{
- if (sb->s_blocksize != 512){
- bh = bh->b_next;
- }
- mark_buffer_uptodate(bh, val);
-}
-int msdos_is_uptodate (
- struct super_block *sb,
- struct buffer_head *bh)
-{
- if (sb->s_blocksize != 512){
- bh = bh->b_next;
- }
- return buffer_uptodate(bh);
-}
-
-void msdos_ll_rw_block (
- struct super_block *sb,
- int opr,
- int nbreq,
- struct buffer_head *bh[32])
-{
- if (sb->s_blocksize == 512){
- ll_rw_block(opr,nbreq,bh);
- }else{
- struct buffer_head *tmp[32];
- int i;
- for (i=0; i<nbreq; i++){
- tmp[i] = bh[i]->b_next;
- }
- ll_rw_block(opr,nbreq,tmp);
- }
-}
-
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this