2005-04-17 02:20:36 +04:00
/*
* JFFS2 - - Journalling Flash File System , Version 2.
*
2007-04-25 17:16:47 +04:00
* Copyright © 2001 - 2007 Red Hat , Inc .
2005-04-17 02:20:36 +04:00
*
* Created by David Woodhouse < dwmw2 @ infradead . org >
*
* For licensing information , see the file ' LICENCE ' in this directory .
*
*/
# ifndef __JFFS2_OS_LINUX_H__
# define __JFFS2_OS_LINUX_H__
/* JFFS2 uses Linux mode bits natively -- no need for conversion */
# define os_to_jffs2_mode(x) (x)
# define jffs2_to_os_mode(x) (x)
struct kstatfs ;
struct kvec ;
# define JFFS2_INODE_INFO(i) (list_entry(i, struct jffs2_inode_info, vfs_inode))
# define OFNI_EDONI_2SFFJ(f) (&(f)->vfs_inode)
# define JFFS2_SB_INFO(sb) (sb->s_fs_info)
# define OFNI_BS_2SFFJ(c) ((struct super_block *)c->os_priv)
# define JFFS2_F_I_SIZE(f) (OFNI_EDONI_2SFFJ(f)->i_size)
# define JFFS2_F_I_MODE(f) (OFNI_EDONI_2SFFJ(f)->i_mode)
2012-02-08 04:28:39 +04:00
# define JFFS2_F_I_UID(f) (i_uid_read(OFNI_EDONI_2SFFJ(f)))
# define JFFS2_F_I_GID(f) (i_gid_read(OFNI_EDONI_2SFFJ(f)))
2006-05-19 03:28:49 +04:00
# define JFFS2_F_I_RDEV(f) (OFNI_EDONI_2SFFJ(f)->i_rdev)
2005-04-17 02:20:36 +04:00
# define ITIME(sec) ((struct timespec){sec, 0})
# define I_SEC(tv) ((tv).tv_sec)
# define JFFS2_F_I_CTIME(f) (OFNI_EDONI_2SFFJ(f)->i_ctime.tv_sec)
# define JFFS2_F_I_MTIME(f) (OFNI_EDONI_2SFFJ(f)->i_mtime.tv_sec)
# define JFFS2_F_I_ATIME(f) (OFNI_EDONI_2SFFJ(f)->i_atime.tv_sec)
# define sleep_on_spinunlock(wq, s) \
do { \
DECLARE_WAITQUEUE ( __wait , current ) ; \
add_wait_queue ( ( wq ) , & __wait ) ; \
set_current_state ( TASK_UNINTERRUPTIBLE ) ; \
spin_unlock ( s ) ; \
schedule ( ) ; \
remove_wait_queue ( ( wq ) , & __wait ) ; \
} while ( 0 )
static inline void jffs2_init_inode_info ( struct jffs2_inode_info * f )
{
f - > highest_version = 0 ;
f - > fragtree = RB_ROOT ;
f - > metadata = NULL ;
f - > dents = NULL ;
2005-07-17 15:13:51 +04:00
f - > target = NULL ;
2005-04-17 02:20:36 +04:00
f - > flags = 0 ;
f - > usercompr = 0 ;
}
2005-02-09 12:09:05 +03:00
2005-04-17 02:20:36 +04:00
# define jffs2_is_readonly(c) (OFNI_BS_2SFFJ(c)->s_flags & MS_RDONLY)
2005-09-30 17:59:17 +04:00
# define SECTOR_ADDR(x) ( (((unsigned long)(x) / c->sector_size) * c->sector_size) )
2005-02-09 12:24:26 +03:00
# ifndef CONFIG_JFFS2_FS_WRITEBUFFER
2005-09-30 17:59:17 +04:00
2005-09-07 12:35:26 +04:00
# ifdef CONFIG_JFFS2_SUMMARY
# define jffs2_can_mark_obsolete(c) (0)
# else
2005-04-17 02:20:36 +04:00
# define jffs2_can_mark_obsolete(c) (1)
2005-09-07 12:35:26 +04:00
# endif
2005-05-03 19:19:02 +04:00
# define jffs2_is_writebuffered(c) (0)
2005-04-17 02:20:36 +04:00
# define jffs2_cleanmarker_oob(c) (0)
# define jffs2_write_nand_cleanmarker(c,jeb) (-EIO)
2005-09-07 12:35:26 +04:00
# define jffs2_flash_write(c, ofs, len, retlen, buf) jffs2_flash_direct_write(c, ofs, len, retlen, buf)
2012-02-03 04:21:09 +04:00
# define jffs2_flash_read(c, ofs, len, retlen, buf) (mtd_read((c)->mtd, ofs, len, retlen, buf))
2005-09-22 15:25:00 +04:00
# define jffs2_flush_wbuf_pad(c) ({ do{} while(0); (void)(c), 0; })
# define jffs2_flush_wbuf_gc(c, i) ({ do{} while(0); (void)(c), (void) i, 0; })
2005-04-17 02:20:36 +04:00
# define jffs2_write_nand_badblock(c,jeb,bad_offset) (1)
# define jffs2_nand_flash_setup(c) (0)
# define jffs2_nand_flash_cleanup(c) do {} while(0)
# define jffs2_wbuf_dirty(c) (0)
# define jffs2_flash_writev(a,b,c,d,e,f) jffs2_flash_direct_writev(a,b,c,d,e)
# define jffs2_wbuf_timeout NULL
# define jffs2_wbuf_process NULL
2005-02-09 12:17:45 +03:00
# define jffs2_dataflash(c) (0)
2005-07-12 06:34:39 +04:00
# define jffs2_dataflash_setup(c) (0)
# define jffs2_dataflash_cleanup(c) do {} while (0)
2006-05-27 00:19:05 +04:00
# define jffs2_nor_wbuf_flash(c) (0)
2005-08-06 08:51:33 +04:00
# define jffs2_nor_wbuf_flash_setup(c) (0)
# define jffs2_nor_wbuf_flash_cleanup(c) do {} while (0)
2006-10-04 20:15:21 +04:00
# define jffs2_ubivol(c) (0)
# define jffs2_ubivol_setup(c) (0)
# define jffs2_ubivol_cleanup(c) do {} while (0)
2012-05-07 20:56:53 +04:00
# define jffs2_dirty_trigger(c) do {} while (0)
2005-04-17 02:20:36 +04:00
# else /* NAND and/or ECC'd NOR support present */
2005-05-03 19:19:02 +04:00
# define jffs2_is_writebuffered(c) (c->wbuf != NULL)
2005-09-07 12:35:26 +04:00
# ifdef CONFIG_JFFS2_SUMMARY
# define jffs2_can_mark_obsolete(c) (0)
# else
2006-05-23 01:18:29 +04:00
# define jffs2_can_mark_obsolete(c) (c->mtd->flags & (MTD_BIT_WRITEABLE))
2005-09-07 12:35:26 +04:00
# endif
2005-04-17 02:20:36 +04:00
# define jffs2_cleanmarker_oob(c) (c->mtd->type == MTD_NANDFLASH)
# define jffs2_wbuf_dirty(c) (!!(c)->wbuf_len)
/* wbuf.c */
int jffs2_flash_writev ( struct jffs2_sb_info * c , const struct kvec * vecs , unsigned long count , loff_t to , size_t * retlen , uint32_t ino ) ;
int jffs2_flash_write ( struct jffs2_sb_info * c , loff_t ofs , size_t len , size_t * retlen , const u_char * buf ) ;
int jffs2_flash_read ( struct jffs2_sb_info * c , loff_t ofs , size_t len , size_t * retlen , u_char * buf ) ;
int jffs2_check_oob_empty ( struct jffs2_sb_info * c , struct jffs2_eraseblock * jeb , int mode ) ;
int jffs2_check_nand_cleanmarker ( struct jffs2_sb_info * c , struct jffs2_eraseblock * jeb ) ;
int jffs2_write_nand_cleanmarker ( struct jffs2_sb_info * c , struct jffs2_eraseblock * jeb ) ;
int jffs2_write_nand_badblock ( struct jffs2_sb_info * c , struct jffs2_eraseblock * jeb , uint32_t bad_offset ) ;
void jffs2_wbuf_timeout ( unsigned long data ) ;
void jffs2_wbuf_process ( void * data ) ;
int jffs2_flush_wbuf_gc ( struct jffs2_sb_info * c , uint32_t ino ) ;
int jffs2_flush_wbuf_pad ( struct jffs2_sb_info * c ) ;
int jffs2_nand_flash_setup ( struct jffs2_sb_info * c ) ;
void jffs2_nand_flash_cleanup ( struct jffs2_sb_info * c ) ;
2005-02-09 12:24:26 +03:00
2005-02-09 12:17:45 +03:00
# define jffs2_dataflash(c) (c->mtd->type == MTD_DATAFLASH)
int jffs2_dataflash_setup ( struct jffs2_sb_info * c ) ;
void jffs2_dataflash_cleanup ( struct jffs2_sb_info * c ) ;
2006-10-04 20:15:21 +04:00
# define jffs2_ubivol(c) (c->mtd->type == MTD_UBIVOLUME)
int jffs2_ubivol_setup ( struct jffs2_sb_info * c ) ;
void jffs2_ubivol_cleanup ( struct jffs2_sb_info * c ) ;
2005-02-09 12:24:26 +03:00
2006-05-23 01:18:29 +04:00
# define jffs2_nor_wbuf_flash(c) (c->mtd->type == MTD_NORFLASH && ! (c->mtd->flags & MTD_BIT_WRITEABLE))
2005-08-06 08:51:33 +04:00
int jffs2_nor_wbuf_flash_setup ( struct jffs2_sb_info * c ) ;
void jffs2_nor_wbuf_flash_cleanup ( struct jffs2_sb_info * c ) ;
2012-05-07 20:56:53 +04:00
void jffs2_dirty_trigger ( struct jffs2_sb_info * c ) ;
2005-08-06 08:51:33 +04:00
2005-02-09 12:24:26 +03:00
# endif /* WRITEBUFFER */
2005-04-17 02:20:36 +04:00
/* background.c */
int jffs2_start_garbage_collect_thread ( struct jffs2_sb_info * c ) ;
void jffs2_stop_garbage_collect_thread ( struct jffs2_sb_info * c ) ;
void jffs2_garbage_collect_trigger ( struct jffs2_sb_info * c ) ;
/* dir.c */
2006-03-28 13:56:42 +04:00
extern const struct file_operations jffs2_dir_operations ;
2007-02-12 11:55:39 +03:00
extern const struct inode_operations jffs2_dir_inode_operations ;
2005-04-17 02:20:36 +04:00
/* file.c */
2006-03-28 13:56:42 +04:00
extern const struct file_operations jffs2_file_operations ;
2007-02-12 11:55:39 +03:00
extern const struct inode_operations jffs2_file_inode_operations ;
2006-06-28 15:26:44 +04:00
extern const struct address_space_operations jffs2_file_address_operations ;
2011-07-17 04:44:56 +04:00
int jffs2_fsync ( struct file * , loff_t , loff_t , int ) ;
2005-04-17 02:20:36 +04:00
int jffs2_do_readpage_unlock ( struct inode * inode , struct page * pg ) ;
/* ioctl.c */
2008-07-07 16:45:59 +04:00
long jffs2_ioctl ( struct file * , unsigned int , unsigned long ) ;
2005-04-17 02:20:36 +04:00
/* symlink.c */
2007-02-12 11:55:39 +03:00
extern const struct inode_operations jffs2_symlink_inode_operations ;
2005-04-17 02:20:36 +04:00
/* fs.c */
int jffs2_setattr ( struct dentry * , struct iattr * ) ;
2007-08-22 15:39:19 +04:00
int jffs2_do_setattr ( struct inode * , struct iattr * ) ;
2008-02-07 11:15:42 +03:00
struct inode * jffs2_iget ( struct super_block * , unsigned long ) ;
2010-06-07 22:34:48 +04:00
void jffs2_evict_inode ( struct inode * ) ;
2011-05-27 14:53:02 +04:00
void jffs2_dirty_inode ( struct inode * inode , int flags ) ;
2011-07-24 02:37:50 +04:00
struct inode * jffs2_new_inode ( struct inode * dir_i , umode_t mode ,
2007-09-14 10:16:35 +04:00
struct jffs2_raw_inode * ri ) ;
2006-06-23 13:02:58 +04:00
int jffs2_statfs ( struct dentry * , struct kstatfs * ) ;
2011-10-17 05:15:16 +04:00
int jffs2_do_remount_fs ( struct super_block * , int * , char * ) ;
2005-04-17 02:20:36 +04:00
int jffs2_do_fill_super ( struct super_block * sb , void * data , int silent ) ;
void jffs2_gc_release_inode ( struct jffs2_sb_info * c ,
struct jffs2_inode_info * f ) ;
struct jffs2_inode_info * jffs2_gc_fetch_inode ( struct jffs2_sb_info * c ,
2008-05-01 19:59:24 +04:00
int inum , int unlinked ) ;
2005-04-17 02:20:36 +04:00
2005-11-07 14:16:07 +03:00
unsigned char * jffs2_gc_fetch_page ( struct jffs2_sb_info * c ,
struct jffs2_inode_info * f ,
2005-04-17 02:20:36 +04:00
unsigned long offset ,
unsigned long * priv ) ;
void jffs2_gc_release_page ( struct jffs2_sb_info * c ,
unsigned char * pg ,
unsigned long * priv ) ;
void jffs2_flash_cleanup ( struct jffs2_sb_info * c ) ;
2005-11-07 14:16:07 +03:00
2005-04-17 02:20:36 +04:00
/* writev.c */
2005-11-07 14:16:07 +03:00
int jffs2_flash_direct_writev ( struct jffs2_sb_info * c , const struct kvec * vecs ,
2005-04-17 02:20:36 +04:00
unsigned long count , loff_t to , size_t * retlen ) ;
2005-09-07 12:35:26 +04:00
int jffs2_flash_direct_write ( struct jffs2_sb_info * c , loff_t ofs , size_t len ,
size_t * retlen , const u_char * buf ) ;
2005-04-17 02:20:36 +04:00
# endif /* __JFFS2_OS_LINUX_H__ */