2005-06-24 09:05:26 +04:00
/*
* linux / fs / ext2 / xip . c
*
* Copyright ( C ) 2005 IBM Corporation
* Author : Carsten Otte ( cotte @ de . ibm . com )
*/
# include <linux/mm.h>
# include <linux/fs.h>
# include <linux/genhd.h>
# include <linux/buffer_head.h>
2007-10-08 21:26:20 +04:00
# include <linux/blkdev.h>
2005-06-24 09:05:26 +04:00
# include "ext2.h"
# include "xip.h"
static inline int
2008-04-28 13:13:02 +04:00
__inode_direct_access ( struct inode * inode , sector_t block ,
2008-04-28 13:13:02 +04:00
void * * kaddr , unsigned long * pfn )
2005-07-15 14:56:30 +04:00
{
2008-04-28 13:13:02 +04:00
struct block_device * bdev = inode - > i_sb - > s_bdev ;
2009-09-22 04:01:13 +04:00
const struct block_device_operations * ops = bdev - > bd_disk - > fops ;
2008-04-28 13:13:02 +04:00
sector_t sector ;
sector = block * ( PAGE_SIZE / 512 ) ; /* ext2 block to bdev sector */
2008-04-28 13:13:02 +04:00
BUG_ON ( ! ops - > direct_access ) ;
return ops - > direct_access ( bdev , sector , kaddr , pfn ) ;
2005-06-24 09:05:26 +04:00
}
2005-07-15 14:56:30 +04:00
static inline int
2008-04-28 13:13:02 +04:00
__ext2_get_block ( struct inode * inode , pgoff_t pgoff , int create ,
2005-07-15 14:56:30 +04:00
sector_t * result )
{
struct buffer_head tmp ;
int rc ;
memset ( & tmp , 0 , sizeof ( struct buffer_head ) ) ;
2013-11-05 04:15:38 +04:00
tmp . b_size = 1 < < inode - > i_blkbits ;
2008-04-28 13:13:02 +04:00
rc = ext2_get_block ( inode , pgoff , & tmp , create ) ;
2005-07-15 14:56:30 +04:00
* result = tmp . b_blocknr ;
/* did we get a sparse block (hole in the file)? */
2005-07-27 22:43:52 +04:00
if ( ! tmp . b_blocknr & & ! rc ) {
2005-07-15 14:56:30 +04:00
BUG_ON ( create ) ;
rc = - ENODATA ;
}
return rc ;
}
2005-06-24 09:05:26 +04:00
int
2008-04-28 13:13:02 +04:00
ext2_clear_xip_target ( struct inode * inode , sector_t block )
2005-07-15 14:56:30 +04:00
{
2008-04-28 13:13:02 +04:00
void * kaddr ;
unsigned long pfn ;
2005-06-24 09:05:26 +04:00
int rc ;
2008-04-28 13:13:02 +04:00
rc = __inode_direct_access ( inode , block , & kaddr , & pfn ) ;
2005-07-15 14:56:30 +04:00
if ( ! rc )
2008-04-28 13:13:02 +04:00
clear_page ( kaddr ) ;
2005-07-15 14:56:30 +04:00
return rc ;
2005-06-24 09:05:26 +04:00
}
void ext2_xip_verify_sb ( struct super_block * sb )
{
struct ext2_sb_info * sbi = EXT2_SB ( sb ) ;
2005-07-15 14:56:30 +04:00
if ( ( sbi - > s_mount_opt & EXT2_MOUNT_XIP ) & &
! sb - > s_bdev - > bd_disk - > fops - > direct_access ) {
sbi - > s_mount_opt & = ( ~ EXT2_MOUNT_XIP ) ;
ext2: Unify log messages in ext2
make messages produced by ext2 more unified. It should be
easy to parse.
dmesg before patch:
[ 4893.684892] reservations ON
[ 4893.684896] xip option not supported
[ 4893.684961] EXT2-fs warning: mounting ext3 filesystem as ext2
[ 4893.684964] EXT2-fs warning: maximal mount count reached, running
e2fsck is recommended
[ 4893.684990] EXT II FS: 0.5b, 95/08/09, bs=1024, fs=1024, gc=2,
bpg=8192, ipg=1280, mo=80010]
dmesg after patch:
[ 4893.684892] EXT2-fs (loop0): reservations ON
[ 4893.684896] EXT2-fs (loop0): xip option not supported
[ 4893.684961] EXT2-fs (loop0): warning: mounting ext3 filesystem as
ext2
[ 4893.684964] EXT2-fs (loop0): warning: maximal mount count reached,
running e2fsck is recommended
[ 4893.684990] EXT2-fs (loop0): 0.5b, 95/08/09, bs=1024, fs=1024, gc=2,
bpg=8192, ipg=1280, mo=80010]
Signed-off-by: Alexey Fisher <bug-track@fisher-privat.net>
Reviewed-by: Andreas Dilger <adilger@sun.com>
Signed-off-by: Jan Kara <jack@suse.cz>
2009-11-19 21:12:51 +03:00
ext2_msg ( sb , KERN_WARNING ,
" warning: ignoring xip option - "
" not supported by bdev " ) ;
2005-06-24 09:05:26 +04:00
}
}
2008-04-28 13:13:02 +04:00
int ext2_get_xip_mem ( struct address_space * mapping , pgoff_t pgoff , int create ,
void * * kmem , unsigned long * pfn )
2005-06-24 09:05:26 +04:00
{
int rc ;
2008-04-28 13:13:02 +04:00
sector_t block ;
2005-06-24 09:05:26 +04:00
2005-07-15 14:56:30 +04:00
/* first, retrieve the sector number */
2008-04-28 13:13:02 +04:00
rc = __ext2_get_block ( mapping - > host , pgoff , create , & block ) ;
2005-06-24 09:05:26 +04:00
if ( rc )
2008-04-28 13:13:02 +04:00
return rc ;
2005-06-24 09:05:26 +04:00
2005-07-15 14:56:30 +04:00
/* retrieve address of the target data */
2008-04-28 13:13:02 +04:00
rc = __inode_direct_access ( mapping - > host , block , kmem , pfn ) ;
return rc ;
2005-06-24 09:05:26 +04:00
}