2025-08-10 01:34:16 +02:00

78 lines
1.6 KiB
C

#ifndef FHGFSPAGE_H_
#define FHGFSPAGE_H_
#include <linux/fs.h>
struct FhgfsPage;
typedef struct FhgfsPage FhgfsPage;
static inline void FhgfsPage_unmapUnlockReleasePage(struct page* page);
static inline void FhgfsPage_unmapUnlockReleaseFhgfsPage(FhgfsPage* this);
static inline loff_t FhgfsPage_getFileOffset(FhgfsPage* this);
static inline void FhgfsPage_zeroPage(FhgfsPage* this);
static inline pgoff_t FhgfsPage_getPageIndex(FhgfsPage* this);
struct FhgfsPage
{
struct page* page;
void *data; // real page data, obtained by kmap(page)
int length; // size of *used* data of this page
};
/**
* Unmap, unlock and release a (kernel) page
*/
void FhgfsPage_unmapUnlockReleasePage(struct page* page)
{
kunmap(page);
unlock_page(page);
put_page(page);
}
/**
* Unmap, unlock and release an fhgfs page
*/
void FhgfsPage_unmapUnlockReleaseFhgfsPage(FhgfsPage* this)
{
FhgfsPage_unmapUnlockReleasePage(this->page);
}
/**
* Get the offset (within a file) of the page
*/
loff_t FhgfsPage_getFileOffset(FhgfsPage* this)
{
return page_offset(this->page); // offset within the file
}
/**
* Zero the data of a page
*/
void FhgfsPage_zeroPage(FhgfsPage* this)
{
// zero_user_segment() would be optimal, but not available in older kernels
// zero_user_segment(page, zeroOffset, BEEGFS_PAGE_SIZE);
// BUT we can use our kmapped Fhgfs_Page directly for zeroing
memset(this->data, 0, PAGE_SIZE);
}
/**
* Return the page (in file) index of a page
*/
pgoff_t FhgfsPage_getPageIndex(FhgfsPage* this)
{
return this->page->index;
}
#endif // FHGFSPAGE_H_