summaryrefslogtreecommitdiff
path: root/fs/cramfs/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/cramfs/inode.c')
-rw-r--r--fs/cramfs/inode.c212
1 files changed, 6 insertions, 206 deletions
diff --git a/fs/cramfs/inode.c b/fs/cramfs/inode.c
index f12a7e2b97fa..3d194a2be3f5 100644
--- a/fs/cramfs/inode.c
+++ b/fs/cramfs/inode.c
@@ -11,39 +11,6 @@
* The actual compression is based on zlib, see the other files.
*/
-/* Linear Addressing code
- *
- * Copyright (C) 2000 Shane Nay.
- *
- * Allows you to have a linearly addressed cramfs filesystem.
- * Saves the need for buffer, and the munging of the buffer.
- * Savings a bit over 32k with default PAGE_SIZE, BUFFER_SIZE
- * etc. Usefull on embedded platform with ROM :-).
- *
- * Downsides- Currently linear addressed cramfs partitions
- * don't co-exist with block cramfs partitions.
- *
- */
-
-/*
- * 28-Dec-2000: XIP mode for linear cramfs
- * Copyright (C) 2000 Robert Leslie <rob@mars.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/pagemap.h>
@@ -59,10 +26,9 @@
#include <asm/semaphore.h>
#include <asm/uaccess.h>
-#include <asm/tlbflush.h>
-static struct super_operations cramfs_ops;
-static struct inode_operations cramfs_dir_inode_operations;
+static const struct super_operations cramfs_ops;
+static const struct inode_operations cramfs_dir_inode_operations;
static const struct file_operations cramfs_directory_operations;
static const struct address_space_operations cramfs_aops;
@@ -133,67 +99,6 @@ static int cramfs_iget5_set(struct inode *inode, void *opaque)
return 0;
}
- #ifdef CONFIG_CRAMFS_LINEAR_XIP
- static int cramfs_mmap(struct file *file, struct vm_area_struct *vma)
- {
- unsigned long address, length;
- struct inode *inode = file->f_dentry->d_inode;
- struct super_block *sb = inode->i_sb;
- struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
-
- /* this is only used in the case of read-only maps for XIP */
-
- if (vma->vm_flags & VM_WRITE)
- return generic_file_mmap(file, vma);
-
- if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE))
- return -EINVAL;
-
- address = PAGE_ALIGN(sbi->linear_phys_addr + OFFSET(inode));
- address += vma->vm_pgoff << PAGE_SHIFT;
-
- length = vma->vm_end - vma->vm_start;
-
- if (length > inode->i_size)
- length = inode->i_size;
-
- length = PAGE_ALIGN(length);
-
- /*
- * Don't dump addresses that are not real memory to a core file.
- */
- vma->vm_flags |= (VM_IO | VM_XIP);
- flush_tlb_page(vma, address);
- if (remap_pfn_range(vma, vma->vm_start, address >> PAGE_SHIFT, length,
- vma->vm_page_prot))
- return -EAGAIN;
-
- #ifdef DEBUG_CRAMFS_XIP
- printk("cramfs_mmap: mapped %s at 0x%08lx, length %lu to vma 0x%08lx"
- ", page_prot 0x%08lx\n",
- file->f_dentry->d_name.name, address, length,
- vma->vm_start, pgprot_val(vma->vm_page_prot));
- #endif
-
- return 0;
- }
-
- static struct file_operations cramfs_linear_xip_fops = {
- aio_read: generic_file_aio_read,
- read: do_sync_read,
- mmap: cramfs_mmap,
- };
-
- #define CRAMFS_INODE_IS_XIP(x) ((x)->i_mode & S_ISVTX)
-
- #endif
-
- #ifdef CONFIG_CRAMFS_LINEAR
- static struct backing_dev_info cramfs_backing_dev_info = {
- .ra_pages = 0, /* No readahead */
- };
- #endif
-
static struct inode *get_cramfs_inode(struct super_block *sb,
struct cramfs_inode * cramfs_inode)
{
@@ -201,32 +106,11 @@ static struct inode *get_cramfs_inode(struct super_block *sb,
cramfs_iget5_test, cramfs_iget5_set,
cramfs_inode);
if (inode && (inode->i_state & I_NEW)) {
-#ifdef CONFIG_CRAMFS_LINEAR
- inode->i_mapping->backing_dev_info = &cramfs_backing_dev_info;
-#endif
-
-#ifdef CONFIG_CRAMFS_LINEAR_XIP
- if(S_ISREG(inode->i_mode))
- inode->i_fop = CRAMFS_INODE_IS_XIP(inode) ? &cramfs_linear_xip_fops : &generic_ro_fops;
-#endif
unlock_new_inode(inode);
}
return inode;
}
-#ifdef CONFIG_CRAMFS_LINEAR
-/*
- * Return a pointer to the block in the linearly addressed cramfs image.
- */
-static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned int len)
-{
- struct cramfs_sb_info *sbi = CRAMFS_SB(sb);
-
- if (!len)
- return NULL;
- return (void*)(sbi->linear_virt_addr + offset);
-}
-#else /* Not linear addressing - aka regular block mode. */
/*
* We have our own block cache: don't fill up the buffer cache
* with the rom-image, because the way the filesystem is set
@@ -335,7 +219,6 @@ static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned i
}
return read_buffers[buffer] + offset;
}
-#endif /* CONFIG_CRAMFS_LINEAR */
static void cramfs_put_super(struct super_block *sb)
{
@@ -351,11 +234,7 @@ static int cramfs_remount(struct super_block *sb, int *flags, char *data)
static int cramfs_fill_super(struct super_block *sb, void *data, int silent)
{
-#ifndef CONFIG_CRAMFS_LINEAR
int i;
-#else
- char *p;
-#endif
struct cramfs_super super;
unsigned long root_offset;
struct cramfs_sb_info *sbi;
@@ -368,48 +247,11 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent)
return -ENOMEM;
sb->s_fs_info = sbi;
-#ifndef CONFIG_CRAMFS_LINEAR
/* Invalidate the read buffers on mount: think disk change.. */
mutex_lock(&read_mutex);
for (i = 0; i < READ_BUFFERS; i++)
buffer_blocknr[i] = -1;
-#else /* CONFIG_CRAMFS_LINEAR */
- /*
- * The physical location of the cramfs image is specified as
- * a mount parameter. This parameter is mandatory for obvious
- * reasons. Some validation is made on the phys address but this
- * is not exhaustive and we count on the fact that someone using
- * this feature is supposed to know what he/she's doing.
- */
- if (!data || !(p = strstr((char *)data, "physaddr="))) {
- printk(KERN_ERR "cramfs: unknown physical address for linear cramfs image\n");
- goto out;
- }
- sbi->linear_phys_addr = simple_strtoul(p + 9, NULL, 0);
- if (sbi->linear_phys_addr & (PAGE_SIZE-1)) {
- printk(KERN_ERR "cramfs: physical address 0x%lx for linear cramfs isn't aligned to a page boundary\n",
- sbi->linear_phys_addr);
- goto out;
- }
- if (sbi->linear_phys_addr == 0) {
- printk(KERN_ERR "cramfs: physical address for linear cramfs image can't be 0\n");
- goto out;
- }
- printk(KERN_INFO "cramfs: checking physical address 0x%lx for linear cramfs image\n",
- sbi->linear_phys_addr);
-
- /* Map only one page for now. Will remap it when fs size is known. */
- sbi->linear_virt_addr =
- ioremap(sbi->linear_phys_addr, PAGE_SIZE);
- if (!sbi->linear_virt_addr) {
- printk(KERN_ERR "cramfs: ioremap of the linear cramfs image failed\n");
- goto out;
- }
-
- mutex_lock(&read_mutex);
-#endif /* CONFIG_CRAMFS_LINEAR */
-
/* Read the first block and get the superblock from it */
memcpy(&super, cramfs_read(sb, 0, sizeof(super)), sizeof(super));
mutex_unlock(&read_mutex);
@@ -470,27 +312,8 @@ static int cramfs_fill_super(struct super_block *sb, void *data, int silent)
iput(root);
goto out;
}
-
-#ifdef CONFIG_CRAMFS_LINEAR
- /* Remap the whole filesystem now */
- iounmap(sbi->linear_virt_addr);
- printk(KERN_INFO "cramfs: linear cramfs image appears to be %lu KB in size\n",
- sbi->size/1024);
-
- sbi->linear_virt_addr =
- ioremap_cached(sbi->linear_phys_addr, sbi->size);
-
- if (!sbi->linear_virt_addr) {
- printk(KERN_ERR "cramfs: ioremap of the linear cramfs image failed\n");
- goto out;
- }
-#endif /* CONFIG_CRAMFS_LINEAR */
return 0;
out:
-#ifdef CONFIG_CRAMFS_LINEAR
- if (sbi->linear_virt_addr)
- iounmap(sbi->linear_virt_addr);
-#endif /* CONFIG_CRAMFS_LINEAR */
kfree(sbi);
sb->s_fs_info = NULL;
return -EINVAL;
@@ -650,20 +473,6 @@ static int cramfs_readpage(struct file *file, struct page * page)
u32 blkptr_offset = OFFSET(inode) + page->index*4;
u32 start_offset, compr_len;
-#ifdef CONFIG_CRAMFS_LINEAR_XIP
- if(CRAMFS_INODE_IS_XIP(inode)) {
- blkptr_offset =
- PAGE_ALIGN(OFFSET(inode)) +
- page->index * PAGE_CACHE_SIZE;
- mutex_lock(&read_mutex);
- memcpy(page_address(page),
- cramfs_read(sb, blkptr_offset, PAGE_CACHE_SIZE),
- PAGE_CACHE_SIZE);
- mutex_unlock(&read_mutex);
- bytes_filled = PAGE_CACHE_SIZE;
- pgdata = kmap(page);
- } else {
-#endif /* CONFIG_CRAMFS_LINEAR_XIP */
start_offset = OFFSET(inode) + maxblock*4;
mutex_lock(&read_mutex);
if (page->index)
@@ -683,9 +492,6 @@ static int cramfs_readpage(struct file *file, struct page * page)
compr_len);
mutex_unlock(&read_mutex);
}
-#ifdef CONFIG_CRAMFS_LINEAR_XIP
- }
-#endif /* CONFIG_CRAMFS_LINEAR_XIP */
} else
pgdata = kmap(page);
memset(pgdata + bytes_filled, 0, PAGE_CACHE_SIZE - bytes_filled);
@@ -713,11 +519,11 @@ static const struct file_operations cramfs_directory_operations = {
.readdir = cramfs_readdir,
};
-static struct inode_operations cramfs_dir_inode_operations = {
+static const struct inode_operations cramfs_dir_inode_operations = {
.lookup = cramfs_lookup,
};
-static struct super_operations cramfs_ops = {
+static const struct super_operations cramfs_ops = {
.put_super = cramfs_put_super,
.remount_fs = cramfs_remount,
.statfs = cramfs_statfs,
@@ -726,12 +532,8 @@ static struct super_operations cramfs_ops = {
static int cramfs_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name, void *data, struct vfsmount *mnt)
{
-
-#ifdef CONFIG_CRAMFS_LINEAR
- return get_sb_nodev(fs_type, flags, data, cramfs_fill_super,mnt);
-#else
- return get_sb_bdev(fs_type, flags, dev_name, data, cramfs_fill_super, mnt);
-#endif
+ return get_sb_bdev(fs_type, flags, dev_name, data, cramfs_fill_super,
+ mnt);
}
static struct file_system_type cramfs_fs_type = {
@@ -739,9 +541,7 @@ static struct file_system_type cramfs_fs_type = {
.name = "cramfs",
.get_sb = cramfs_get_sb,
.kill_sb = kill_block_super,
-#ifndef CONFIG_CRAMFS_LINEAR
.fs_flags = FS_REQUIRES_DEV,
-#endif /* CONFIG_CRAMFS_LINEAR */
};
static int __init init_cramfs_fs(void)