diff options
Diffstat (limited to 'fs/ocfs2/quota.h')
-rw-r--r-- | fs/ocfs2/quota.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/fs/ocfs2/quota.h b/fs/ocfs2/quota.h new file mode 100644 index 000000000000..7365e2e08706 --- /dev/null +++ b/fs/ocfs2/quota.h | |||
@@ -0,0 +1,119 @@ | |||
1 | /* | ||
2 | * quota.h for OCFS2 | ||
3 | * | ||
4 | * On disk quota structures for local and global quota file, in-memory | ||
5 | * structures. | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #ifndef _OCFS2_QUOTA_H | ||
10 | #define _OCFS2_QUOTA_H | ||
11 | |||
12 | #include <linux/types.h> | ||
13 | #include <linux/slab.h> | ||
14 | #include <linux/quota.h> | ||
15 | #include <linux/list.h> | ||
16 | #include <linux/dqblk_qtree.h> | ||
17 | |||
18 | #include "ocfs2.h" | ||
19 | |||
20 | /* Common stuff */ | ||
21 | /* id number of quota format */ | ||
22 | #define QFMT_OCFS2 3 | ||
23 | |||
24 | /* | ||
25 | * In-memory structures | ||
26 | */ | ||
27 | struct ocfs2_dquot { | ||
28 | struct dquot dq_dquot; /* Generic VFS dquot */ | ||
29 | loff_t dq_local_off; /* Offset in the local quota file */ | ||
30 | struct ocfs2_quota_chunk *dq_chunk; /* Chunk dquot is in */ | ||
31 | unsigned int dq_use_count; /* Number of nodes having reference to this entry in global quota file */ | ||
32 | s64 dq_origspace; /* Last globally synced space usage */ | ||
33 | s64 dq_originodes; /* Last globally synced inode usage */ | ||
34 | }; | ||
35 | |||
36 | /* Description of one chunk to recover in memory */ | ||
37 | struct ocfs2_recovery_chunk { | ||
38 | struct list_head rc_list; /* List of chunks */ | ||
39 | int rc_chunk; /* Chunk number */ | ||
40 | unsigned long *rc_bitmap; /* Bitmap of entries to recover */ | ||
41 | }; | ||
42 | |||
43 | struct ocfs2_quota_recovery { | ||
44 | struct list_head r_list[MAXQUOTAS]; /* List of chunks to recover */ | ||
45 | }; | ||
46 | |||
47 | /* In-memory structure with quota header information */ | ||
48 | struct ocfs2_mem_dqinfo { | ||
49 | unsigned int dqi_type; /* Quota type this structure describes */ | ||
50 | unsigned int dqi_chunks; /* Number of chunks in local quota file */ | ||
51 | unsigned int dqi_blocks; /* Number of blocks allocated for local quota file */ | ||
52 | unsigned int dqi_syncms; /* How often should we sync with other nodes */ | ||
53 | unsigned int dqi_syncjiff; /* Precomputed dqi_syncms in jiffies */ | ||
54 | struct list_head dqi_chunk; /* List of chunks */ | ||
55 | struct inode *dqi_gqinode; /* Global quota file inode */ | ||
56 | struct ocfs2_lock_res dqi_gqlock; /* Lock protecting quota information structure */ | ||
57 | struct buffer_head *dqi_gqi_bh; /* Buffer head with global quota file inode - set only if inode lock is obtained */ | ||
58 | int dqi_gqi_count; /* Number of holders of dqi_gqi_bh */ | ||
59 | struct buffer_head *dqi_lqi_bh; /* Buffer head with local quota file inode */ | ||
60 | struct buffer_head *dqi_ibh; /* Buffer with information header */ | ||
61 | struct qtree_mem_dqinfo dqi_gi; /* Info about global file */ | ||
62 | struct delayed_work dqi_sync_work; /* Work for syncing dquots */ | ||
63 | struct ocfs2_quota_recovery *dqi_rec; /* Pointer to recovery | ||
64 | * information, in case we | ||
65 | * enable quotas on file | ||
66 | * needing it */ | ||
67 | }; | ||
68 | |||
69 | static inline struct ocfs2_dquot *OCFS2_DQUOT(struct dquot *dquot) | ||
70 | { | ||
71 | return container_of(dquot, struct ocfs2_dquot, dq_dquot); | ||
72 | } | ||
73 | |||
74 | struct ocfs2_quota_chunk { | ||
75 | struct list_head qc_chunk; /* List of quotafile chunks */ | ||
76 | int qc_num; /* Number of quota chunk */ | ||
77 | struct buffer_head *qc_headerbh; /* Buffer head with chunk header */ | ||
78 | }; | ||
79 | |||
80 | extern struct kmem_cache *ocfs2_dquot_cachep; | ||
81 | extern struct kmem_cache *ocfs2_qf_chunk_cachep; | ||
82 | |||
83 | extern struct qtree_fmt_operations ocfs2_global_ops; | ||
84 | |||
85 | struct ocfs2_quota_recovery *ocfs2_begin_quota_recovery( | ||
86 | struct ocfs2_super *osb, int slot_num); | ||
87 | int ocfs2_finish_quota_recovery(struct ocfs2_super *osb, | ||
88 | struct ocfs2_quota_recovery *rec, | ||
89 | int slot_num); | ||
90 | void ocfs2_free_quota_recovery(struct ocfs2_quota_recovery *rec); | ||
91 | ssize_t ocfs2_quota_read(struct super_block *sb, int type, char *data, | ||
92 | size_t len, loff_t off); | ||
93 | ssize_t ocfs2_quota_write(struct super_block *sb, int type, | ||
94 | const char *data, size_t len, loff_t off); | ||
95 | int ocfs2_global_read_info(struct super_block *sb, int type); | ||
96 | int ocfs2_global_write_info(struct super_block *sb, int type); | ||
97 | int ocfs2_global_read_dquot(struct dquot *dquot); | ||
98 | int __ocfs2_sync_dquot(struct dquot *dquot, int freeing); | ||
99 | static inline int ocfs2_sync_dquot(struct dquot *dquot) | ||
100 | { | ||
101 | return __ocfs2_sync_dquot(dquot, 0); | ||
102 | } | ||
103 | static inline int ocfs2_global_release_dquot(struct dquot *dquot) | ||
104 | { | ||
105 | return __ocfs2_sync_dquot(dquot, 1); | ||
106 | } | ||
107 | |||
108 | int ocfs2_lock_global_qf(struct ocfs2_mem_dqinfo *oinfo, int ex); | ||
109 | void ocfs2_unlock_global_qf(struct ocfs2_mem_dqinfo *oinfo, int ex); | ||
110 | int ocfs2_read_quota_block(struct inode *inode, u64 v_block, | ||
111 | struct buffer_head **bh); | ||
112 | |||
113 | extern struct dquot_operations ocfs2_quota_operations; | ||
114 | extern struct quota_format_type ocfs2_quota_format; | ||
115 | |||
116 | int ocfs2_quota_setup(void); | ||
117 | void ocfs2_quota_shutdown(void); | ||
118 | |||
119 | #endif /* _OCFS2_QUOTA_H */ | ||