Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  *   Copyright (C) International Business Machines Corp., 2000-2002
0004  *   Portions Copyright (C) Christoph Hellwig, 2001-2002
0005  */
0006 #ifndef _H_JFS_METAPAGE
0007 #define _H_JFS_METAPAGE
0008 
0009 #include <linux/pagemap.h>
0010 
0011 struct metapage {
0012     /* Common logsyncblk prefix (see jfs_logmgr.h) */
0013     u16 xflag;
0014     u16 unused;
0015     lid_t lid;
0016     int lsn;
0017     struct list_head synclist;
0018     /* End of logsyncblk prefix */
0019 
0020     unsigned long flag; /* See Below */
0021     unsigned long count;    /* Reference count */
0022     void *data;     /* Data pointer */
0023     sector_t index;     /* block address of page */
0024     wait_queue_head_t wait;
0025 
0026     /* implementation */
0027     struct page *page;
0028     struct super_block *sb;
0029     unsigned int logical_size;
0030 
0031     /* Journal management */
0032     int clsn;
0033     int nohomeok;
0034     struct jfs_log *log;
0035 };
0036 
0037 /* metapage flag */
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 /* function prototypes */
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  * hold_metapage and put_metapage are used in conjunction.  The page lock
0066  * is not dropped between the two, so no other threads can get or release
0067  * the metapage
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  * This serializes access to mp->lsn when metapages are added to logsynclist
0105  * without setting nohomeok.  i.e. updating imap & dmap
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  * This is called when already holding the metapage
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  * This routines invalidate all pages for an extent.
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              /* _H_JFS_METAPAGE */