xref: /openbmc/linux/fs/ocfs2/quota_local.c (revision 7dd65feb)
1 /*
2  *  Implementation of operations over local quota file
3  */
4 
5 #include <linux/fs.h>
6 #include <linux/quota.h>
7 #include <linux/quotaops.h>
8 #include <linux/module.h>
9 
10 #define MLOG_MASK_PREFIX ML_QUOTA
11 #include <cluster/masklog.h>
12 
13 #include "ocfs2_fs.h"
14 #include "ocfs2.h"
15 #include "inode.h"
16 #include "alloc.h"
17 #include "file.h"
18 #include "buffer_head_io.h"
19 #include "journal.h"
20 #include "sysfile.h"
21 #include "dlmglue.h"
22 #include "quota.h"
23 #include "uptodate.h"
24 
25 /* Number of local quota structures per block */
26 static inline unsigned int ol_quota_entries_per_block(struct super_block *sb)
27 {
28 	return ((sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE) /
29 		sizeof(struct ocfs2_local_disk_dqblk));
30 }
31 
32 /* Number of blocks with entries in one chunk */
33 static inline unsigned int ol_chunk_blocks(struct super_block *sb)
34 {
35 	return ((sb->s_blocksize - sizeof(struct ocfs2_local_disk_chunk) -
36 		 OCFS2_QBLK_RESERVED_SPACE) << 3) /
37 	       ol_quota_entries_per_block(sb);
38 }
39 
40 /* Number of entries in a chunk bitmap */
41 static unsigned int ol_chunk_entries(struct super_block *sb)
42 {
43 	return ol_chunk_blocks(sb) * ol_quota_entries_per_block(sb);
44 }
45 
46 /* Offset of the chunk in quota file */
47 static unsigned int ol_quota_chunk_block(struct super_block *sb, int c)
48 {
49 	/* 1 block for local quota file info, 1 block per chunk for chunk info */
50 	return 1 + (ol_chunk_blocks(sb) + 1) * c;
51 }
52 
53 static unsigned int ol_dqblk_block(struct super_block *sb, int c, int off)
54 {
55 	int epb = ol_quota_entries_per_block(sb);
56 
57 	return ol_quota_chunk_block(sb, c) + 1 + off / epb;
58 }
59 
60 static unsigned int ol_dqblk_block_off(struct super_block *sb, int c, int off)
61 {
62 	int epb = ol_quota_entries_per_block(sb);
63 
64 	return (off % epb) * sizeof(struct ocfs2_local_disk_dqblk);
65 }
66 
67 /* Offset of the dquot structure in the quota file */
68 static loff_t ol_dqblk_off(struct super_block *sb, int c, int off)
69 {
70 	return (ol_dqblk_block(sb, c, off) << sb->s_blocksize_bits) +
71 	       ol_dqblk_block_off(sb, c, off);
72 }
73 
74 /* Compute block number from given offset */
75 static inline unsigned int ol_dqblk_file_block(struct super_block *sb, loff_t off)
76 {
77 	return off >> sb->s_blocksize_bits;
78 }
79 
80 static inline unsigned int ol_dqblk_block_offset(struct super_block *sb, loff_t off)
81 {
82 	return off & ((1 << sb->s_blocksize_bits) - 1);
83 }
84 
85 /* Compute offset in the chunk of a structure with the given offset */
86 static int ol_dqblk_chunk_off(struct super_block *sb, int c, loff_t off)
87 {
88 	int epb = ol_quota_entries_per_block(sb);
89 
90 	return ((off >> sb->s_blocksize_bits) -
91 			ol_quota_chunk_block(sb, c) - 1) * epb
92 	       + ((unsigned int)(off & ((1 << sb->s_blocksize_bits) - 1))) /
93 		 sizeof(struct ocfs2_local_disk_dqblk);
94 }
95 
96 /* Write bufferhead into the fs */
97 static int ocfs2_modify_bh(struct inode *inode, struct buffer_head *bh,
98 		void (*modify)(struct buffer_head *, void *), void *private)
99 {
100 	struct super_block *sb = inode->i_sb;
101 	handle_t *handle;
102 	int status;
103 
104 	handle = ocfs2_start_trans(OCFS2_SB(sb),
105 				   OCFS2_QUOTA_BLOCK_UPDATE_CREDITS);
106 	if (IS_ERR(handle)) {
107 		status = PTR_ERR(handle);
108 		mlog_errno(status);
109 		return status;
110 	}
111 	status = ocfs2_journal_access_dq(handle, INODE_CACHE(inode), bh,
112 					 OCFS2_JOURNAL_ACCESS_WRITE);
113 	if (status < 0) {
114 		mlog_errno(status);
115 		ocfs2_commit_trans(OCFS2_SB(sb), handle);
116 		return status;
117 	}
118 	lock_buffer(bh);
119 	modify(bh, private);
120 	unlock_buffer(bh);
121 	status = ocfs2_journal_dirty(handle, bh);
122 	if (status < 0) {
123 		mlog_errno(status);
124 		ocfs2_commit_trans(OCFS2_SB(sb), handle);
125 		return status;
126 	}
127 	status = ocfs2_commit_trans(OCFS2_SB(sb), handle);
128 	if (status < 0) {
129 		mlog_errno(status);
130 		return status;
131 	}
132 	return 0;
133 }
134 
135 /* Check whether we understand format of quota files */
136 static int ocfs2_local_check_quota_file(struct super_block *sb, int type)
137 {
138 	unsigned int lmagics[MAXQUOTAS] = OCFS2_LOCAL_QMAGICS;
139 	unsigned int lversions[MAXQUOTAS] = OCFS2_LOCAL_QVERSIONS;
140 	unsigned int gmagics[MAXQUOTAS] = OCFS2_GLOBAL_QMAGICS;
141 	unsigned int gversions[MAXQUOTAS] = OCFS2_GLOBAL_QVERSIONS;
142 	unsigned int ino[MAXQUOTAS] = { USER_QUOTA_SYSTEM_INODE,
143 					GROUP_QUOTA_SYSTEM_INODE };
144 	struct buffer_head *bh = NULL;
145 	struct inode *linode = sb_dqopt(sb)->files[type];
146 	struct inode *ginode = NULL;
147 	struct ocfs2_disk_dqheader *dqhead;
148 	int status, ret = 0;
149 
150 	/* First check whether we understand local quota file */
151 	status = ocfs2_read_quota_block(linode, 0, &bh);
152 	if (status) {
153 		mlog_errno(status);
154 		mlog(ML_ERROR, "failed to read quota file header (type=%d)\n",
155 			type);
156 		goto out_err;
157 	}
158 	dqhead = (struct ocfs2_disk_dqheader *)(bh->b_data);
159 	if (le32_to_cpu(dqhead->dqh_magic) != lmagics[type]) {
160 		mlog(ML_ERROR, "quota file magic does not match (%u != %u),"
161 			" type=%d\n", le32_to_cpu(dqhead->dqh_magic),
162 			lmagics[type], type);
163 		goto out_err;
164 	}
165 	if (le32_to_cpu(dqhead->dqh_version) != lversions[type]) {
166 		mlog(ML_ERROR, "quota file version does not match (%u != %u),"
167 			" type=%d\n", le32_to_cpu(dqhead->dqh_version),
168 			lversions[type], type);
169 		goto out_err;
170 	}
171 	brelse(bh);
172 	bh = NULL;
173 
174 	/* Next check whether we understand global quota file */
175 	ginode = ocfs2_get_system_file_inode(OCFS2_SB(sb), ino[type],
176 						OCFS2_INVALID_SLOT);
177 	if (!ginode) {
178 		mlog(ML_ERROR, "cannot get global quota file inode "
179 				"(type=%d)\n", type);
180 		goto out_err;
181 	}
182 	/* Since the header is read only, we don't care about locking */
183 	status = ocfs2_read_quota_block(ginode, 0, &bh);
184 	if (status) {
185 		mlog_errno(status);
186 		mlog(ML_ERROR, "failed to read global quota file header "
187 				"(type=%d)\n", type);
188 		goto out_err;
189 	}
190 	dqhead = (struct ocfs2_disk_dqheader *)(bh->b_data);
191 	if (le32_to_cpu(dqhead->dqh_magic) != gmagics[type]) {
192 		mlog(ML_ERROR, "global quota file magic does not match "
193 			"(%u != %u), type=%d\n",
194 			le32_to_cpu(dqhead->dqh_magic), gmagics[type], type);
195 		goto out_err;
196 	}
197 	if (le32_to_cpu(dqhead->dqh_version) != gversions[type]) {
198 		mlog(ML_ERROR, "global quota file version does not match "
199 			"(%u != %u), type=%d\n",
200 			le32_to_cpu(dqhead->dqh_version), gversions[type],
201 			type);
202 		goto out_err;
203 	}
204 
205 	ret = 1;
206 out_err:
207 	brelse(bh);
208 	iput(ginode);
209 	return ret;
210 }
211 
212 /* Release given list of quota file chunks */
213 static void ocfs2_release_local_quota_bitmaps(struct list_head *head)
214 {
215 	struct ocfs2_quota_chunk *pos, *next;
216 
217 	list_for_each_entry_safe(pos, next, head, qc_chunk) {
218 		list_del(&pos->qc_chunk);
219 		brelse(pos->qc_headerbh);
220 		kmem_cache_free(ocfs2_qf_chunk_cachep, pos);
221 	}
222 }
223 
224 /* Load quota bitmaps into memory */
225 static int ocfs2_load_local_quota_bitmaps(struct inode *inode,
226 			struct ocfs2_local_disk_dqinfo *ldinfo,
227 			struct list_head *head)
228 {
229 	struct ocfs2_quota_chunk *newchunk;
230 	int i, status;
231 
232 	INIT_LIST_HEAD(head);
233 	for (i = 0; i < le32_to_cpu(ldinfo->dqi_chunks); i++) {
234 		newchunk = kmem_cache_alloc(ocfs2_qf_chunk_cachep, GFP_NOFS);
235 		if (!newchunk) {
236 			ocfs2_release_local_quota_bitmaps(head);
237 			return -ENOMEM;
238 		}
239 		newchunk->qc_num = i;
240 		newchunk->qc_headerbh = NULL;
241 		status = ocfs2_read_quota_block(inode,
242 				ol_quota_chunk_block(inode->i_sb, i),
243 				&newchunk->qc_headerbh);
244 		if (status) {
245 			mlog_errno(status);
246 			kmem_cache_free(ocfs2_qf_chunk_cachep, newchunk);
247 			ocfs2_release_local_quota_bitmaps(head);
248 			return status;
249 		}
250 		list_add_tail(&newchunk->qc_chunk, head);
251 	}
252 	return 0;
253 }
254 
255 static void olq_update_info(struct buffer_head *bh, void *private)
256 {
257 	struct mem_dqinfo *info = private;
258 	struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
259 	struct ocfs2_local_disk_dqinfo *ldinfo;
260 
261 	ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data +
262 						OCFS2_LOCAL_INFO_OFF);
263 	spin_lock(&dq_data_lock);
264 	ldinfo->dqi_flags = cpu_to_le32(info->dqi_flags & DQF_MASK);
265 	ldinfo->dqi_chunks = cpu_to_le32(oinfo->dqi_chunks);
266 	ldinfo->dqi_blocks = cpu_to_le32(oinfo->dqi_blocks);
267 	spin_unlock(&dq_data_lock);
268 }
269 
270 static int ocfs2_add_recovery_chunk(struct super_block *sb,
271 				    struct ocfs2_local_disk_chunk *dchunk,
272 				    int chunk,
273 				    struct list_head *head)
274 {
275 	struct ocfs2_recovery_chunk *rc;
276 
277 	rc = kmalloc(sizeof(struct ocfs2_recovery_chunk), GFP_NOFS);
278 	if (!rc)
279 		return -ENOMEM;
280 	rc->rc_chunk = chunk;
281 	rc->rc_bitmap = kmalloc(sb->s_blocksize, GFP_NOFS);
282 	if (!rc->rc_bitmap) {
283 		kfree(rc);
284 		return -ENOMEM;
285 	}
286 	memcpy(rc->rc_bitmap, dchunk->dqc_bitmap,
287 	       (ol_chunk_entries(sb) + 7) >> 3);
288 	list_add_tail(&rc->rc_list, head);
289 	return 0;
290 }
291 
292 static void free_recovery_list(struct list_head *head)
293 {
294 	struct ocfs2_recovery_chunk *next;
295 	struct ocfs2_recovery_chunk *rchunk;
296 
297 	list_for_each_entry_safe(rchunk, next, head, rc_list) {
298 		list_del(&rchunk->rc_list);
299 		kfree(rchunk->rc_bitmap);
300 		kfree(rchunk);
301 	}
302 }
303 
304 void ocfs2_free_quota_recovery(struct ocfs2_quota_recovery *rec)
305 {
306 	int type;
307 
308 	for (type = 0; type < MAXQUOTAS; type++)
309 		free_recovery_list(&(rec->r_list[type]));
310 	kfree(rec);
311 }
312 
313 /* Load entries in our quota file we have to recover*/
314 static int ocfs2_recovery_load_quota(struct inode *lqinode,
315 				     struct ocfs2_local_disk_dqinfo *ldinfo,
316 				     int type,
317 				     struct list_head *head)
318 {
319 	struct super_block *sb = lqinode->i_sb;
320 	struct buffer_head *hbh;
321 	struct ocfs2_local_disk_chunk *dchunk;
322 	int i, chunks = le32_to_cpu(ldinfo->dqi_chunks);
323 	int status = 0;
324 
325 	for (i = 0; i < chunks; i++) {
326 		hbh = NULL;
327 		status = ocfs2_read_quota_block(lqinode,
328 						ol_quota_chunk_block(sb, i),
329 						&hbh);
330 		if (status) {
331 			mlog_errno(status);
332 			break;
333 		}
334 		dchunk = (struct ocfs2_local_disk_chunk *)hbh->b_data;
335 		if (le32_to_cpu(dchunk->dqc_free) < ol_chunk_entries(sb))
336 			status = ocfs2_add_recovery_chunk(sb, dchunk, i, head);
337 		brelse(hbh);
338 		if (status < 0)
339 			break;
340 	}
341 	if (status < 0)
342 		free_recovery_list(head);
343 	return status;
344 }
345 
346 static struct ocfs2_quota_recovery *ocfs2_alloc_quota_recovery(void)
347 {
348 	int type;
349 	struct ocfs2_quota_recovery *rec;
350 
351 	rec = kmalloc(sizeof(struct ocfs2_quota_recovery), GFP_NOFS);
352 	if (!rec)
353 		return NULL;
354 	for (type = 0; type < MAXQUOTAS; type++)
355 		INIT_LIST_HEAD(&(rec->r_list[type]));
356 	return rec;
357 }
358 
359 /* Load information we need for quota recovery into memory */
360 struct ocfs2_quota_recovery *ocfs2_begin_quota_recovery(
361 						struct ocfs2_super *osb,
362 						int slot_num)
363 {
364 	unsigned int feature[MAXQUOTAS] = { OCFS2_FEATURE_RO_COMPAT_USRQUOTA,
365 					    OCFS2_FEATURE_RO_COMPAT_GRPQUOTA};
366 	unsigned int ino[MAXQUOTAS] = { LOCAL_USER_QUOTA_SYSTEM_INODE,
367 					LOCAL_GROUP_QUOTA_SYSTEM_INODE };
368 	struct super_block *sb = osb->sb;
369 	struct ocfs2_local_disk_dqinfo *ldinfo;
370 	struct inode *lqinode;
371 	struct buffer_head *bh;
372 	int type;
373 	int status = 0;
374 	struct ocfs2_quota_recovery *rec;
375 
376 	mlog(ML_NOTICE, "Beginning quota recovery in slot %u\n", slot_num);
377 	rec = ocfs2_alloc_quota_recovery();
378 	if (!rec)
379 		return ERR_PTR(-ENOMEM);
380 	/* First init... */
381 
382 	for (type = 0; type < MAXQUOTAS; type++) {
383 		if (!OCFS2_HAS_RO_COMPAT_FEATURE(sb, feature[type]))
384 			continue;
385 		/* At this point, journal of the slot is already replayed so
386 		 * we can trust metadata and data of the quota file */
387 		lqinode = ocfs2_get_system_file_inode(osb, ino[type], slot_num);
388 		if (!lqinode) {
389 			status = -ENOENT;
390 			goto out;
391 		}
392 		status = ocfs2_inode_lock_full(lqinode, NULL, 1,
393 					       OCFS2_META_LOCK_RECOVERY);
394 		if (status < 0) {
395 			mlog_errno(status);
396 			goto out_put;
397 		}
398 		/* Now read local header */
399 		bh = NULL;
400 		status = ocfs2_read_quota_block(lqinode, 0, &bh);
401 		if (status) {
402 			mlog_errno(status);
403 			mlog(ML_ERROR, "failed to read quota file info header "
404 				"(slot=%d type=%d)\n", slot_num, type);
405 			goto out_lock;
406 		}
407 		ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data +
408 							OCFS2_LOCAL_INFO_OFF);
409 		status = ocfs2_recovery_load_quota(lqinode, ldinfo, type,
410 						   &rec->r_list[type]);
411 		brelse(bh);
412 out_lock:
413 		ocfs2_inode_unlock(lqinode, 1);
414 out_put:
415 		iput(lqinode);
416 		if (status < 0)
417 			break;
418 	}
419 out:
420 	if (status < 0) {
421 		ocfs2_free_quota_recovery(rec);
422 		rec = ERR_PTR(status);
423 	}
424 	return rec;
425 }
426 
427 /* Sync changes in local quota file into global quota file and
428  * reinitialize local quota file.
429  * The function expects local quota file to be already locked and
430  * dqonoff_mutex locked. */
431 static int ocfs2_recover_local_quota_file(struct inode *lqinode,
432 					  int type,
433 					  struct ocfs2_quota_recovery *rec)
434 {
435 	struct super_block *sb = lqinode->i_sb;
436 	struct ocfs2_mem_dqinfo *oinfo = sb_dqinfo(sb, type)->dqi_priv;
437 	struct ocfs2_local_disk_chunk *dchunk;
438 	struct ocfs2_local_disk_dqblk *dqblk;
439 	struct dquot *dquot;
440 	handle_t *handle;
441 	struct buffer_head *hbh = NULL, *qbh = NULL;
442 	int status = 0;
443 	int bit, chunk;
444 	struct ocfs2_recovery_chunk *rchunk, *next;
445 	qsize_t spacechange, inodechange;
446 
447 	mlog_entry("ino=%lu type=%u", (unsigned long)lqinode->i_ino, type);
448 
449 	list_for_each_entry_safe(rchunk, next, &(rec->r_list[type]), rc_list) {
450 		chunk = rchunk->rc_chunk;
451 		hbh = NULL;
452 		status = ocfs2_read_quota_block(lqinode,
453 						ol_quota_chunk_block(sb, chunk),
454 						&hbh);
455 		if (status) {
456 			mlog_errno(status);
457 			break;
458 		}
459 		dchunk = (struct ocfs2_local_disk_chunk *)hbh->b_data;
460 		for_each_bit(bit, rchunk->rc_bitmap, ol_chunk_entries(sb)) {
461 			qbh = NULL;
462 			status = ocfs2_read_quota_block(lqinode,
463 						ol_dqblk_block(sb, chunk, bit),
464 						&qbh);
465 			if (status) {
466 				mlog_errno(status);
467 				break;
468 			}
469 			dqblk = (struct ocfs2_local_disk_dqblk *)(qbh->b_data +
470 				ol_dqblk_block_off(sb, chunk, bit));
471 			dquot = dqget(sb, le64_to_cpu(dqblk->dqb_id), type);
472 			if (!dquot) {
473 				status = -EIO;
474 				mlog(ML_ERROR, "Failed to get quota structure "
475 				     "for id %u, type %d. Cannot finish quota "
476 				     "file recovery.\n",
477 				     (unsigned)le64_to_cpu(dqblk->dqb_id),
478 				     type);
479 				goto out_put_bh;
480 			}
481 			status = ocfs2_lock_global_qf(oinfo, 1);
482 			if (status < 0) {
483 				mlog_errno(status);
484 				goto out_put_dquot;
485 			}
486 
487 			handle = ocfs2_start_trans(OCFS2_SB(sb),
488 						   OCFS2_QSYNC_CREDITS);
489 			if (IS_ERR(handle)) {
490 				status = PTR_ERR(handle);
491 				mlog_errno(status);
492 				goto out_drop_lock;
493 			}
494 			mutex_lock(&sb_dqopt(sb)->dqio_mutex);
495 			spin_lock(&dq_data_lock);
496 			/* Add usage from quota entry into quota changes
497 			 * of our node. Auxiliary variables are important
498 			 * due to signedness */
499 			spacechange = le64_to_cpu(dqblk->dqb_spacemod);
500 			inodechange = le64_to_cpu(dqblk->dqb_inodemod);
501 			dquot->dq_dqb.dqb_curspace += spacechange;
502 			dquot->dq_dqb.dqb_curinodes += inodechange;
503 			spin_unlock(&dq_data_lock);
504 			/* We want to drop reference held by the crashed
505 			 * node. Since we have our own reference we know
506 			 * global structure actually won't be freed. */
507 			status = ocfs2_global_release_dquot(dquot);
508 			if (status < 0) {
509 				mlog_errno(status);
510 				goto out_commit;
511 			}
512 			/* Release local quota file entry */
513 			status = ocfs2_journal_access_dq(handle,
514 					INODE_CACHE(lqinode),
515 					qbh, OCFS2_JOURNAL_ACCESS_WRITE);
516 			if (status < 0) {
517 				mlog_errno(status);
518 				goto out_commit;
519 			}
520 			lock_buffer(qbh);
521 			WARN_ON(!ocfs2_test_bit(bit, dchunk->dqc_bitmap));
522 			ocfs2_clear_bit(bit, dchunk->dqc_bitmap);
523 			le32_add_cpu(&dchunk->dqc_free, 1);
524 			unlock_buffer(qbh);
525 			status = ocfs2_journal_dirty(handle, qbh);
526 			if (status < 0)
527 				mlog_errno(status);
528 out_commit:
529 			mutex_unlock(&sb_dqopt(sb)->dqio_mutex);
530 			ocfs2_commit_trans(OCFS2_SB(sb), handle);
531 out_drop_lock:
532 			ocfs2_unlock_global_qf(oinfo, 1);
533 out_put_dquot:
534 			dqput(dquot);
535 out_put_bh:
536 			brelse(qbh);
537 			if (status < 0)
538 				break;
539 		}
540 		brelse(hbh);
541 		list_del(&rchunk->rc_list);
542 		kfree(rchunk->rc_bitmap);
543 		kfree(rchunk);
544 		if (status < 0)
545 			break;
546 	}
547 	if (status < 0)
548 		free_recovery_list(&(rec->r_list[type]));
549 	mlog_exit(status);
550 	return status;
551 }
552 
553 /* Recover local quota files for given node different from us */
554 int ocfs2_finish_quota_recovery(struct ocfs2_super *osb,
555 				struct ocfs2_quota_recovery *rec,
556 				int slot_num)
557 {
558 	unsigned int ino[MAXQUOTAS] = { LOCAL_USER_QUOTA_SYSTEM_INODE,
559 					LOCAL_GROUP_QUOTA_SYSTEM_INODE };
560 	struct super_block *sb = osb->sb;
561 	struct ocfs2_local_disk_dqinfo *ldinfo;
562 	struct buffer_head *bh;
563 	handle_t *handle;
564 	int type;
565 	int status = 0;
566 	struct inode *lqinode;
567 	unsigned int flags;
568 
569 	mlog(ML_NOTICE, "Finishing quota recovery in slot %u\n", slot_num);
570 	mutex_lock(&sb_dqopt(sb)->dqonoff_mutex);
571 	for (type = 0; type < MAXQUOTAS; type++) {
572 		if (list_empty(&(rec->r_list[type])))
573 			continue;
574 		mlog(0, "Recovering quota in slot %d\n", slot_num);
575 		lqinode = ocfs2_get_system_file_inode(osb, ino[type], slot_num);
576 		if (!lqinode) {
577 			status = -ENOENT;
578 			goto out;
579 		}
580 		status = ocfs2_inode_lock_full(lqinode, NULL, 1,
581 						       OCFS2_META_LOCK_NOQUEUE);
582 		/* Someone else is holding the lock? Then he must be
583 		 * doing the recovery. Just skip the file... */
584 		if (status == -EAGAIN) {
585 			mlog(ML_NOTICE, "skipping quota recovery for slot %d "
586 			     "because quota file is locked.\n", slot_num);
587 			status = 0;
588 			goto out_put;
589 		} else if (status < 0) {
590 			mlog_errno(status);
591 			goto out_put;
592 		}
593 		/* Now read local header */
594 		bh = NULL;
595 		status = ocfs2_read_quota_block(lqinode, 0, &bh);
596 		if (status) {
597 			mlog_errno(status);
598 			mlog(ML_ERROR, "failed to read quota file info header "
599 				"(slot=%d type=%d)\n", slot_num, type);
600 			goto out_lock;
601 		}
602 		ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data +
603 							OCFS2_LOCAL_INFO_OFF);
604 		/* Is recovery still needed? */
605 		flags = le32_to_cpu(ldinfo->dqi_flags);
606 		if (!(flags & OLQF_CLEAN))
607 			status = ocfs2_recover_local_quota_file(lqinode,
608 								type,
609 								rec);
610 		/* We don't want to mark file as clean when it is actually
611 		 * active */
612 		if (slot_num == osb->slot_num)
613 			goto out_bh;
614 		/* Mark quota file as clean if we are recovering quota file of
615 		 * some other node. */
616 		handle = ocfs2_start_trans(osb,
617 					   OCFS2_LOCAL_QINFO_WRITE_CREDITS);
618 		if (IS_ERR(handle)) {
619 			status = PTR_ERR(handle);
620 			mlog_errno(status);
621 			goto out_bh;
622 		}
623 		status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode),
624 						 bh,
625 						 OCFS2_JOURNAL_ACCESS_WRITE);
626 		if (status < 0) {
627 			mlog_errno(status);
628 			goto out_trans;
629 		}
630 		lock_buffer(bh);
631 		ldinfo->dqi_flags = cpu_to_le32(flags | OLQF_CLEAN);
632 		unlock_buffer(bh);
633 		status = ocfs2_journal_dirty(handle, bh);
634 		if (status < 0)
635 			mlog_errno(status);
636 out_trans:
637 		ocfs2_commit_trans(osb, handle);
638 out_bh:
639 		brelse(bh);
640 out_lock:
641 		ocfs2_inode_unlock(lqinode, 1);
642 out_put:
643 		iput(lqinode);
644 		if (status < 0)
645 			break;
646 	}
647 out:
648 	mutex_unlock(&sb_dqopt(sb)->dqonoff_mutex);
649 	kfree(rec);
650 	return status;
651 }
652 
653 /* Read information header from quota file */
654 static int ocfs2_local_read_info(struct super_block *sb, int type)
655 {
656 	struct ocfs2_local_disk_dqinfo *ldinfo;
657 	struct mem_dqinfo *info = sb_dqinfo(sb, type);
658 	struct ocfs2_mem_dqinfo *oinfo;
659 	struct inode *lqinode = sb_dqopt(sb)->files[type];
660 	int status;
661 	struct buffer_head *bh = NULL;
662 	struct ocfs2_quota_recovery *rec;
663 	int locked = 0;
664 
665 	/* We don't need the lock and we have to acquire quota file locks
666 	 * which will later depend on this lock */
667 	mutex_unlock(&sb_dqopt(sb)->dqio_mutex);
668 	info->dqi_maxblimit = 0x7fffffffffffffffLL;
669 	info->dqi_maxilimit = 0x7fffffffffffffffLL;
670 	oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS);
671 	if (!oinfo) {
672 		mlog(ML_ERROR, "failed to allocate memory for ocfs2 quota"
673 			       " info.");
674 		goto out_err;
675 	}
676 	info->dqi_priv = oinfo;
677 	oinfo->dqi_type = type;
678 	INIT_LIST_HEAD(&oinfo->dqi_chunk);
679 	oinfo->dqi_rec = NULL;
680 	oinfo->dqi_lqi_bh = NULL;
681 	oinfo->dqi_ibh = NULL;
682 
683 	status = ocfs2_global_read_info(sb, type);
684 	if (status < 0)
685 		goto out_err;
686 
687 	status = ocfs2_inode_lock(lqinode, &oinfo->dqi_lqi_bh, 1);
688 	if (status < 0) {
689 		mlog_errno(status);
690 		goto out_err;
691 	}
692 	locked = 1;
693 
694 	/* Now read local header */
695 	status = ocfs2_read_quota_block(lqinode, 0, &bh);
696 	if (status) {
697 		mlog_errno(status);
698 		mlog(ML_ERROR, "failed to read quota file info header "
699 			"(type=%d)\n", type);
700 		goto out_err;
701 	}
702 	ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data +
703 						OCFS2_LOCAL_INFO_OFF);
704 	info->dqi_flags = le32_to_cpu(ldinfo->dqi_flags);
705 	oinfo->dqi_chunks = le32_to_cpu(ldinfo->dqi_chunks);
706 	oinfo->dqi_blocks = le32_to_cpu(ldinfo->dqi_blocks);
707 	oinfo->dqi_ibh = bh;
708 
709 	/* We crashed when using local quota file? */
710 	if (!(info->dqi_flags & OLQF_CLEAN)) {
711 		rec = OCFS2_SB(sb)->quota_rec;
712 		if (!rec) {
713 			rec = ocfs2_alloc_quota_recovery();
714 			if (!rec) {
715 				status = -ENOMEM;
716 				mlog_errno(status);
717 				goto out_err;
718 			}
719 			OCFS2_SB(sb)->quota_rec = rec;
720 		}
721 
722 		status = ocfs2_recovery_load_quota(lqinode, ldinfo, type,
723                                                    &rec->r_list[type]);
724 		if (status < 0) {
725 			mlog_errno(status);
726 			goto out_err;
727 		}
728 	}
729 
730 	status = ocfs2_load_local_quota_bitmaps(lqinode,
731 						ldinfo,
732 						&oinfo->dqi_chunk);
733 	if (status < 0) {
734 		mlog_errno(status);
735 		goto out_err;
736 	}
737 
738 	/* Now mark quota file as used */
739 	info->dqi_flags &= ~OLQF_CLEAN;
740 	status = ocfs2_modify_bh(lqinode, bh, olq_update_info, info);
741 	if (status < 0) {
742 		mlog_errno(status);
743 		goto out_err;
744 	}
745 
746 	mutex_lock(&sb_dqopt(sb)->dqio_mutex);
747 	return 0;
748 out_err:
749 	if (oinfo) {
750 		iput(oinfo->dqi_gqinode);
751 		ocfs2_simple_drop_lockres(OCFS2_SB(sb), &oinfo->dqi_gqlock);
752 		ocfs2_lock_res_free(&oinfo->dqi_gqlock);
753 		brelse(oinfo->dqi_lqi_bh);
754 		if (locked)
755 			ocfs2_inode_unlock(lqinode, 1);
756 		ocfs2_release_local_quota_bitmaps(&oinfo->dqi_chunk);
757 		kfree(oinfo);
758 	}
759 	brelse(bh);
760 	mutex_lock(&sb_dqopt(sb)->dqio_mutex);
761 	return -1;
762 }
763 
764 /* Write local info to quota file */
765 static int ocfs2_local_write_info(struct super_block *sb, int type)
766 {
767 	struct mem_dqinfo *info = sb_dqinfo(sb, type);
768 	struct buffer_head *bh = ((struct ocfs2_mem_dqinfo *)info->dqi_priv)
769 						->dqi_ibh;
770 	int status;
771 
772 	status = ocfs2_modify_bh(sb_dqopt(sb)->files[type], bh, olq_update_info,
773 				 info);
774 	if (status < 0) {
775 		mlog_errno(status);
776 		return -1;
777 	}
778 
779 	return 0;
780 }
781 
782 /* Release info from memory */
783 static int ocfs2_local_free_info(struct super_block *sb, int type)
784 {
785 	struct mem_dqinfo *info = sb_dqinfo(sb, type);
786 	struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
787 	struct ocfs2_quota_chunk *chunk;
788 	struct ocfs2_local_disk_chunk *dchunk;
789 	int mark_clean = 1, len;
790 	int status;
791 
792 	/* At this point we know there are no more dquots and thus
793 	 * even if there's some sync in the pdflush queue, it won't
794 	 * find any dquots and return without doing anything */
795 	cancel_delayed_work_sync(&oinfo->dqi_sync_work);
796 	iput(oinfo->dqi_gqinode);
797 	ocfs2_simple_drop_lockres(OCFS2_SB(sb), &oinfo->dqi_gqlock);
798 	ocfs2_lock_res_free(&oinfo->dqi_gqlock);
799 	list_for_each_entry(chunk, &oinfo->dqi_chunk, qc_chunk) {
800 		dchunk = (struct ocfs2_local_disk_chunk *)
801 					(chunk->qc_headerbh->b_data);
802 		if (chunk->qc_num < oinfo->dqi_chunks - 1) {
803 			len = ol_chunk_entries(sb);
804 		} else {
805 			len = (oinfo->dqi_blocks -
806 			       ol_quota_chunk_block(sb, chunk->qc_num) - 1)
807 			      * ol_quota_entries_per_block(sb);
808 		}
809 		/* Not all entries free? Bug! */
810 		if (le32_to_cpu(dchunk->dqc_free) != len) {
811 			mlog(ML_ERROR, "releasing quota file with used "
812 					"entries (type=%d)\n", type);
813 			mark_clean = 0;
814 		}
815 	}
816 	ocfs2_release_local_quota_bitmaps(&oinfo->dqi_chunk);
817 
818 	/* dqonoff_mutex protects us against racing with recovery thread... */
819 	if (oinfo->dqi_rec) {
820 		ocfs2_free_quota_recovery(oinfo->dqi_rec);
821 		mark_clean = 0;
822 	}
823 
824 	if (!mark_clean)
825 		goto out;
826 
827 	/* Mark local file as clean */
828 	info->dqi_flags |= OLQF_CLEAN;
829 	status = ocfs2_modify_bh(sb_dqopt(sb)->files[type],
830 				 oinfo->dqi_ibh,
831 				 olq_update_info,
832 				 info);
833 	if (status < 0) {
834 		mlog_errno(status);
835 		goto out;
836 	}
837 
838 out:
839 	ocfs2_inode_unlock(sb_dqopt(sb)->files[type], 1);
840 	brelse(oinfo->dqi_ibh);
841 	brelse(oinfo->dqi_lqi_bh);
842 	kfree(oinfo);
843 	return 0;
844 }
845 
846 static void olq_set_dquot(struct buffer_head *bh, void *private)
847 {
848 	struct ocfs2_dquot *od = private;
849 	struct ocfs2_local_disk_dqblk *dqblk;
850 	struct super_block *sb = od->dq_dquot.dq_sb;
851 
852 	dqblk = (struct ocfs2_local_disk_dqblk *)(bh->b_data
853 		+ ol_dqblk_block_offset(sb, od->dq_local_off));
854 
855 	dqblk->dqb_id = cpu_to_le64(od->dq_dquot.dq_id);
856 	spin_lock(&dq_data_lock);
857 	dqblk->dqb_spacemod = cpu_to_le64(od->dq_dquot.dq_dqb.dqb_curspace -
858 					  od->dq_origspace);
859 	dqblk->dqb_inodemod = cpu_to_le64(od->dq_dquot.dq_dqb.dqb_curinodes -
860 					  od->dq_originodes);
861 	spin_unlock(&dq_data_lock);
862 	mlog(0, "Writing local dquot %u space %lld inodes %lld\n",
863 	     od->dq_dquot.dq_id, (long long)le64_to_cpu(dqblk->dqb_spacemod),
864 	     (long long)le64_to_cpu(dqblk->dqb_inodemod));
865 }
866 
867 /* Write dquot to local quota file */
868 static int ocfs2_local_write_dquot(struct dquot *dquot)
869 {
870 	struct super_block *sb = dquot->dq_sb;
871 	struct ocfs2_dquot *od = OCFS2_DQUOT(dquot);
872 	struct buffer_head *bh = NULL;
873 	int status;
874 
875 	status = ocfs2_read_quota_block(sb_dqopt(sb)->files[dquot->dq_type],
876 				    ol_dqblk_file_block(sb, od->dq_local_off),
877 				    &bh);
878 	if (status) {
879 		mlog_errno(status);
880 		goto out;
881 	}
882 	status = ocfs2_modify_bh(sb_dqopt(sb)->files[dquot->dq_type], bh,
883 				 olq_set_dquot, od);
884 	if (status < 0) {
885 		mlog_errno(status);
886 		goto out;
887 	}
888 out:
889 	brelse(bh);
890 	return status;
891 }
892 
893 /* Find free entry in local quota file */
894 static struct ocfs2_quota_chunk *ocfs2_find_free_entry(struct super_block *sb,
895 						       int type,
896 						       int *offset)
897 {
898 	struct mem_dqinfo *info = sb_dqinfo(sb, type);
899 	struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
900 	struct ocfs2_quota_chunk *chunk;
901 	struct ocfs2_local_disk_chunk *dchunk;
902 	int found = 0, len;
903 
904 	list_for_each_entry(chunk, &oinfo->dqi_chunk, qc_chunk) {
905 		dchunk = (struct ocfs2_local_disk_chunk *)
906 						chunk->qc_headerbh->b_data;
907 		if (le32_to_cpu(dchunk->dqc_free) > 0) {
908 			found = 1;
909 			break;
910 		}
911 	}
912 	if (!found)
913 		return NULL;
914 
915 	if (chunk->qc_num < oinfo->dqi_chunks - 1) {
916 		len = ol_chunk_entries(sb);
917 	} else {
918 		len = (oinfo->dqi_blocks -
919 		       ol_quota_chunk_block(sb, chunk->qc_num) - 1)
920 		      * ol_quota_entries_per_block(sb);
921 	}
922 
923 	found = ocfs2_find_next_zero_bit(dchunk->dqc_bitmap, len, 0);
924 	/* We failed? */
925 	if (found == len) {
926 		mlog(ML_ERROR, "Did not find empty entry in chunk %d with %u"
927 		     " entries free (type=%d)\n", chunk->qc_num,
928 		     le32_to_cpu(dchunk->dqc_free), type);
929 		return ERR_PTR(-EIO);
930 	}
931 	*offset = found;
932 	return chunk;
933 }
934 
935 /* Add new chunk to the local quota file */
936 static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk(
937 							struct super_block *sb,
938 							int type,
939 							int *offset)
940 {
941 	struct mem_dqinfo *info = sb_dqinfo(sb, type);
942 	struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
943 	struct inode *lqinode = sb_dqopt(sb)->files[type];
944 	struct ocfs2_quota_chunk *chunk = NULL;
945 	struct ocfs2_local_disk_chunk *dchunk;
946 	int status;
947 	handle_t *handle;
948 	struct buffer_head *bh = NULL, *dbh = NULL;
949 	u64 p_blkno;
950 
951 	/* We are protected by dqio_sem so no locking needed */
952 	status = ocfs2_extend_no_holes(lqinode,
953 				       lqinode->i_size + 2 * sb->s_blocksize,
954 				       lqinode->i_size);
955 	if (status < 0) {
956 		mlog_errno(status);
957 		goto out;
958 	}
959 	status = ocfs2_simple_size_update(lqinode, oinfo->dqi_lqi_bh,
960 					  lqinode->i_size + 2 * sb->s_blocksize);
961 	if (status < 0) {
962 		mlog_errno(status);
963 		goto out;
964 	}
965 
966 	chunk = kmem_cache_alloc(ocfs2_qf_chunk_cachep, GFP_NOFS);
967 	if (!chunk) {
968 		status = -ENOMEM;
969 		mlog_errno(status);
970 		goto out;
971 	}
972 	/* Local quota info and two new blocks we initialize */
973 	handle = ocfs2_start_trans(OCFS2_SB(sb),
974 			OCFS2_LOCAL_QINFO_WRITE_CREDITS +
975 			2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS);
976 	if (IS_ERR(handle)) {
977 		status = PTR_ERR(handle);
978 		mlog_errno(status);
979 		goto out;
980 	}
981 
982 	/* Initialize chunk header */
983 	down_read(&OCFS2_I(lqinode)->ip_alloc_sem);
984 	status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks,
985 					     &p_blkno, NULL, NULL);
986 	up_read(&OCFS2_I(lqinode)->ip_alloc_sem);
987 	if (status < 0) {
988 		mlog_errno(status);
989 		goto out_trans;
990 	}
991 	bh = sb_getblk(sb, p_blkno);
992 	if (!bh) {
993 		status = -ENOMEM;
994 		mlog_errno(status);
995 		goto out_trans;
996 	}
997 	dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data;
998 	ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), bh);
999 	status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode), bh,
1000 					 OCFS2_JOURNAL_ACCESS_CREATE);
1001 	if (status < 0) {
1002 		mlog_errno(status);
1003 		goto out_trans;
1004 	}
1005 	lock_buffer(bh);
1006 	dchunk->dqc_free = cpu_to_le32(ol_quota_entries_per_block(sb));
1007 	memset(dchunk->dqc_bitmap, 0,
1008 	       sb->s_blocksize - sizeof(struct ocfs2_local_disk_chunk) -
1009 	       OCFS2_QBLK_RESERVED_SPACE);
1010 	unlock_buffer(bh);
1011 	status = ocfs2_journal_dirty(handle, bh);
1012 	if (status < 0) {
1013 		mlog_errno(status);
1014 		goto out_trans;
1015 	}
1016 
1017 	/* Initialize new block with structures */
1018 	down_read(&OCFS2_I(lqinode)->ip_alloc_sem);
1019 	status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks + 1,
1020 					     &p_blkno, NULL, NULL);
1021 	up_read(&OCFS2_I(lqinode)->ip_alloc_sem);
1022 	if (status < 0) {
1023 		mlog_errno(status);
1024 		goto out_trans;
1025 	}
1026 	dbh = sb_getblk(sb, p_blkno);
1027 	if (!dbh) {
1028 		status = -ENOMEM;
1029 		mlog_errno(status);
1030 		goto out_trans;
1031 	}
1032 	ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), dbh);
1033 	status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode), dbh,
1034 					 OCFS2_JOURNAL_ACCESS_CREATE);
1035 	if (status < 0) {
1036 		mlog_errno(status);
1037 		goto out_trans;
1038 	}
1039 	lock_buffer(dbh);
1040 	memset(dbh->b_data, 0, sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE);
1041 	unlock_buffer(dbh);
1042 	status = ocfs2_journal_dirty(handle, dbh);
1043 	if (status < 0) {
1044 		mlog_errno(status);
1045 		goto out_trans;
1046 	}
1047 
1048 	/* Update local quotafile info */
1049 	oinfo->dqi_blocks += 2;
1050 	oinfo->dqi_chunks++;
1051 	status = ocfs2_local_write_info(sb, type);
1052 	if (status < 0) {
1053 		mlog_errno(status);
1054 		goto out_trans;
1055 	}
1056 	status = ocfs2_commit_trans(OCFS2_SB(sb), handle);
1057 	if (status < 0) {
1058 		mlog_errno(status);
1059 		goto out;
1060 	}
1061 
1062 	list_add_tail(&chunk->qc_chunk, &oinfo->dqi_chunk);
1063 	chunk->qc_num = list_entry(chunk->qc_chunk.prev,
1064 				   struct ocfs2_quota_chunk,
1065 				   qc_chunk)->qc_num + 1;
1066 	chunk->qc_headerbh = bh;
1067 	*offset = 0;
1068 	return chunk;
1069 out_trans:
1070 	ocfs2_commit_trans(OCFS2_SB(sb), handle);
1071 out:
1072 	brelse(bh);
1073 	brelse(dbh);
1074 	kmem_cache_free(ocfs2_qf_chunk_cachep, chunk);
1075 	return ERR_PTR(status);
1076 }
1077 
1078 /* Find free entry in local quota file */
1079 static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file(
1080 						       struct super_block *sb,
1081 						       int type,
1082 						       int *offset)
1083 {
1084 	struct mem_dqinfo *info = sb_dqinfo(sb, type);
1085 	struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
1086 	struct ocfs2_quota_chunk *chunk;
1087 	struct inode *lqinode = sb_dqopt(sb)->files[type];
1088 	struct ocfs2_local_disk_chunk *dchunk;
1089 	int epb = ol_quota_entries_per_block(sb);
1090 	unsigned int chunk_blocks;
1091 	struct buffer_head *bh;
1092 	u64 p_blkno;
1093 	int status;
1094 	handle_t *handle;
1095 
1096 	if (list_empty(&oinfo->dqi_chunk))
1097 		return ocfs2_local_quota_add_chunk(sb, type, offset);
1098 	/* Is the last chunk full? */
1099 	chunk = list_entry(oinfo->dqi_chunk.prev,
1100 			struct ocfs2_quota_chunk, qc_chunk);
1101 	chunk_blocks = oinfo->dqi_blocks -
1102 			ol_quota_chunk_block(sb, chunk->qc_num) - 1;
1103 	if (ol_chunk_blocks(sb) == chunk_blocks)
1104 		return ocfs2_local_quota_add_chunk(sb, type, offset);
1105 
1106 	/* We are protected by dqio_sem so no locking needed */
1107 	status = ocfs2_extend_no_holes(lqinode,
1108 				       lqinode->i_size + sb->s_blocksize,
1109 				       lqinode->i_size);
1110 	if (status < 0) {
1111 		mlog_errno(status);
1112 		goto out;
1113 	}
1114 	status = ocfs2_simple_size_update(lqinode, oinfo->dqi_lqi_bh,
1115 					  lqinode->i_size + sb->s_blocksize);
1116 	if (status < 0) {
1117 		mlog_errno(status);
1118 		goto out;
1119 	}
1120 
1121 	/* Get buffer from the just added block */
1122 	down_read(&OCFS2_I(lqinode)->ip_alloc_sem);
1123 	status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks,
1124 					     &p_blkno, NULL, NULL);
1125 	up_read(&OCFS2_I(lqinode)->ip_alloc_sem);
1126 	if (status < 0) {
1127 		mlog_errno(status);
1128 		goto out;
1129 	}
1130 	bh = sb_getblk(sb, p_blkno);
1131 	if (!bh) {
1132 		status = -ENOMEM;
1133 		mlog_errno(status);
1134 		goto out;
1135 	}
1136 	ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), bh);
1137 
1138 	/* Local quota info, chunk header and the new block we initialize */
1139 	handle = ocfs2_start_trans(OCFS2_SB(sb),
1140 			OCFS2_LOCAL_QINFO_WRITE_CREDITS +
1141 			2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS);
1142 	if (IS_ERR(handle)) {
1143 		status = PTR_ERR(handle);
1144 		mlog_errno(status);
1145 		goto out;
1146 	}
1147 	/* Zero created block */
1148 	status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode), bh,
1149 				 OCFS2_JOURNAL_ACCESS_CREATE);
1150 	if (status < 0) {
1151 		mlog_errno(status);
1152 		goto out_trans;
1153 	}
1154 	lock_buffer(bh);
1155 	memset(bh->b_data, 0, sb->s_blocksize);
1156 	unlock_buffer(bh);
1157 	status = ocfs2_journal_dirty(handle, bh);
1158 	if (status < 0) {
1159 		mlog_errno(status);
1160 		goto out_trans;
1161 	}
1162 	/* Update chunk header */
1163 	status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode),
1164 					 chunk->qc_headerbh,
1165 				 OCFS2_JOURNAL_ACCESS_WRITE);
1166 	if (status < 0) {
1167 		mlog_errno(status);
1168 		goto out_trans;
1169 	}
1170 
1171 	dchunk = (struct ocfs2_local_disk_chunk *)chunk->qc_headerbh->b_data;
1172 	lock_buffer(chunk->qc_headerbh);
1173 	le32_add_cpu(&dchunk->dqc_free, ol_quota_entries_per_block(sb));
1174 	unlock_buffer(chunk->qc_headerbh);
1175 	status = ocfs2_journal_dirty(handle, chunk->qc_headerbh);
1176 	if (status < 0) {
1177 		mlog_errno(status);
1178 		goto out_trans;
1179 	}
1180 	/* Update file header */
1181 	oinfo->dqi_blocks++;
1182 	status = ocfs2_local_write_info(sb, type);
1183 	if (status < 0) {
1184 		mlog_errno(status);
1185 		goto out_trans;
1186 	}
1187 
1188 	status = ocfs2_commit_trans(OCFS2_SB(sb), handle);
1189 	if (status < 0) {
1190 		mlog_errno(status);
1191 		goto out;
1192 	}
1193 	*offset = chunk_blocks * epb;
1194 	return chunk;
1195 out_trans:
1196 	ocfs2_commit_trans(OCFS2_SB(sb), handle);
1197 out:
1198 	return ERR_PTR(status);
1199 }
1200 
1201 static void olq_alloc_dquot(struct buffer_head *bh, void *private)
1202 {
1203 	int *offset = private;
1204 	struct ocfs2_local_disk_chunk *dchunk;
1205 
1206 	dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data;
1207 	ocfs2_set_bit(*offset, dchunk->dqc_bitmap);
1208 	le32_add_cpu(&dchunk->dqc_free, -1);
1209 }
1210 
1211 /* Create dquot in the local file for given id */
1212 static int ocfs2_create_local_dquot(struct dquot *dquot)
1213 {
1214 	struct super_block *sb = dquot->dq_sb;
1215 	int type = dquot->dq_type;
1216 	struct inode *lqinode = sb_dqopt(sb)->files[type];
1217 	struct ocfs2_quota_chunk *chunk;
1218 	struct ocfs2_dquot *od = OCFS2_DQUOT(dquot);
1219 	int offset;
1220 	int status;
1221 
1222 	chunk = ocfs2_find_free_entry(sb, type, &offset);
1223 	if (!chunk) {
1224 		chunk = ocfs2_extend_local_quota_file(sb, type, &offset);
1225 		if (IS_ERR(chunk))
1226 			return PTR_ERR(chunk);
1227 	} else if (IS_ERR(chunk)) {
1228 		return PTR_ERR(chunk);
1229 	}
1230 	od->dq_local_off = ol_dqblk_off(sb, chunk->qc_num, offset);
1231 	od->dq_chunk = chunk;
1232 
1233 	/* Initialize dquot structure on disk */
1234 	status = ocfs2_local_write_dquot(dquot);
1235 	if (status < 0) {
1236 		mlog_errno(status);
1237 		goto out;
1238 	}
1239 
1240 	/* Mark structure as allocated */
1241 	status = ocfs2_modify_bh(lqinode, chunk->qc_headerbh, olq_alloc_dquot,
1242 				 &offset);
1243 	if (status < 0) {
1244 		mlog_errno(status);
1245 		goto out;
1246 	}
1247 out:
1248 	return status;
1249 }
1250 
1251 /* Create entry in local file for dquot, load data from the global file */
1252 static int ocfs2_local_read_dquot(struct dquot *dquot)
1253 {
1254 	int status;
1255 
1256 	mlog_entry("id=%u, type=%d\n", dquot->dq_id, dquot->dq_type);
1257 
1258 	status = ocfs2_global_read_dquot(dquot);
1259 	if (status < 0) {
1260 		mlog_errno(status);
1261 		goto out_err;
1262 	}
1263 
1264 	/* Now create entry in the local quota file */
1265 	status = ocfs2_create_local_dquot(dquot);
1266 	if (status < 0) {
1267 		mlog_errno(status);
1268 		goto out_err;
1269 	}
1270 	mlog_exit(0);
1271 	return 0;
1272 out_err:
1273 	mlog_exit(status);
1274 	return status;
1275 }
1276 
1277 /* Release dquot structure from local quota file. ocfs2_release_dquot() has
1278  * already started a transaction and obtained exclusive lock for global
1279  * quota file. */
1280 static int ocfs2_local_release_dquot(struct dquot *dquot)
1281 {
1282 	int status;
1283 	int type = dquot->dq_type;
1284 	struct ocfs2_dquot *od = OCFS2_DQUOT(dquot);
1285 	struct super_block *sb = dquot->dq_sb;
1286 	struct ocfs2_local_disk_chunk *dchunk;
1287 	int offset;
1288 	handle_t *handle = journal_current_handle();
1289 
1290 	BUG_ON(!handle);
1291 	/* First write all local changes to global file */
1292 	status = ocfs2_global_release_dquot(dquot);
1293 	if (status < 0) {
1294 		mlog_errno(status);
1295 		goto out;
1296 	}
1297 
1298 	status = ocfs2_journal_access_dq(handle,
1299 			INODE_CACHE(sb_dqopt(sb)->files[type]),
1300 			od->dq_chunk->qc_headerbh, OCFS2_JOURNAL_ACCESS_WRITE);
1301 	if (status < 0) {
1302 		mlog_errno(status);
1303 		goto out;
1304 	}
1305 	offset = ol_dqblk_chunk_off(sb, od->dq_chunk->qc_num,
1306 					     od->dq_local_off);
1307 	dchunk = (struct ocfs2_local_disk_chunk *)
1308 			(od->dq_chunk->qc_headerbh->b_data);
1309 	/* Mark structure as freed */
1310 	lock_buffer(od->dq_chunk->qc_headerbh);
1311 	ocfs2_clear_bit(offset, dchunk->dqc_bitmap);
1312 	le32_add_cpu(&dchunk->dqc_free, 1);
1313 	unlock_buffer(od->dq_chunk->qc_headerbh);
1314 	status = ocfs2_journal_dirty(handle, od->dq_chunk->qc_headerbh);
1315 	if (status < 0) {
1316 		mlog_errno(status);
1317 		goto out;
1318 	}
1319 	status = 0;
1320 out:
1321 	/* Clear the read bit so that next time someone uses this
1322 	 * dquot he reads fresh info from disk and allocates local
1323 	 * dquot structure */
1324 	clear_bit(DQ_READ_B, &dquot->dq_flags);
1325 	return status;
1326 }
1327 
1328 static const struct quota_format_ops ocfs2_format_ops = {
1329 	.check_quota_file	= ocfs2_local_check_quota_file,
1330 	.read_file_info		= ocfs2_local_read_info,
1331 	.write_file_info	= ocfs2_global_write_info,
1332 	.free_file_info		= ocfs2_local_free_info,
1333 	.read_dqblk		= ocfs2_local_read_dquot,
1334 	.commit_dqblk		= ocfs2_local_write_dquot,
1335 	.release_dqblk		= ocfs2_local_release_dquot,
1336 };
1337 
1338 struct quota_format_type ocfs2_quota_format = {
1339 	.qf_fmt_id = QFMT_OCFS2,
1340 	.qf_ops = &ocfs2_format_ops,
1341 	.qf_owner = THIS_MODULE
1342 };
1343