0001
0002
0003
0004
0005
0006 #ifndef _H_JFS_METAPAGE
0007 #define _H_JFS_METAPAGE
0008
0009 #include <linux/pagemap.h>
0010
0011 struct metapage {
0012
0013 u16 xflag;
0014 u16 unused;
0015 lid_t lid;
0016 int lsn;
0017 struct list_head synclist;
0018
0019
0020 unsigned long flag;
0021 unsigned long count;
0022 void *data;
0023 sector_t index;
0024 wait_queue_head_t wait;
0025
0026
0027 struct page *page;
0028 struct super_block *sb;
0029 unsigned int logical_size;
0030
0031
0032 int clsn;
0033 int nohomeok;
0034 struct jfs_log *log;
0035 };
0036
0037
0038 #define META_locked 0
0039 #define META_dirty 2
0040 #define META_sync 3
0041 #define META_discard 4
0042 #define META_forcewrite 5
0043 #define META_io 6
0044
0045 #define mark_metapage_dirty(mp) set_bit(META_dirty, &(mp)->flag)
0046
0047
0048 extern int metapage_init(void);
0049 extern void metapage_exit(void);
0050 extern struct metapage *__get_metapage(struct inode *inode,
0051 unsigned long lblock, unsigned int size,
0052 int absolute, unsigned long new);
0053
0054 #define read_metapage(inode, lblock, size, absolute)\
0055 __get_metapage(inode, lblock, size, absolute, false)
0056
0057 #define get_metapage(inode, lblock, size, absolute)\
0058 __get_metapage(inode, lblock, size, absolute, true)
0059
0060 extern void release_metapage(struct metapage *);
0061 extern void grab_metapage(struct metapage *);
0062 extern void force_metapage(struct metapage *);
0063
0064
0065
0066
0067
0068
0069 extern void hold_metapage(struct metapage *);
0070 extern void put_metapage(struct metapage *);
0071
0072 static inline void write_metapage(struct metapage *mp)
0073 {
0074 set_bit(META_dirty, &mp->flag);
0075 release_metapage(mp);
0076 }
0077
0078 static inline void flush_metapage(struct metapage *mp)
0079 {
0080 set_bit(META_sync, &mp->flag);
0081 write_metapage(mp);
0082 }
0083
0084 static inline void discard_metapage(struct metapage *mp)
0085 {
0086 clear_bit(META_dirty, &mp->flag);
0087 set_bit(META_discard, &mp->flag);
0088 release_metapage(mp);
0089 }
0090
0091 static inline void metapage_nohomeok(struct metapage *mp)
0092 {
0093 struct page *page = mp->page;
0094 lock_page(page);
0095 if (!mp->nohomeok++) {
0096 mark_metapage_dirty(mp);
0097 get_page(page);
0098 wait_on_page_writeback(page);
0099 }
0100 unlock_page(page);
0101 }
0102
0103
0104
0105
0106
0107 static inline void metapage_wait_for_io(struct metapage *mp)
0108 {
0109 if (test_bit(META_io, &mp->flag))
0110 wait_on_page_writeback(mp->page);
0111 }
0112
0113
0114
0115
0116 static inline void _metapage_homeok(struct metapage *mp)
0117 {
0118 if (!--mp->nohomeok)
0119 put_page(mp->page);
0120 }
0121
0122 static inline void metapage_homeok(struct metapage *mp)
0123 {
0124 hold_metapage(mp);
0125 _metapage_homeok(mp);
0126 put_metapage(mp);
0127 }
0128
0129 extern const struct address_space_operations jfs_metapage_aops;
0130
0131
0132
0133
0134 extern void __invalidate_metapages(struct inode *, s64, int);
0135 #define invalidate_pxd_metapages(ip, pxd) \
0136 __invalidate_metapages((ip), addressPXD(&(pxd)), lengthPXD(&(pxd)))
0137 #define invalidate_dxd_metapages(ip, dxd) \
0138 __invalidate_metapages((ip), addressDXD(&(dxd)), lengthDXD(&(dxd)))
0139 #define invalidate_xad_metapages(ip, xad) \
0140 __invalidate_metapages((ip), addressXAD(&(xad)), lengthXAD(&(xad)))
0141
0142 #endif