]> git.saurik.com Git - apple/hfs.git/blob - livefiles_hfs_plugin/lf_hfs_generic_buf.h
hfs-522.0.9.tar.gz
[apple/hfs.git] / livefiles_hfs_plugin / lf_hfs_generic_buf.h
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
26 typedef 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
46 typedef 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
57 extern CacheStats_S gCacheStat;
58
59
60 GenericLFBufPtr lf_hfs_generic_buf_allocate( vnode_t psVnode, daddr64_t uBlockN, uint32_t uBlockSize, uint64_t uFlags );
61 int lf_hfs_generic_buf_take_ownership(GenericLFBuf *psBuf, pthread_mutex_t *pSem);
62 int lf_hfs_generic_buf_take_ownership_retry(GenericLFBuf *psBuf);
63 int lf_hfs_generic_buf_validate_owner(GenericLFBuf *psBuf);
64 GenericLFBufPtr lf_hfs_generic_buf_duplicate(GenericLFBufPtr pBuff, uint32_t uExtraCacheFlags);
65 errno_t lf_hfs_generic_buf_read( GenericLFBufPtr psBuf );
66 errno_t lf_hfs_generic_buf_write( GenericLFBufPtr psBuf );
67 void lf_hfs_generic_buf_invalidate( GenericLFBufPtr psBuf );
68 void lf_hfs_generic_buf_release( GenericLFBufPtr psBuf );
69 void lf_hfs_generic_buf_clear( GenericLFBufPtr psBuf );
70 void lf_hfs_generic_buf_set_cache_flag(GenericLFBufPtr psBuf, uint64_t uCacheFlags);
71 void lf_hfs_generic_buf_clear_cache_flag(GenericLFBufPtr psBuf, uint64_t uCacheFlags);
72 void lf_hfs_generic_buf_override_owner(GenericLFBufPtr psBuf);
73 void lf_hfs_generic_buf_lock(GenericLFBufPtr psBuf);
74 void lf_hfs_generic_buf_unlock(GenericLFBufPtr psBuf);
75 void lf_hfs_generic_buf_cache_init( void );
76 void lf_hfs_generic_buf_cache_deinit( void );
77 void lf_hfs_generic_buf_cache_clear_by_iFD( int iFD );
78 void lf_hfs_generic_buf_cache_update( GenericLFBufPtr psBuf );
79 void lf_hfs_generic_buf_cache_remove_vnode(vnode_t vp);
80 void lf_hfs_generic_buf_cache_UnLockBufCache(void);
81 void lf_hfs_generic_buf_cache_LockBufCache(void);
82
83 typedef int (*IterateCallback)(GenericLFBuf *psBuff, void *pvArgs);
84 int 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 */