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