static void gfs2_invalidatepage(struct page *page, unsigned long offset) { struct gfs2_sbd *sdp = GFS2_SB(page->mapping->host); struct buffer_head *head, *bh, *next; unsigned int curr_off = 0; BUG_ON(!PageLocked(page)); if (!page_has_buffers(page)) return; bh = head = page_buffers(page); do { unsigned int next_off = curr_off + bh->b_size; next = bh->b_this_page; if (offset <= curr_off) discard_buffer(sdp, bh); curr_off = next_off; bh = next; } while (bh != head); if (!offset) try_to_release_page(page, 0); return; }
bool stream_reader::get_page(page& spage) throw(std::exception) { size_t advance; bool f; try_again: fill_buffer(); if(eof && !left) return false; f = page::scan(buffer, left, eof, advance); if(advance) { //The ogg stream resyncs. (*errors_to) << "Warning: Ogg stream: Recapture after " << advance << " bytes." << std::endl; discard_buffer(advance); goto try_again; } if(!f) goto try_again; spage = page(buffer, advance); last_offset = start_offset; discard_buffer(advance); return true; }
/* * Invalidate buffer, this must be called from frontend like truncate. * Caller must hold lock_page(), and page->mapping must be valid. */ void tux3_invalidate_buffer(struct buffer_head *buffer) { unsigned delta = tux3_inode_delta(buffer_inode(buffer)); tux3_clear_buffer_dirty(buffer, delta); discard_buffer(buffer); }