patch-2.4.17 linux/fs/cramfs/inode.c
Next file: linux/fs/dcache.c
Previous file: linux/fs/coda/upcall.c
Back to the patch index
Back to the overall index
- Lines: 75
- Date:
Fri Dec 21 16:40:32 2001
- Orig file:
linux-2.4.16/fs/cramfs/inode.c
- Orig date:
Thu Oct 25 20:53:53 2001
diff -Naur -X /home/marcelo/lib/dontdiff linux-2.4.16/fs/cramfs/inode.c linux/fs/cramfs/inode.c
@@ -19,6 +19,7 @@
#include <linux/locks.h>
#include <linux/blkdev.h>
#include <linux/cramfs_fs.h>
+#include <asm/semaphore.h>
#include <asm/uaccess.h>
@@ -33,6 +34,9 @@
static struct file_operations cramfs_directory_operations;
static struct address_space_operations cramfs_aops;
+static DECLARE_MUTEX(read_mutex);
+
+
/* These two macros may change in future, to provide better st_ino
semantics. */
#define CRAMINO(x) ((x)->offset?(x)->offset<<2:1)
@@ -199,8 +203,10 @@
for (i = 0; i < READ_BUFFERS; i++)
buffer_blocknr[i] = -1;
+ down(&read_mutex);
/* Read the first block and get the superblock from it */
memcpy(&super, cramfs_read(sb, 0, sizeof(super)), sizeof(super));
+ up(&read_mutex);
/* Do sanity checks on the superblock */
if (super.magic != CRAMFS_MAGIC) {
@@ -291,7 +297,9 @@
char *name;
int namelen, error;
+ down(&read_mutex);
de = cramfs_read(sb, OFFSET(inode) + offset, sizeof(*de)+256);
+ up(&read_mutex);
name = (char *)(de+1);
/*
@@ -332,7 +340,9 @@
char *name;
int namelen, retval;
+ down(&read_mutex);
de = cramfs_read(dir->i_sb, OFFSET(dir) + offset, sizeof(*de)+256);
+ up(&read_mutex);
name = (char *)(de+1);
/* Try to take advantage of sorted directories */
@@ -384,18 +394,22 @@
u32 start_offset, compr_len;
start_offset = OFFSET(inode) + maxblock*4;
+ down(&read_mutex);
if (page->index)
start_offset = *(u32 *) cramfs_read(sb, blkptr_offset-4, 4);
- compr_len = (*(u32 *) cramfs_read(sb, blkptr_offset, 4)
- - start_offset);
+ compr_len = (*(u32 *) cramfs_read(sb, blkptr_offset, 4) - start_offset);
+ up(&read_mutex);
pgdata = kmap(page);
if (compr_len == 0)
; /* hole */
- else
+ else {
+ down(&read_mutex);
bytes_filled = cramfs_uncompress_block(pgdata,
PAGE_CACHE_SIZE,
cramfs_read(sb, start_offset, compr_len),
compr_len);
+ up(&read_mutex);
+ }
} else
pgdata = kmap(page);
memset(pgdata + bytes_filled, 0, PAGE_CACHE_SIZE - bytes_filled);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)