Lines Matching refs:mp

31 #define metapage_locked(mp) test_bit(META_locked, &(mp)->flag)
32 #define trylock_metapage(mp) test_and_set_bit_lock(META_locked, &(mp)->flag)
34 static inline void unlock_metapage(struct metapage *mp)
36 clear_bit_unlock(META_locked, &mp->flag);
37 wake_up(&mp->wait);
40 static inline void __lock_metapage(struct metapage *mp)
44 add_wait_queue_exclusive(&mp->wait, &wait);
47 if (metapage_locked(mp)) {
48 unlock_page(mp->page);
50 lock_page(mp->page);
52 } while (trylock_metapage(mp));
54 remove_wait_queue(&mp->wait, &wait);
58 * Must have mp->page locked
60 static inline void lock_metapage(struct metapage *mp)
62 if (trylock_metapage(mp))
63 __lock_metapage(mp);
77 struct metapage *mp[MPS_PER_PAGE];
85 return mp_anchor(page)->mp[offset >> L2PSIZE];
88 static inline int insert_metapage(struct page *page, struct metapage *mp)
105 if (mp) {
107 index = (mp->index >> l2mp_blocks) & (MPS_PER_PAGE - 1);
109 a->mp[index] = mp;
115 static inline void remove_metapage(struct page *page, struct metapage *mp)
121 index = (mp->index >> l2mp_blocks) & (MPS_PER_PAGE - 1);
123 BUG_ON(a->mp[index] != mp);
125 a->mp[index] = NULL;
151 static inline int insert_metapage(struct page *page, struct metapage *mp)
153 if (mp) {
154 set_page_private(page, (unsigned long)mp);
161 static inline void remove_metapage(struct page *page, struct metapage *mp)
175 struct metapage *mp = mempool_alloc(metapage_mempool, gfp_mask);
177 if (mp) {
178 mp->lid = 0;
179 mp->lsn = 0;
180 mp->data = NULL;
181 mp->clsn = 0;
182 mp->log = NULL;
183 init_waitqueue_head(&mp->wait);
185 return mp;
188 static inline void free_metapage(struct metapage *mp)
190 mempool_free(mp, metapage_mempool);
220 static inline void drop_metapage(struct page *page, struct metapage *mp)
222 if (mp->count || mp->nohomeok || test_bit(META_dirty, &mp->flag) ||
223 test_bit(META_io, &mp->flag))
225 remove_metapage(page, mp);
227 free_metapage(mp);
279 static void remove_from_logsync(struct metapage *mp)
281 struct jfs_log *log = mp->log;
291 if (mp->lsn) {
292 mp->log = NULL;
293 mp->lsn = 0;
294 mp->clsn = 0;
296 list_del(&mp->synclist);
303 struct metapage *mp;
307 mp = page_to_mp(page, offset);
308 if (mp && test_bit(META_io, &mp->flag)) {
309 if (mp->lsn)
310 remove_from_logsync(mp);
311 clear_bit(META_io, &mp->flag);
338 int block_offset; /* block offset of mp within page */
343 struct metapage *mp;
362 mp = page_to_mp(page, offset);
364 if (!mp || !test_bit(META_dirty, &mp->flag))
367 if (mp->nohomeok && !test_bit(META_forcewrite, &mp->flag)) {
373 if (mp->log && !(mp->log->cflag & logGC_PAGEOUT))
374 jfs_flush_journal(mp->log, 0);
378 clear_bit(META_dirty, &mp->flag);
379 set_bit(META_io, &mp->flag);
530 struct metapage *mp;
535 mp = page_to_mp(page, offset);
537 if (!mp)
540 jfs_info("metapage_releasepage: mp = 0x%p", mp);
541 if (mp->count || mp->nohomeok ||
542 test_bit(META_dirty, &mp->flag)) {
543 jfs_info("count = %ld, nohomeok = %d", mp->count,
544 mp->nohomeok);
548 if (mp->lsn)
549 remove_from_logsync(mp);
550 remove_metapage(page, mp);
552 free_metapage(mp);
582 struct metapage *mp = NULL;
629 mp = page_to_mp(page, page_offset);
630 if (mp) {
631 if (mp->logical_size != size) {
635 mp->logical_size, size);
639 mp->count++;
640 lock_metapage(mp);
641 if (test_bit(META_discard, &mp->flag)) {
645 discard_metapage(mp);
648 clear_bit(META_discard, &mp->flag);
652 mp = alloc_metapage(GFP_NOFS);
653 if (!mp)
655 mp->page = page;
656 mp->sb = inode->i_sb;
657 mp->flag = 0;
658 mp->xflag = COMMIT_PAGE;
659 mp->count = 1;
660 mp->nohomeok = 0;
661 mp->logical_size = size;
662 mp->data = page_address(page) + page_offset;
663 mp->index = lblock;
664 if (unlikely(insert_metapage(page, mp))) {
665 free_metapage(mp);
668 lock_metapage(mp);
672 jfs_info("zeroing mp = 0x%p", mp);
673 memset(mp->data, 0, PSIZE);
677 jfs_info("__get_metapage: returning = 0x%p data = 0x%p", mp, mp->data);
678 return mp;
685 void grab_metapage(struct metapage * mp)
687 jfs_info("grab_metapage: mp = 0x%p", mp);
688 get_page(mp->page);
689 lock_page(mp->page);
690 mp->count++;
691 lock_metapage(mp);
692 unlock_page(mp->page);
695 void force_metapage(struct metapage *mp)
697 struct page *page = mp->page;
698 jfs_info("force_metapage: mp = 0x%p", mp);
699 set_bit(META_forcewrite, &mp->flag);
700 clear_bit(META_sync, &mp->flag);
705 jfs_error(mp->sb, "write_one_page() failed\n");
706 clear_bit(META_forcewrite, &mp->flag);
710 void hold_metapage(struct metapage *mp)
712 lock_page(mp->page);
715 void put_metapage(struct metapage *mp)
717 if (mp->count || mp->nohomeok) {
719 unlock_page(mp->page);
722 get_page(mp->page);
723 mp->count++;
724 lock_metapage(mp);
725 unlock_page(mp->page);
726 release_metapage(mp);
729 void release_metapage(struct metapage * mp)
731 struct page *page = mp->page;
732 jfs_info("release_metapage: mp = 0x%p, flag = 0x%lx", mp, mp->flag);
737 unlock_metapage(mp);
739 assert(mp->count);
740 if (--mp->count || mp->nohomeok) {
746 if (test_bit(META_dirty, &mp->flag)) {
748 if (test_bit(META_sync, &mp->flag)) {
749 clear_bit(META_sync, &mp->flag);
751 jfs_error(mp->sb, "write_one_page() failed\n");
754 } else if (mp->lsn) /* discard_metapage doesn't remove it */
755 remove_from_logsync(mp);
758 drop_metapage(page, mp);
772 struct metapage *mp;
786 mp = page_to_mp(page, offset);
787 if (!mp)
789 if (mp->index < addr)
791 if (mp->index >= addr + len)
794 clear_bit(META_dirty, &mp->flag);
795 set_bit(META_discard, &mp->flag);
796 if (mp->lsn)
797 remove_from_logsync(mp);