#include <linux/cramfs_fs_sb.h>
#include <linux/buffer_head.h>
#include <linux/vfs.h>
-#include <linux/mutex.h>
#include <asm/semaphore.h>
#include <asm/uaccess.h>
static struct super_operations cramfs_ops;
static struct inode_operations cramfs_dir_inode_operations;
-static const struct file_operations cramfs_directory_operations;
+static struct file_operations cramfs_directory_operations;
static struct address_space_operations cramfs_aops;
-static DEFINE_MUTEX(read_mutex);
+static DECLARE_MUTEX(read_mutex);
/* These two macros may change in future, to provide better st_ino
memset(sbi, 0, sizeof(struct cramfs_sb_info));
/* Invalidate the read buffers on mount: think disk change.. */
- mutex_lock(&read_mutex);
+ down(&read_mutex);
for (i = 0; i < READ_BUFFERS; i++)
buffer_blocknr[i] = -1;
/* Read the first block and get the superblock from it */
memcpy(&super, cramfs_read(sb, 0, sizeof(super)), sizeof(super));
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
/* Do sanity checks on the superblock */
if (super.magic != CRAMFS_MAGIC) {
/* check at 512 byte offset */
- mutex_lock(&read_mutex);
+ down(&read_mutex);
memcpy(&super, cramfs_read(sb, 512, sizeof(super)), sizeof(super));
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
if (super.magic != CRAMFS_MAGIC) {
if (!silent)
printk(KERN_ERR "cramfs: wrong magic\n");
mode_t mode;
int namelen, error;
- mutex_lock(&read_mutex);
+ down(&read_mutex);
de = cramfs_read(sb, OFFSET(inode) + offset, sizeof(*de)+256);
name = (char *)(de+1);
memcpy(buf, name, namelen);
ino = CRAMINO(de);
mode = de->mode;
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
nextoffset = offset + sizeof(*de) + namelen;
for (;;) {
if (!namelen) {
unsigned int offset = 0;
int sorted;
- mutex_lock(&read_mutex);
+ down(&read_mutex);
sorted = CRAMFS_SB(dir->i_sb)->flags & CRAMFS_FLAG_SORTED_DIRS;
while (offset < dir->i_size) {
struct cramfs_inode *de;
for (;;) {
if (!namelen) {
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
return ERR_PTR(-EIO);
}
if (name[namelen-1])
continue;
if (!retval) {
struct cramfs_inode entry = *de;
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
d_add(dentry, get_cramfs_inode(dir->i_sb, &entry));
return NULL;
}
if (sorted)
break;
}
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
d_add(dentry, NULL);
return NULL;
}
u32 start_offset, compr_len;
start_offset = OFFSET(inode) + maxblock*4;
- mutex_lock(&read_mutex);
+ 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);
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
pgdata = kmap(page);
if (compr_len == 0)
; /* hole */
+ else if (compr_len > (PAGE_CACHE_SIZE << 1))
+ printk(KERN_ERR "cramfs: bad compressed blocksize %u\n", compr_len);
else {
- mutex_lock(&read_mutex);
+ down(&read_mutex);
bytes_filled = cramfs_uncompress_block(pgdata,
PAGE_CACHE_SIZE,
cramfs_read(sb, start_offset, compr_len),
compr_len);
- mutex_unlock(&read_mutex);
+ up(&read_mutex);
}
} else
pgdata = kmap(page);
/*
* A directory can only readdir
*/
-static const struct file_operations cramfs_directory_operations = {
+static struct file_operations cramfs_directory_operations = {
.llseek = generic_file_llseek,
.read = generic_read_dir,
.readdir = cramfs_readdir,