2009-06-22 06:11:20 +04:00
# ifndef FS_MINIX_H
# define FS_MINIX_H
2005-04-17 02:20:36 +04:00
# include <linux/fs.h>
# include <linux/pagemap.h>
# include <linux/minix_fs.h>
# define INODE_VERSION(inode) minix_sb(inode->i_sb)->s_version
# define MINIX_V1 0x0001 /* original minix fs */
# define MINIX_V2 0x0002 /* minix V2 fs */
2007-02-12 11:52:49 +03:00
# define MINIX_V3 0x0003 /* minix V3 fs */
2005-04-17 02:20:36 +04:00
/*
* minix fs inode data in memory
*/
struct minix_inode_info {
union {
__u16 i1_data [ 16 ] ;
__u32 i2_data [ 16 ] ;
} u ;
struct inode vfs_inode ;
} ;
/*
* minix super - block data in memory
*/
struct minix_sb_info {
unsigned long s_ninodes ;
unsigned long s_nzones ;
unsigned long s_imap_blocks ;
unsigned long s_zmap_blocks ;
unsigned long s_firstdatazone ;
unsigned long s_log_zone_size ;
unsigned long s_max_size ;
int s_dirsize ;
int s_namelen ;
struct buffer_head * * s_imap ;
struct buffer_head * * s_zmap ;
struct buffer_head * s_sbh ;
struct minix_super_block * s_ms ;
unsigned short s_mount_state ;
unsigned short s_version ;
} ;
2008-02-07 11:15:44 +03:00
extern struct inode * minix_iget ( struct super_block * , unsigned long ) ;
2005-04-17 02:20:36 +04:00
extern struct minix_inode * minix_V1_raw_inode ( struct super_block * , ino_t , struct buffer_head * * ) ;
extern struct minix2_inode * minix_V2_raw_inode ( struct super_block * , ino_t , struct buffer_head * * ) ;
2011-07-26 10:48:39 +04:00
extern struct inode * minix_new_inode ( const struct inode * , umode_t , int * ) ;
2005-04-17 02:20:36 +04:00
extern void minix_free_inode ( struct inode * inode ) ;
2011-08-19 22:50:26 +04:00
extern unsigned long minix_count_free_inodes ( struct super_block * sb ) ;
2005-04-17 02:20:36 +04:00
extern int minix_new_block ( struct inode * inode ) ;
2007-02-12 11:52:49 +03:00
extern void minix_free_block ( struct inode * inode , unsigned long block ) ;
2011-08-19 22:50:26 +04:00
extern unsigned long minix_count_free_blocks ( struct super_block * sb ) ;
2005-04-17 02:20:36 +04:00
extern int minix_getattr ( struct vfsmount * , struct dentry * , struct kstat * ) ;
2010-06-04 13:29:56 +04:00
extern int minix_prepare_chunk ( struct page * page , loff_t pos , unsigned len ) ;
2005-04-17 02:20:36 +04:00
extern void V1_minix_truncate ( struct inode * ) ;
extern void V2_minix_truncate ( struct inode * ) ;
extern void minix_truncate ( struct inode * ) ;
extern void minix_set_inode ( struct inode * , dev_t ) ;
extern int V1_minix_get_block ( struct inode * , long , struct buffer_head * , int ) ;
extern int V2_minix_get_block ( struct inode * , long , struct buffer_head * , int ) ;
2007-02-12 11:52:49 +03:00
extern unsigned V1_minix_blocks ( loff_t , struct super_block * ) ;
extern unsigned V2_minix_blocks ( loff_t , struct super_block * ) ;
2005-04-17 02:20:36 +04:00
extern struct minix_dir_entry * minix_find_entry ( struct dentry * , struct page * * ) ;
extern int minix_add_link ( struct dentry * , struct inode * ) ;
extern int minix_delete_entry ( struct minix_dir_entry * , struct page * ) ;
extern int minix_make_empty ( struct inode * , struct inode * ) ;
extern int minix_empty_dir ( struct inode * ) ;
extern void minix_set_link ( struct minix_dir_entry * , struct page * , struct inode * ) ;
extern struct minix_dir_entry * minix_dotdot ( struct inode * , struct page * * ) ;
extern ino_t minix_inode_by_name ( struct dentry * ) ;
2007-02-12 11:55:39 +03:00
extern const struct inode_operations minix_file_inode_operations ;
extern const struct inode_operations minix_dir_inode_operations ;
2006-03-28 13:56:42 +04:00
extern const struct file_operations minix_file_operations ;
extern const struct file_operations minix_dir_operations ;
2005-04-17 02:20:36 +04:00
static inline struct minix_sb_info * minix_sb ( struct super_block * sb )
{
return sb - > s_fs_info ;
}
static inline struct minix_inode_info * minix_i ( struct inode * inode )
{
return list_entry ( inode , struct minix_inode_info , vfs_inode ) ;
}
2009-06-22 06:11:20 +04:00
2011-08-19 22:50:26 +04:00
static inline unsigned minix_blocks_needed ( unsigned bits , unsigned blocksize )
{
return DIV_ROUND_UP ( bits , blocksize * 8 ) ;
}
bitops: remove minix bitops from asm/bitops.h
minix bit operations are only used by minix filesystem and useless by
other modules. Because byte order of inode and block bitmaps is different
on each architecture like below:
m68k:
big-endian 16bit indexed bitmaps
h8300, microblaze, s390, sparc, m68knommu:
big-endian 32 or 64bit indexed bitmaps
m32r, mips, sh, xtensa:
big-endian 32 or 64bit indexed bitmaps for big-endian mode
little-endian bitmaps for little-endian mode
Others:
little-endian bitmaps
In order to move minix bit operations from asm/bitops.h to architecture
independent code in minix filesystem, this provides two config options.
CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED is only selected by m68k.
CONFIG_MINIX_FS_NATIVE_ENDIAN is selected by the architectures which use
native byte order bitmaps (h8300, microblaze, s390, sparc, m68knommu,
m32r, mips, sh, xtensa). The architectures which always use little-endian
bitmaps do not select these options.
Finally, we can remove minix bit operations from asm/bitops.h for all
architectures.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Greg Ungerer <gerg@uclinux.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Andreas Schwab <schwab@linux-m68k.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Michal Simek <monstr@monstr.eu>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Cc: Chris Zankel <chris@zankel.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-03-24 02:42:16 +03:00
# if defined(CONFIG_MINIX_FS_NATIVE_ENDIAN) && \
defined ( CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED )
# error Minix file system byte order broken
# elif defined(CONFIG_MINIX_FS_NATIVE_ENDIAN)
/*
* big - endian 32 or 64 bit indexed bitmaps on big - endian system or
* little - endian bitmaps on little - endian system
*/
# define minix_test_and_set_bit(nr, addr) \
__test_and_set_bit ( ( nr ) , ( unsigned long * ) ( addr ) )
# define minix_set_bit(nr, addr) \
__set_bit ( ( nr ) , ( unsigned long * ) ( addr ) )
# define minix_test_and_clear_bit(nr, addr) \
__test_and_clear_bit ( ( nr ) , ( unsigned long * ) ( addr ) )
# define minix_test_bit(nr, addr) \
test_bit ( ( nr ) , ( unsigned long * ) ( addr ) )
# define minix_find_first_zero_bit(addr, size) \
find_first_zero_bit ( ( unsigned long * ) ( addr ) , ( size ) )
# elif defined(CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED)
/*
* big - endian 16 bit indexed bitmaps
*/
static inline int minix_find_first_zero_bit ( const void * vaddr , unsigned size )
{
const unsigned short * p = vaddr , * addr = vaddr ;
unsigned short num ;
if ( ! size )
return 0 ;
2011-08-27 06:38:50 +04:00
size > > = 4 ;
bitops: remove minix bitops from asm/bitops.h
minix bit operations are only used by minix filesystem and useless by
other modules. Because byte order of inode and block bitmaps is different
on each architecture like below:
m68k:
big-endian 16bit indexed bitmaps
h8300, microblaze, s390, sparc, m68knommu:
big-endian 32 or 64bit indexed bitmaps
m32r, mips, sh, xtensa:
big-endian 32 or 64bit indexed bitmaps for big-endian mode
little-endian bitmaps for little-endian mode
Others:
little-endian bitmaps
In order to move minix bit operations from asm/bitops.h to architecture
independent code in minix filesystem, this provides two config options.
CONFIG_MINIX_FS_BIG_ENDIAN_16BIT_INDEXED is only selected by m68k.
CONFIG_MINIX_FS_NATIVE_ENDIAN is selected by the architectures which use
native byte order bitmaps (h8300, microblaze, s390, sparc, m68knommu,
m32r, mips, sh, xtensa). The architectures which always use little-endian
bitmaps do not select these options.
Finally, we can remove minix bit operations from asm/bitops.h for all
architectures.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Greg Ungerer <gerg@uclinux.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Roman Zippel <zippel@linux-m68k.org>
Cc: Andreas Schwab <schwab@linux-m68k.org>
Cc: Martin Schwidefsky <schwidefsky@de.ibm.com>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: Yoshinori Sato <ysato@users.sourceforge.jp>
Cc: Michal Simek <monstr@monstr.eu>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Hirokazu Takata <takata@linux-m32r.org>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Acked-by: Paul Mundt <lethal@linux-sh.org>
Cc: Chris Zankel <chris@zankel.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2011-03-24 02:42:16 +03:00
while ( * p + + = = 0xffff ) {
if ( - - size = = 0 )
return ( p - addr ) < < 4 ;
}
num = * - - p ;
return ( ( p - addr ) < < 4 ) + ffz ( num ) ;
}
# define minix_test_and_set_bit(nr, addr) \
__test_and_set_bit ( ( nr ) ^ 16 , ( unsigned long * ) ( addr ) )
# define minix_set_bit(nr, addr) \
__set_bit ( ( nr ) ^ 16 , ( unsigned long * ) ( addr ) )
# define minix_test_and_clear_bit(nr, addr) \
__test_and_clear_bit ( ( nr ) ^ 16 , ( unsigned long * ) ( addr ) )
static inline int minix_test_bit ( int nr , const void * vaddr )
{
const unsigned short * p = vaddr ;
return ( p [ nr > > 4 ] & ( 1U < < ( nr & 15 ) ) ) ! = 0 ;
}
# else
/*
* little - endian bitmaps
*/
# define minix_test_and_set_bit __test_and_set_bit_le
# define minix_set_bit __set_bit_le
# define minix_test_and_clear_bit __test_and_clear_bit_le
# define minix_test_bit test_bit_le
# define minix_find_first_zero_bit find_first_zero_bit_le
# endif
2009-06-22 06:11:20 +04:00
# endif /* FS_MINIX_H */