1 /* 2 * Definitions for diskquota-operations. When diskquota is configured these 3 * macros expand to the right source-code. 4 * 5 * Author: Marco van Wieringen <[email protected]> 6 */ 7 #ifndef _LINUX_QUOTAOPS_ 8 #define _LINUX_QUOTAOPS_ 9 10 #include <linux/fs.h> 11 12 #define DQUOT_SPACE_WARN 0x1 13 #define DQUOT_SPACE_RESERVE 0x2 14 #define DQUOT_SPACE_NOFAIL 0x4 15 16 static inline struct quota_info *sb_dqopt(struct super_block *sb) 17 { 18 return &sb->s_dquot; 19 } 20 21 /* i_mutex must being held */ 22 static inline bool is_quota_modification(struct inode *inode, struct iattr *ia) 23 { 24 return (ia->ia_valid & ATTR_SIZE && ia->ia_size != inode->i_size) || 25 (ia->ia_valid & ATTR_UID && ia->ia_uid != inode->i_uid) || 26 (ia->ia_valid & ATTR_GID && ia->ia_gid != inode->i_gid); 27 } 28 29 #if defined(CONFIG_QUOTA) 30 31 #define quota_error(sb, fmt, args...) \ 32 __quota_error((sb), __func__, fmt , ## args) 33 34 extern __attribute__((format (printf, 3, 4))) 35 void __quota_error(struct super_block *sb, const char *func, 36 const char *fmt, ...); 37 38 /* 39 * declaration of quota_function calls in kernel. 40 */ 41 void inode_add_rsv_space(struct inode *inode, qsize_t number); 42 void inode_claim_rsv_space(struct inode *inode, qsize_t number); 43 void inode_sub_rsv_space(struct inode *inode, qsize_t number); 44 45 void dquot_initialize(struct inode *inode); 46 void dquot_drop(struct inode *inode); 47 struct dquot *dqget(struct super_block *sb, unsigned int id, int type); 48 void dqput(struct dquot *dquot); 49 int dquot_scan_active(struct super_block *sb, 50 int (*fn)(struct dquot *dquot, unsigned long priv), 51 unsigned long priv); 52 struct dquot *dquot_alloc(struct super_block *sb, int type); 53 void dquot_destroy(struct dquot *dquot); 54 55 int __dquot_alloc_space(struct inode *inode, qsize_t number, int flags); 56 void __dquot_free_space(struct inode *inode, qsize_t number, int flags); 57 58 int dquot_alloc_inode(const struct inode *inode); 59 60 int dquot_claim_space_nodirty(struct inode *inode, qsize_t number); 61 void dquot_free_inode(const struct inode *inode); 62 63 int dquot_disable(struct super_block *sb, int type, unsigned int flags); 64 /* Suspend quotas on remount RO */ 65 static inline int dquot_suspend(struct super_block *sb, int type) 66 { 67 return dquot_disable(sb, type, DQUOT_SUSPENDED); 68 } 69 int dquot_resume(struct super_block *sb, int type); 70 71 int dquot_commit(struct dquot *dquot); 72 int dquot_acquire(struct dquot *dquot); 73 int dquot_release(struct dquot *dquot); 74 int dquot_commit_info(struct super_block *sb, int type); 75 int dquot_mark_dquot_dirty(struct dquot *dquot); 76 77 int dquot_file_open(struct inode *inode, struct file *file); 78 79 int dquot_quota_on(struct super_block *sb, int type, int format_id, 80 char *path); 81 int dquot_enable(struct inode *inode, int type, int format_id, 82 unsigned int flags); 83 int dquot_quota_on_path(struct super_block *sb, int type, int format_id, 84 struct path *path); 85 int dquot_quota_on_mount(struct super_block *sb, char *qf_name, 86 int format_id, int type); 87 int dquot_quota_off(struct super_block *sb, int type); 88 int dquot_quota_sync(struct super_block *sb, int type, int wait); 89 int dquot_get_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); 90 int dquot_set_dqinfo(struct super_block *sb, int type, struct if_dqinfo *ii); 91 int dquot_get_dqblk(struct super_block *sb, int type, qid_t id, 92 struct fs_disk_quota *di); 93 int dquot_set_dqblk(struct super_block *sb, int type, qid_t id, 94 struct fs_disk_quota *di); 95 96 int __dquot_transfer(struct inode *inode, struct dquot **transfer_to); 97 int dquot_transfer(struct inode *inode, struct iattr *iattr); 98 99 static inline struct mem_dqinfo *sb_dqinfo(struct super_block *sb, int type) 100 { 101 return sb_dqopt(sb)->info + type; 102 } 103 104 /* 105 * Functions for checking status of quota 106 */ 107 108 static inline bool sb_has_quota_usage_enabled(struct super_block *sb, int type) 109 { 110 return sb_dqopt(sb)->flags & 111 dquot_state_flag(DQUOT_USAGE_ENABLED, type); 112 } 113 114 static inline bool sb_has_quota_limits_enabled(struct super_block *sb, int type) 115 { 116 return sb_dqopt(sb)->flags & 117 dquot_state_flag(DQUOT_LIMITS_ENABLED, type); 118 } 119 120 static inline bool sb_has_quota_suspended(struct super_block *sb, int type) 121 { 122 return sb_dqopt(sb)->flags & 123 dquot_state_flag(DQUOT_SUSPENDED, type); 124 } 125 126 static inline unsigned sb_any_quota_suspended(struct super_block *sb) 127 { 128 unsigned type, tmsk = 0; 129 for (type = 0; type < MAXQUOTAS; type++) 130 tmsk |= sb_has_quota_suspended(sb, type) << type; 131 return tmsk; 132 } 133 134 /* Does kernel know about any quota information for given sb + type? */ 135 static inline bool sb_has_quota_loaded(struct super_block *sb, int type) 136 { 137 /* Currently if anything is on, then quota usage is on as well */ 138 return sb_has_quota_usage_enabled(sb, type); 139 } 140 141 static inline unsigned sb_any_quota_loaded(struct super_block *sb) 142 { 143 unsigned type, tmsk = 0; 144 for (type = 0; type < MAXQUOTAS; type++) 145 tmsk |= sb_has_quota_loaded(sb, type) << type; 146 return tmsk; 147 } 148 149 static inline bool sb_has_quota_active(struct super_block *sb, int type) 150 { 151 return sb_has_quota_loaded(sb, type) && 152 !sb_has_quota_suspended(sb, type); 153 } 154 155 /* 156 * Operations supported for diskquotas. 157 */ 158 extern const struct dquot_operations dquot_operations; 159 extern const struct quotactl_ops dquot_quotactl_ops; 160 161 #else 162 163 static inline int sb_has_quota_usage_enabled(struct super_block *sb, int type) 164 { 165 return 0; 166 } 167 168 static inline int sb_has_quota_limits_enabled(struct super_block *sb, int type) 169 { 170 return 0; 171 } 172 173 static inline int sb_has_quota_suspended(struct super_block *sb, int type) 174 { 175 return 0; 176 } 177 178 static inline int sb_any_quota_suspended(struct super_block *sb) 179 { 180 return 0; 181 } 182 183 /* Does kernel know about any quota information for given sb + type? */ 184 static inline int sb_has_quota_loaded(struct super_block *sb, int type) 185 { 186 return 0; 187 } 188 189 static inline int sb_any_quota_loaded(struct super_block *sb) 190 { 191 return 0; 192 } 193 194 static inline int sb_has_quota_active(struct super_block *sb, int type) 195 { 196 return 0; 197 } 198 199 static inline void dquot_initialize(struct inode *inode) 200 { 201 } 202 203 static inline void dquot_drop(struct inode *inode) 204 { 205 } 206 207 static inline int dquot_alloc_inode(const struct inode *inode) 208 { 209 return 0; 210 } 211 212 static inline void dquot_free_inode(const struct inode *inode) 213 { 214 } 215 216 static inline int dquot_transfer(struct inode *inode, struct iattr *iattr) 217 { 218 return 0; 219 } 220 221 static inline int __dquot_alloc_space(struct inode *inode, qsize_t number, 222 int flags) 223 { 224 if (!(flags & DQUOT_SPACE_RESERVE)) 225 inode_add_bytes(inode, number); 226 return 0; 227 } 228 229 static inline void __dquot_free_space(struct inode *inode, qsize_t number, 230 int flags) 231 { 232 if (!(flags & DQUOT_SPACE_RESERVE)) 233 inode_sub_bytes(inode, number); 234 } 235 236 static inline int dquot_claim_space_nodirty(struct inode *inode, qsize_t number) 237 { 238 inode_add_bytes(inode, number); 239 return 0; 240 } 241 242 static inline int dquot_disable(struct super_block *sb, int type, 243 unsigned int flags) 244 { 245 return 0; 246 } 247 248 static inline int dquot_suspend(struct super_block *sb, int type) 249 { 250 return 0; 251 } 252 253 static inline int dquot_resume(struct super_block *sb, int type) 254 { 255 return 0; 256 } 257 258 #define dquot_file_open generic_file_open 259 260 #endif /* CONFIG_QUOTA */ 261 262 static inline int dquot_alloc_space_nodirty(struct inode *inode, qsize_t nr) 263 { 264 return __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN); 265 } 266 267 static inline void dquot_alloc_space_nofail(struct inode *inode, qsize_t nr) 268 { 269 __dquot_alloc_space(inode, nr, DQUOT_SPACE_WARN|DQUOT_SPACE_NOFAIL); 270 mark_inode_dirty_sync(inode); 271 } 272 273 static inline int dquot_alloc_space(struct inode *inode, qsize_t nr) 274 { 275 int ret; 276 277 ret = dquot_alloc_space_nodirty(inode, nr); 278 if (!ret) { 279 /* 280 * Mark inode fully dirty. Since we are allocating blocks, inode 281 * would become fully dirty soon anyway and it reportedly 282 * reduces inode_lock contention. 283 */ 284 mark_inode_dirty(inode); 285 } 286 return ret; 287 } 288 289 static inline int dquot_alloc_block_nodirty(struct inode *inode, qsize_t nr) 290 { 291 return dquot_alloc_space_nodirty(inode, nr << inode->i_blkbits); 292 } 293 294 static inline void dquot_alloc_block_nofail(struct inode *inode, qsize_t nr) 295 { 296 dquot_alloc_space_nofail(inode, nr << inode->i_blkbits); 297 } 298 299 static inline int dquot_alloc_block(struct inode *inode, qsize_t nr) 300 { 301 return dquot_alloc_space(inode, nr << inode->i_blkbits); 302 } 303 304 static inline int dquot_prealloc_block_nodirty(struct inode *inode, qsize_t nr) 305 { 306 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 0); 307 } 308 309 static inline int dquot_prealloc_block(struct inode *inode, qsize_t nr) 310 { 311 int ret; 312 313 ret = dquot_prealloc_block_nodirty(inode, nr); 314 if (!ret) 315 mark_inode_dirty_sync(inode); 316 return ret; 317 } 318 319 static inline int dquot_reserve_block(struct inode *inode, qsize_t nr) 320 { 321 return __dquot_alloc_space(inode, nr << inode->i_blkbits, 322 DQUOT_SPACE_WARN|DQUOT_SPACE_RESERVE); 323 } 324 325 static inline int dquot_claim_block(struct inode *inode, qsize_t nr) 326 { 327 int ret; 328 329 ret = dquot_claim_space_nodirty(inode, nr << inode->i_blkbits); 330 if (!ret) 331 mark_inode_dirty_sync(inode); 332 return ret; 333 } 334 335 static inline void dquot_free_space_nodirty(struct inode *inode, qsize_t nr) 336 { 337 __dquot_free_space(inode, nr, 0); 338 } 339 340 static inline void dquot_free_space(struct inode *inode, qsize_t nr) 341 { 342 dquot_free_space_nodirty(inode, nr); 343 mark_inode_dirty_sync(inode); 344 } 345 346 static inline void dquot_free_block_nodirty(struct inode *inode, qsize_t nr) 347 { 348 dquot_free_space_nodirty(inode, nr << inode->i_blkbits); 349 } 350 351 static inline void dquot_free_block(struct inode *inode, qsize_t nr) 352 { 353 dquot_free_space(inode, nr << inode->i_blkbits); 354 } 355 356 static inline void dquot_release_reservation_block(struct inode *inode, 357 qsize_t nr) 358 { 359 __dquot_free_space(inode, nr << inode->i_blkbits, DQUOT_SPACE_RESERVE); 360 } 361 362 #endif /* _LINUX_QUOTAOPS_ */ 363