]> git.saurik.com Git - apple/hfs.git/blame - livefiles_hfs_plugin/lf_hfs_generic_buf.h
hfs-556.100.11.tar.gz
[apple/hfs.git] / livefiles_hfs_plugin / lf_hfs_generic_buf.h
CommitLineData
de8ee011
A
1//
2// lf_hfs_generic_buf.h
3// livefiles_hfs
4//
5// Created by Yakov Ben Zaken on 22/03/2018.
6//
7
8#ifndef lf_hfs_generic_buf_h
9#define lf_hfs_generic_buf_h
10
11#include "lf_hfs.h"
12
13#define BUF_SKIP_NONLOCKED 0x01
14#define BUF_SKIP_LOCKED 0x02
15#define BUF_SCAN_CLEAN 0x04 /* scan the clean buffers */
16#define BUF_SCAN_DIRTY 0x08 /* scan the dirty buffers */
17#define BUF_NOTIFY_BUSY 0x10 /* notify the caller about the busy pages during the scan */
18
19// uCacheFlags:
20#define GEN_BUF_WRITE_LOCK 0x00001000 // When set, the buffer does not get written to media. It will be written as part of a journal transaction.
21#define GEN_BUF_NON_CACHED 0x00002000 // If set, the buffer is not cached.
22#define GEN_BUF_IS_UPTODATE 0x00004000 // Set if memory content is equal or newer than media content
23#define GEN_BUF_PHY_BLOCK 0x00008000 // Indicates that the uBlockN field contains a physical block number
24#define GEN_BUF_LITTLE_ENDIAN 0x00010000 // When set, the data in the buffer contains small-endian data and should not be written to media
25
26typedef struct GenericBuffer {
27
28 uint64_t uCacheFlags;
29 pthread_mutex_t sLock; // Sync access to buffer arguments + data
30 pthread_t pLockingThread; // Allows recursive lock by the same thread
31 uint32_t uLockCnt; // Allows recursive lock by the same thread
32 pthread_t sOwnerThread; // Current owner of buffer.
33 pthread_cond_t sOwnerCond; // Clicked everytime a buffer owner is released.
34 uint32_t uUseCnt; // Counts the number of buffer allocations
35 void* pvData;
36 uint32_t uDataSize;
37 uint32_t uValidBytes;
38 daddr64_t uBlockN;
39 vnode_t psVnode;
40 uint64_t uFlags;
41 uint64_t uPhyCluster;
42 void (*pfFunc)(struct GenericBuffer *psBuf, void *pvArg); // A function to be called at the last minute before disk-write
43 void *pvCallbackArgs; // pfFunc args
44} GenericLFBuf, *GenericLFBufPtr;
45
46typedef struct {
47 uint32_t buf_cache_size;
48 uint32_t max_buf_cache_size;
49 uint32_t max_gen_buf_uncached;
50 uint32_t gen_buf_uncached;
51 uint32_t buf_cache_remove;
52 uint32_t buf_cache_cleanup;
53
54 uint64_t buf_total_allocated_size;
55} CacheStats_S;
56
57extern CacheStats_S gCacheStat;
58
59
60GenericLFBufPtr lf_hfs_generic_buf_allocate( vnode_t psVnode, daddr64_t uBlockN, uint32_t uBlockSize, uint64_t uFlags );
61int lf_hfs_generic_buf_take_ownership(GenericLFBuf *psBuf, pthread_mutex_t *pSem);
62int lf_hfs_generic_buf_take_ownership_retry(GenericLFBuf *psBuf);
63int lf_hfs_generic_buf_validate_owner(GenericLFBuf *psBuf);
64GenericLFBufPtr lf_hfs_generic_buf_duplicate(GenericLFBufPtr pBuff, uint32_t uExtraCacheFlags);
65errno_t lf_hfs_generic_buf_read( GenericLFBufPtr psBuf );
66errno_t lf_hfs_generic_buf_write( GenericLFBufPtr psBuf );
67void lf_hfs_generic_buf_invalidate( GenericLFBufPtr psBuf );
68void lf_hfs_generic_buf_release( GenericLFBufPtr psBuf );
69void lf_hfs_generic_buf_clear( GenericLFBufPtr psBuf );
70void lf_hfs_generic_buf_set_cache_flag(GenericLFBufPtr psBuf, uint64_t uCacheFlags);
71void lf_hfs_generic_buf_clear_cache_flag(GenericLFBufPtr psBuf, uint64_t uCacheFlags);
72void lf_hfs_generic_buf_override_owner(GenericLFBufPtr psBuf);
73void lf_hfs_generic_buf_lock(GenericLFBufPtr psBuf);
74void lf_hfs_generic_buf_unlock(GenericLFBufPtr psBuf);
75void lf_hfs_generic_buf_cache_init( void );
76void lf_hfs_generic_buf_cache_deinit( void );
77void lf_hfs_generic_buf_cache_clear_by_iFD( int iFD );
78void lf_hfs_generic_buf_cache_update( GenericLFBufPtr psBuf );
79void lf_hfs_generic_buf_cache_remove_vnode(vnode_t vp);
80void lf_hfs_generic_buf_cache_UnLockBufCache(void);
81void lf_hfs_generic_buf_cache_LockBufCache(void);
82
83typedef int (*IterateCallback)(GenericLFBuf *psBuff, void *pvArgs);
84int lf_hfs_generic_buf_write_iterate(vnode_t psVnode, IterateCallback pfCallback, uint32_t uFlags, void *pvArgs);
85
86
87#endif /* lf_hfs_generic_buf_h */