patch-2.4.5 linux/fs/block_dev.c
Next file: linux/fs/buffer.c
Previous file: linux/fs/binfmt_elf.c
Back to the patch index
Back to the overall index
- Lines: 127
- Date:
Tue May 22 09:35:42 2001
- Orig file:
v2.4.4/linux/fs/block_dev.c
- Orig date:
Fri Feb 9 11:29:44 2001
diff -u --recursive --new-file v2.4.4/linux/fs/block_dev.c linux/fs/block_dev.c
@@ -31,7 +31,7 @@
ssize_t block, blocks;
loff_t offset;
ssize_t chars;
- ssize_t written;
+ ssize_t written, retval;
struct buffer_head * bhlist[NBUF];
size_t size;
kdev_t dev = inode->i_rdev;
@@ -41,7 +41,7 @@
if (is_read_only(dev))
return -EPERM;
- written = write_error = buffercount = 0;
+ retval = written = write_error = buffercount = 0;
blocksize = BLOCK_SIZE;
if (blksize_size[MAJOR(dev)] && blksize_size[MAJOR(dev)][MINOR(dev)])
blocksize = blksize_size[MAJOR(dev)][MINOR(dev)];
@@ -61,8 +61,10 @@
else
size = INT_MAX;
while (count>0) {
- if (block >= size)
- return written ? written : -ENOSPC;
+ if (block >= size) {
+ retval = -ENOSPC;
+ goto cleanup;
+ }
chars = blocksize - offset;
if (chars > count)
chars=count;
@@ -74,15 +76,19 @@
if (chars != blocksize)
fn = bread;
bh = fn(dev, block, blocksize);
- if (!bh)
- return written ? written : -EIO;
+ if (!bh) {
+ retval = -EIO;
+ goto cleanup;
+ }
if (!buffer_uptodate(bh))
wait_on_buffer(bh);
}
#else
bh = getblk(dev, block, blocksize);
- if (!bh)
- return written ? written : -EIO;
+ if (!bh) {
+ retval = -EIO;
+ goto cleanup;
+ }
if (!buffer_uptodate(bh))
{
@@ -106,7 +112,8 @@
if (!bhlist[i])
{
while(i >= 0) brelse(bhlist[i--]);
- return written ? written : -EIO;
+ retval = -EIO;
+ goto cleanup;
}
}
}
@@ -115,7 +122,8 @@
wait_on_buffer(bh);
if (!buffer_uptodate(bh)) {
brelse(bh);
- return written ? written : -EIO;
+ retval = -EIO;
+ goto cleanup;
}
};
};
@@ -149,6 +157,7 @@
if (write_error)
break;
}
+ cleanup:
if ( buffercount ){
ll_rw_block(WRITE, buffercount, bufferlist);
for(i=0; i<buffercount; i++){
@@ -158,10 +167,11 @@
brelse(bufferlist[i]);
}
}
- filp->f_reada = 1;
+ if(!retval)
+ filp->f_reada = 1;
if(write_error)
return -EIO;
- return written;
+ return written ? written : retval;
}
ssize_t block_read(struct file * filp, char * buf, size_t count, loff_t *ppos)
@@ -382,7 +392,7 @@
}
}
-void __init bdev_init(void)
+void __init bdev_cache_init(void)
{
int i;
struct list_head *head = bdev_hashtable;
@@ -554,7 +564,6 @@
{
int i;
const struct block_device_operations * bdops = NULL;
- struct super_block * sb;
i = MAJOR(dev);
if (i < MAX_BLKDEV)
@@ -576,11 +585,8 @@
printk(KERN_DEBUG "VFS: Disk change detected on device %s\n",
bdevname(dev));
- sb = get_super(dev);
- if (sb && invalidate_inodes(sb))
+ if (invalidate_device(dev, 0))
printk("VFS: busy inodes on changed media.\n");
-
- destroy_buffers(dev);
if (bdops->revalidate)
bdops->revalidate(dev);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)