GNU Linux-libre 4.14.262-gnu1
[releases.git] / fs / ocfs2 / quota_local.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *  Implementation of operations over local quota file
4  */
5
6 #include <linux/fs.h>
7 #include <linux/slab.h>
8 #include <linux/quota.h>
9 #include <linux/quotaops.h>
10 #include <linux/module.h>
11
12 #include <cluster/masklog.h>
13
14 #include "ocfs2_fs.h"
15 #include "ocfs2.h"
16 #include "inode.h"
17 #include "alloc.h"
18 #include "file.h"
19 #include "buffer_head_io.h"
20 #include "journal.h"
21 #include "sysfile.h"
22 #include "dlmglue.h"
23 #include "quota.h"
24 #include "uptodate.h"
25 #include "super.h"
26 #include "ocfs2_trace.h"
27
28 /* Number of local quota structures per block */
29 static inline unsigned int ol_quota_entries_per_block(struct super_block *sb)
30 {
31         return ((sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE) /
32                 sizeof(struct ocfs2_local_disk_dqblk));
33 }
34
35 /* Number of blocks with entries in one chunk */
36 static inline unsigned int ol_chunk_blocks(struct super_block *sb)
37 {
38         return ((sb->s_blocksize - sizeof(struct ocfs2_local_disk_chunk) -
39                  OCFS2_QBLK_RESERVED_SPACE) << 3) /
40                ol_quota_entries_per_block(sb);
41 }
42
43 /* Number of entries in a chunk bitmap */
44 static unsigned int ol_chunk_entries(struct super_block *sb)
45 {
46         return ol_chunk_blocks(sb) * ol_quota_entries_per_block(sb);
47 }
48
49 /* Offset of the chunk in quota file */
50 static unsigned int ol_quota_chunk_block(struct super_block *sb, int c)
51 {
52         /* 1 block for local quota file info, 1 block per chunk for chunk info */
53         return 1 + (ol_chunk_blocks(sb) + 1) * c;
54 }
55
56 static unsigned int ol_dqblk_block(struct super_block *sb, int c, int off)
57 {
58         int epb = ol_quota_entries_per_block(sb);
59
60         return ol_quota_chunk_block(sb, c) + 1 + off / epb;
61 }
62
63 static unsigned int ol_dqblk_block_off(struct super_block *sb, int c, int off)
64 {
65         int epb = ol_quota_entries_per_block(sb);
66
67         return (off % epb) * sizeof(struct ocfs2_local_disk_dqblk);
68 }
69
70 /* Offset of the dquot structure in the quota file */
71 static loff_t ol_dqblk_off(struct super_block *sb, int c, int off)
72 {
73         return (ol_dqblk_block(sb, c, off) << sb->s_blocksize_bits) +
74                ol_dqblk_block_off(sb, c, off);
75 }
76
77 static inline unsigned int ol_dqblk_block_offset(struct super_block *sb, loff_t off)
78 {
79         return off & ((1 << sb->s_blocksize_bits) - 1);
80 }
81
82 /* Compute offset in the chunk of a structure with the given offset */
83 static int ol_dqblk_chunk_off(struct super_block *sb, int c, loff_t off)
84 {
85         int epb = ol_quota_entries_per_block(sb);
86
87         return ((off >> sb->s_blocksize_bits) -
88                         ol_quota_chunk_block(sb, c) - 1) * epb
89                + ((unsigned int)(off & ((1 << sb->s_blocksize_bits) - 1))) /
90                  sizeof(struct ocfs2_local_disk_dqblk);
91 }
92
93 /* Write bufferhead into the fs */
94 static int ocfs2_modify_bh(struct inode *inode, struct buffer_head *bh,
95                 void (*modify)(struct buffer_head *, void *), void *private)
96 {
97         struct super_block *sb = inode->i_sb;
98         handle_t *handle;
99         int status;
100
101         handle = ocfs2_start_trans(OCFS2_SB(sb),
102                                    OCFS2_QUOTA_BLOCK_UPDATE_CREDITS);
103         if (IS_ERR(handle)) {
104                 status = PTR_ERR(handle);
105                 mlog_errno(status);
106                 return status;
107         }
108         status = ocfs2_journal_access_dq(handle, INODE_CACHE(inode), bh,
109                                          OCFS2_JOURNAL_ACCESS_WRITE);
110         if (status < 0) {
111                 mlog_errno(status);
112                 ocfs2_commit_trans(OCFS2_SB(sb), handle);
113                 return status;
114         }
115         lock_buffer(bh);
116         modify(bh, private);
117         unlock_buffer(bh);
118         ocfs2_journal_dirty(handle, bh);
119
120         status = ocfs2_commit_trans(OCFS2_SB(sb), handle);
121         if (status < 0) {
122                 mlog_errno(status);
123                 return status;
124         }
125         return 0;
126 }
127
128 /*
129  * Read quota block from a given logical offset.
130  *
131  * This function acquires ip_alloc_sem and thus it must not be called with a
132  * transaction started.
133  */
134 static int ocfs2_read_quota_block(struct inode *inode, u64 v_block,
135                                   struct buffer_head **bh)
136 {
137         int rc = 0;
138         struct buffer_head *tmp = *bh;
139
140         if (i_size_read(inode) >> inode->i_sb->s_blocksize_bits <= v_block) {
141                 ocfs2_error(inode->i_sb,
142                             "Quota file %llu is probably corrupted! Requested 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  * s_umount locked in shared mode. */
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 (IS_ERR(dquot)) {
503                                 status = PTR_ERR(dquot);
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                         down_write(&sb_dqopt(sb)->dqio_sem);
525                         spin_lock(&dquot->dq_dqb_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(&dquot->dq_dqb_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                         up_write(&sb_dqopt(sb)->dqio_sem);
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         down_read(&sb->s_umount);
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         up_read(&sb->s_umount);
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         info->dqi_max_spc_limit = 0x7fffffffffffffffLL;
696         info->dqi_max_ino_limit = 0x7fffffffffffffffLL;
697         oinfo = kmalloc(sizeof(struct ocfs2_mem_dqinfo), GFP_NOFS);
698         if (!oinfo) {
699                 mlog(ML_ERROR, "failed to allocate memory for ocfs2 quota"
700                                " info.");
701                 goto out_err;
702         }
703         info->dqi_priv = oinfo;
704         oinfo->dqi_type = type;
705         INIT_LIST_HEAD(&oinfo->dqi_chunk);
706         oinfo->dqi_rec = NULL;
707         oinfo->dqi_lqi_bh = NULL;
708         oinfo->dqi_libh = NULL;
709
710         status = ocfs2_global_read_info(sb, type);
711         if (status < 0)
712                 goto out_err;
713
714         status = ocfs2_inode_lock(lqinode, &oinfo->dqi_lqi_bh, 1);
715         if (status < 0) {
716                 mlog_errno(status);
717                 goto out_err;
718         }
719         locked = 1;
720
721         /* Now read local header */
722         status = ocfs2_read_quota_block(lqinode, 0, &bh);
723         if (status) {
724                 mlog_errno(status);
725                 mlog(ML_ERROR, "failed to read quota file info header "
726                         "(type=%d)\n", type);
727                 goto out_err;
728         }
729         ldinfo = (struct ocfs2_local_disk_dqinfo *)(bh->b_data +
730                                                 OCFS2_LOCAL_INFO_OFF);
731         oinfo->dqi_flags = le32_to_cpu(ldinfo->dqi_flags);
732         oinfo->dqi_chunks = le32_to_cpu(ldinfo->dqi_chunks);
733         oinfo->dqi_blocks = le32_to_cpu(ldinfo->dqi_blocks);
734         oinfo->dqi_libh = bh;
735
736         /* We crashed when using local quota file? */
737         if (!(oinfo->dqi_flags & OLQF_CLEAN)) {
738                 rec = OCFS2_SB(sb)->quota_rec;
739                 if (!rec) {
740                         rec = ocfs2_alloc_quota_recovery();
741                         if (!rec) {
742                                 status = -ENOMEM;
743                                 mlog_errno(status);
744                                 goto out_err;
745                         }
746                         OCFS2_SB(sb)->quota_rec = rec;
747                 }
748
749                 status = ocfs2_recovery_load_quota(lqinode, ldinfo, type,
750                                                    &rec->r_list[type]);
751                 if (status < 0) {
752                         mlog_errno(status);
753                         goto out_err;
754                 }
755         }
756
757         status = ocfs2_load_local_quota_bitmaps(lqinode,
758                                                 ldinfo,
759                                                 &oinfo->dqi_chunk);
760         if (status < 0) {
761                 mlog_errno(status);
762                 goto out_err;
763         }
764
765         /* Now mark quota file as used */
766         oinfo->dqi_flags &= ~OLQF_CLEAN;
767         status = ocfs2_modify_bh(lqinode, bh, olq_update_info, info);
768         if (status < 0) {
769                 mlog_errno(status);
770                 goto out_err;
771         }
772
773         return 0;
774 out_err:
775         if (oinfo) {
776                 iput(oinfo->dqi_gqinode);
777                 ocfs2_simple_drop_lockres(OCFS2_SB(sb), &oinfo->dqi_gqlock);
778                 ocfs2_lock_res_free(&oinfo->dqi_gqlock);
779                 brelse(oinfo->dqi_lqi_bh);
780                 if (locked)
781                         ocfs2_inode_unlock(lqinode, 1);
782                 ocfs2_release_local_quota_bitmaps(&oinfo->dqi_chunk);
783                 kfree(oinfo);
784         }
785         brelse(bh);
786         return -1;
787 }
788
789 /* Write local info to quota file */
790 static int ocfs2_local_write_info(struct super_block *sb, int type)
791 {
792         struct mem_dqinfo *info = sb_dqinfo(sb, type);
793         struct buffer_head *bh = ((struct ocfs2_mem_dqinfo *)info->dqi_priv)
794                                                 ->dqi_libh;
795         int status;
796
797         status = ocfs2_modify_bh(sb_dqopt(sb)->files[type], bh, olq_update_info,
798                                  info);
799         if (status < 0) {
800                 mlog_errno(status);
801                 return -1;
802         }
803
804         return 0;
805 }
806
807 /* Release info from memory */
808 static int ocfs2_local_free_info(struct super_block *sb, int type)
809 {
810         struct mem_dqinfo *info = sb_dqinfo(sb, type);
811         struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
812         struct ocfs2_quota_chunk *chunk;
813         struct ocfs2_local_disk_chunk *dchunk;
814         int mark_clean = 1, len;
815         int status;
816
817         iput(oinfo->dqi_gqinode);
818         ocfs2_simple_drop_lockres(OCFS2_SB(sb), &oinfo->dqi_gqlock);
819         ocfs2_lock_res_free(&oinfo->dqi_gqlock);
820         list_for_each_entry(chunk, &oinfo->dqi_chunk, qc_chunk) {
821                 dchunk = (struct ocfs2_local_disk_chunk *)
822                                         (chunk->qc_headerbh->b_data);
823                 if (chunk->qc_num < oinfo->dqi_chunks - 1) {
824                         len = ol_chunk_entries(sb);
825                 } else {
826                         len = (oinfo->dqi_blocks -
827                                ol_quota_chunk_block(sb, chunk->qc_num) - 1)
828                               * ol_quota_entries_per_block(sb);
829                 }
830                 /* Not all entries free? Bug! */
831                 if (le32_to_cpu(dchunk->dqc_free) != len) {
832                         mlog(ML_ERROR, "releasing quota file with used "
833                                         "entries (type=%d)\n", type);
834                         mark_clean = 0;
835                 }
836         }
837         ocfs2_release_local_quota_bitmaps(&oinfo->dqi_chunk);
838
839         /*
840          * s_umount held in exclusive mode protects us against racing with
841          * recovery thread...
842          */
843         if (oinfo->dqi_rec) {
844                 ocfs2_free_quota_recovery(oinfo->dqi_rec);
845                 mark_clean = 0;
846         }
847
848         if (!mark_clean)
849                 goto out;
850
851         /* Mark local file as clean */
852         oinfo->dqi_flags |= OLQF_CLEAN;
853         status = ocfs2_modify_bh(sb_dqopt(sb)->files[type],
854                                  oinfo->dqi_libh,
855                                  olq_update_info,
856                                  info);
857         if (status < 0) {
858                 mlog_errno(status);
859                 goto out;
860         }
861
862 out:
863         ocfs2_inode_unlock(sb_dqopt(sb)->files[type], 1);
864         brelse(oinfo->dqi_libh);
865         brelse(oinfo->dqi_lqi_bh);
866         kfree(oinfo);
867         return 0;
868 }
869
870 static void olq_set_dquot(struct buffer_head *bh, void *private)
871 {
872         struct ocfs2_dquot *od = private;
873         struct ocfs2_local_disk_dqblk *dqblk;
874         struct super_block *sb = od->dq_dquot.dq_sb;
875
876         dqblk = (struct ocfs2_local_disk_dqblk *)(bh->b_data
877                 + ol_dqblk_block_offset(sb, od->dq_local_off));
878
879         dqblk->dqb_id = cpu_to_le64(from_kqid(&init_user_ns,
880                                               od->dq_dquot.dq_id));
881         spin_lock(&od->dq_dquot.dq_dqb_lock);
882         dqblk->dqb_spacemod = cpu_to_le64(od->dq_dquot.dq_dqb.dqb_curspace -
883                                           od->dq_origspace);
884         dqblk->dqb_inodemod = cpu_to_le64(od->dq_dquot.dq_dqb.dqb_curinodes -
885                                           od->dq_originodes);
886         spin_unlock(&od->dq_dquot.dq_dqb_lock);
887         trace_olq_set_dquot(
888                 (unsigned long long)le64_to_cpu(dqblk->dqb_spacemod),
889                 (unsigned long long)le64_to_cpu(dqblk->dqb_inodemod),
890                 from_kqid(&init_user_ns, od->dq_dquot.dq_id));
891 }
892
893 /* Write dquot to local quota file */
894 int ocfs2_local_write_dquot(struct dquot *dquot)
895 {
896         struct super_block *sb = dquot->dq_sb;
897         struct ocfs2_dquot *od = OCFS2_DQUOT(dquot);
898         struct buffer_head *bh;
899         struct inode *lqinode = sb_dqopt(sb)->files[dquot->dq_id.type];
900         int status;
901
902         status = ocfs2_read_quota_phys_block(lqinode, od->dq_local_phys_blk,
903                                              &bh);
904         if (status) {
905                 mlog_errno(status);
906                 goto out;
907         }
908         status = ocfs2_modify_bh(lqinode, bh, olq_set_dquot, od);
909         if (status < 0) {
910                 mlog_errno(status);
911                 goto out;
912         }
913 out:
914         brelse(bh);
915         return status;
916 }
917
918 /* Find free entry in local quota file */
919 static struct ocfs2_quota_chunk *ocfs2_find_free_entry(struct super_block *sb,
920                                                        int type,
921                                                        int *offset)
922 {
923         struct mem_dqinfo *info = sb_dqinfo(sb, type);
924         struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
925         struct ocfs2_quota_chunk *chunk;
926         struct ocfs2_local_disk_chunk *dchunk;
927         int found = 0, len;
928
929         list_for_each_entry(chunk, &oinfo->dqi_chunk, qc_chunk) {
930                 dchunk = (struct ocfs2_local_disk_chunk *)
931                                                 chunk->qc_headerbh->b_data;
932                 if (le32_to_cpu(dchunk->dqc_free) > 0) {
933                         found = 1;
934                         break;
935                 }
936         }
937         if (!found)
938                 return NULL;
939
940         if (chunk->qc_num < oinfo->dqi_chunks - 1) {
941                 len = ol_chunk_entries(sb);
942         } else {
943                 len = (oinfo->dqi_blocks -
944                        ol_quota_chunk_block(sb, chunk->qc_num) - 1)
945                       * ol_quota_entries_per_block(sb);
946         }
947
948         found = ocfs2_find_next_zero_bit_unaligned(dchunk->dqc_bitmap, len, 0);
949         /* We failed? */
950         if (found == len) {
951                 mlog(ML_ERROR, "Did not find empty entry in chunk %d with %u"
952                      " entries free (type=%d)\n", chunk->qc_num,
953                      le32_to_cpu(dchunk->dqc_free), type);
954                 return ERR_PTR(-EIO);
955         }
956         *offset = found;
957         return chunk;
958 }
959
960 /* Add new chunk to the local quota file */
961 static struct ocfs2_quota_chunk *ocfs2_local_quota_add_chunk(
962                                                         struct super_block *sb,
963                                                         int type,
964                                                         int *offset)
965 {
966         struct mem_dqinfo *info = sb_dqinfo(sb, type);
967         struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
968         struct inode *lqinode = sb_dqopt(sb)->files[type];
969         struct ocfs2_quota_chunk *chunk = NULL;
970         struct ocfs2_local_disk_chunk *dchunk;
971         int status;
972         handle_t *handle;
973         struct buffer_head *bh = NULL, *dbh = NULL;
974         u64 p_blkno;
975
976         /* We are protected by dqio_sem so no locking needed */
977         status = ocfs2_extend_no_holes(lqinode, NULL,
978                                        i_size_read(lqinode) + 2 * sb->s_blocksize,
979                                        i_size_read(lqinode));
980         if (status < 0) {
981                 mlog_errno(status);
982                 goto out;
983         }
984         status = ocfs2_simple_size_update(lqinode, oinfo->dqi_lqi_bh,
985                                           i_size_read(lqinode) + 2 * sb->s_blocksize);
986         if (status < 0) {
987                 mlog_errno(status);
988                 goto out;
989         }
990
991         chunk = kmem_cache_alloc(ocfs2_qf_chunk_cachep, GFP_NOFS);
992         if (!chunk) {
993                 status = -ENOMEM;
994                 mlog_errno(status);
995                 goto out;
996         }
997         /* Local quota info and two new blocks we initialize */
998         handle = ocfs2_start_trans(OCFS2_SB(sb),
999                         OCFS2_LOCAL_QINFO_WRITE_CREDITS +
1000                         2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS);
1001         if (IS_ERR(handle)) {
1002                 status = PTR_ERR(handle);
1003                 mlog_errno(status);
1004                 goto out;
1005         }
1006
1007         /* Initialize chunk header */
1008         status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks,
1009                                              &p_blkno, NULL, NULL);
1010         if (status < 0) {
1011                 mlog_errno(status);
1012                 goto out_trans;
1013         }
1014         bh = sb_getblk(sb, p_blkno);
1015         if (!bh) {
1016                 status = -ENOMEM;
1017                 mlog_errno(status);
1018                 goto out_trans;
1019         }
1020         dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data;
1021         ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), bh);
1022         status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode), bh,
1023                                          OCFS2_JOURNAL_ACCESS_CREATE);
1024         if (status < 0) {
1025                 mlog_errno(status);
1026                 goto out_trans;
1027         }
1028         lock_buffer(bh);
1029         dchunk->dqc_free = cpu_to_le32(ol_quota_entries_per_block(sb));
1030         memset(dchunk->dqc_bitmap, 0,
1031                sb->s_blocksize - sizeof(struct ocfs2_local_disk_chunk) -
1032                OCFS2_QBLK_RESERVED_SPACE);
1033         unlock_buffer(bh);
1034         ocfs2_journal_dirty(handle, bh);
1035
1036         /* Initialize new block with structures */
1037         status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks + 1,
1038                                              &p_blkno, NULL, NULL);
1039         if (status < 0) {
1040                 mlog_errno(status);
1041                 goto out_trans;
1042         }
1043         dbh = sb_getblk(sb, p_blkno);
1044         if (!dbh) {
1045                 status = -ENOMEM;
1046                 mlog_errno(status);
1047                 goto out_trans;
1048         }
1049         ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), dbh);
1050         status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode), dbh,
1051                                          OCFS2_JOURNAL_ACCESS_CREATE);
1052         if (status < 0) {
1053                 mlog_errno(status);
1054                 goto out_trans;
1055         }
1056         lock_buffer(dbh);
1057         memset(dbh->b_data, 0, sb->s_blocksize - OCFS2_QBLK_RESERVED_SPACE);
1058         unlock_buffer(dbh);
1059         ocfs2_journal_dirty(handle, dbh);
1060
1061         /* Update local quotafile info */
1062         oinfo->dqi_blocks += 2;
1063         oinfo->dqi_chunks++;
1064         status = ocfs2_local_write_info(sb, type);
1065         if (status < 0) {
1066                 mlog_errno(status);
1067                 goto out_trans;
1068         }
1069         status = ocfs2_commit_trans(OCFS2_SB(sb), handle);
1070         if (status < 0) {
1071                 mlog_errno(status);
1072                 goto out;
1073         }
1074
1075         list_add_tail(&chunk->qc_chunk, &oinfo->dqi_chunk);
1076         chunk->qc_num = list_entry(chunk->qc_chunk.prev,
1077                                    struct ocfs2_quota_chunk,
1078                                    qc_chunk)->qc_num + 1;
1079         chunk->qc_headerbh = bh;
1080         *offset = 0;
1081         return chunk;
1082 out_trans:
1083         ocfs2_commit_trans(OCFS2_SB(sb), handle);
1084 out:
1085         brelse(bh);
1086         brelse(dbh);
1087         kmem_cache_free(ocfs2_qf_chunk_cachep, chunk);
1088         return ERR_PTR(status);
1089 }
1090
1091 /* Find free entry in local quota file */
1092 static struct ocfs2_quota_chunk *ocfs2_extend_local_quota_file(
1093                                                        struct super_block *sb,
1094                                                        int type,
1095                                                        int *offset)
1096 {
1097         struct mem_dqinfo *info = sb_dqinfo(sb, type);
1098         struct ocfs2_mem_dqinfo *oinfo = info->dqi_priv;
1099         struct ocfs2_quota_chunk *chunk;
1100         struct inode *lqinode = sb_dqopt(sb)->files[type];
1101         struct ocfs2_local_disk_chunk *dchunk;
1102         int epb = ol_quota_entries_per_block(sb);
1103         unsigned int chunk_blocks;
1104         struct buffer_head *bh;
1105         u64 p_blkno;
1106         int status;
1107         handle_t *handle;
1108
1109         if (list_empty(&oinfo->dqi_chunk))
1110                 return ocfs2_local_quota_add_chunk(sb, type, offset);
1111         /* Is the last chunk full? */
1112         chunk = list_entry(oinfo->dqi_chunk.prev,
1113                         struct ocfs2_quota_chunk, qc_chunk);
1114         chunk_blocks = oinfo->dqi_blocks -
1115                         ol_quota_chunk_block(sb, chunk->qc_num) - 1;
1116         if (ol_chunk_blocks(sb) == chunk_blocks)
1117                 return ocfs2_local_quota_add_chunk(sb, type, offset);
1118
1119         /* We are protected by dqio_sem so no locking needed */
1120         status = ocfs2_extend_no_holes(lqinode, NULL,
1121                                        i_size_read(lqinode) + sb->s_blocksize,
1122                                        i_size_read(lqinode));
1123         if (status < 0) {
1124                 mlog_errno(status);
1125                 goto out;
1126         }
1127         status = ocfs2_simple_size_update(lqinode, oinfo->dqi_lqi_bh,
1128                                           i_size_read(lqinode) + sb->s_blocksize);
1129         if (status < 0) {
1130                 mlog_errno(status);
1131                 goto out;
1132         }
1133
1134         /* Get buffer from the just added block */
1135         status = ocfs2_extent_map_get_blocks(lqinode, oinfo->dqi_blocks,
1136                                              &p_blkno, NULL, NULL);
1137         if (status < 0) {
1138                 mlog_errno(status);
1139                 goto out;
1140         }
1141         bh = sb_getblk(sb, p_blkno);
1142         if (!bh) {
1143                 status = -ENOMEM;
1144                 mlog_errno(status);
1145                 goto out;
1146         }
1147         ocfs2_set_new_buffer_uptodate(INODE_CACHE(lqinode), bh);
1148
1149         /* Local quota info, chunk header and the new block we initialize */
1150         handle = ocfs2_start_trans(OCFS2_SB(sb),
1151                         OCFS2_LOCAL_QINFO_WRITE_CREDITS +
1152                         2 * OCFS2_QUOTA_BLOCK_UPDATE_CREDITS);
1153         if (IS_ERR(handle)) {
1154                 status = PTR_ERR(handle);
1155                 mlog_errno(status);
1156                 goto out;
1157         }
1158         /* Zero created block */
1159         status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode), bh,
1160                                  OCFS2_JOURNAL_ACCESS_CREATE);
1161         if (status < 0) {
1162                 mlog_errno(status);
1163                 goto out_trans;
1164         }
1165         lock_buffer(bh);
1166         memset(bh->b_data, 0, sb->s_blocksize);
1167         unlock_buffer(bh);
1168         ocfs2_journal_dirty(handle, bh);
1169
1170         /* Update chunk header */
1171         status = ocfs2_journal_access_dq(handle, INODE_CACHE(lqinode),
1172                                          chunk->qc_headerbh,
1173                                  OCFS2_JOURNAL_ACCESS_WRITE);
1174         if (status < 0) {
1175                 mlog_errno(status);
1176                 goto out_trans;
1177         }
1178
1179         dchunk = (struct ocfs2_local_disk_chunk *)chunk->qc_headerbh->b_data;
1180         lock_buffer(chunk->qc_headerbh);
1181         le32_add_cpu(&dchunk->dqc_free, ol_quota_entries_per_block(sb));
1182         unlock_buffer(chunk->qc_headerbh);
1183         ocfs2_journal_dirty(handle, chunk->qc_headerbh);
1184
1185         /* Update file header */
1186         oinfo->dqi_blocks++;
1187         status = ocfs2_local_write_info(sb, type);
1188         if (status < 0) {
1189                 mlog_errno(status);
1190                 goto out_trans;
1191         }
1192
1193         status = ocfs2_commit_trans(OCFS2_SB(sb), handle);
1194         if (status < 0) {
1195                 mlog_errno(status);
1196                 goto out;
1197         }
1198         *offset = chunk_blocks * epb;
1199         return chunk;
1200 out_trans:
1201         ocfs2_commit_trans(OCFS2_SB(sb), handle);
1202 out:
1203         return ERR_PTR(status);
1204 }
1205
1206 static void olq_alloc_dquot(struct buffer_head *bh, void *private)
1207 {
1208         int *offset = private;
1209         struct ocfs2_local_disk_chunk *dchunk;
1210
1211         dchunk = (struct ocfs2_local_disk_chunk *)bh->b_data;
1212         ocfs2_set_bit_unaligned(*offset, dchunk->dqc_bitmap);
1213         le32_add_cpu(&dchunk->dqc_free, -1);
1214 }
1215
1216 /* Create dquot in the local file for given id */
1217 int ocfs2_create_local_dquot(struct dquot *dquot)
1218 {
1219         struct super_block *sb = dquot->dq_sb;
1220         int type = dquot->dq_id.type;
1221         struct inode *lqinode = sb_dqopt(sb)->files[type];
1222         struct ocfs2_quota_chunk *chunk;
1223         struct ocfs2_dquot *od = OCFS2_DQUOT(dquot);
1224         int offset;
1225         int status;
1226         u64 pcount;
1227
1228         down_write(&OCFS2_I(lqinode)->ip_alloc_sem);
1229         chunk = ocfs2_find_free_entry(sb, type, &offset);
1230         if (!chunk) {
1231                 chunk = ocfs2_extend_local_quota_file(sb, type, &offset);
1232                 if (IS_ERR(chunk)) {
1233                         status = PTR_ERR(chunk);
1234                         goto out;
1235                 }
1236         } else if (IS_ERR(chunk)) {
1237                 status = PTR_ERR(chunk);
1238                 goto out;
1239         }
1240         od->dq_local_off = ol_dqblk_off(sb, chunk->qc_num, offset);
1241         od->dq_chunk = chunk;
1242         status = ocfs2_extent_map_get_blocks(lqinode,
1243                                      ol_dqblk_block(sb, chunk->qc_num, offset),
1244                                      &od->dq_local_phys_blk,
1245                                      &pcount,
1246                                      NULL);
1247
1248         /* Initialize dquot structure on disk */
1249         status = ocfs2_local_write_dquot(dquot);
1250         if (status < 0) {
1251                 mlog_errno(status);
1252                 goto out;
1253         }
1254
1255         /* Mark structure as allocated */
1256         status = ocfs2_modify_bh(lqinode, chunk->qc_headerbh, olq_alloc_dquot,
1257                                  &offset);
1258         if (status < 0) {
1259                 mlog_errno(status);
1260                 goto out;
1261         }
1262 out:
1263         up_write(&OCFS2_I(lqinode)->ip_alloc_sem);
1264         return status;
1265 }
1266
1267 /*
1268  * Release dquot structure from local quota file. ocfs2_release_dquot() has
1269  * already started a transaction and written all changes to global quota file
1270  */
1271 int ocfs2_local_release_dquot(handle_t *handle, struct dquot *dquot)
1272 {
1273         int status;
1274         int type = dquot->dq_id.type;
1275         struct ocfs2_dquot *od = OCFS2_DQUOT(dquot);
1276         struct super_block *sb = dquot->dq_sb;
1277         struct ocfs2_local_disk_chunk *dchunk;
1278         int offset;
1279
1280         status = ocfs2_journal_access_dq(handle,
1281                         INODE_CACHE(sb_dqopt(sb)->files[type]),
1282                         od->dq_chunk->qc_headerbh, OCFS2_JOURNAL_ACCESS_WRITE);
1283         if (status < 0) {
1284                 mlog_errno(status);
1285                 goto out;
1286         }
1287         offset = ol_dqblk_chunk_off(sb, od->dq_chunk->qc_num,
1288                                              od->dq_local_off);
1289         dchunk = (struct ocfs2_local_disk_chunk *)
1290                         (od->dq_chunk->qc_headerbh->b_data);
1291         /* Mark structure as freed */
1292         lock_buffer(od->dq_chunk->qc_headerbh);
1293         ocfs2_clear_bit_unaligned(offset, dchunk->dqc_bitmap);
1294         le32_add_cpu(&dchunk->dqc_free, 1);
1295         unlock_buffer(od->dq_chunk->qc_headerbh);
1296         ocfs2_journal_dirty(handle, od->dq_chunk->qc_headerbh);
1297
1298 out:
1299         return status;
1300 }
1301
1302 static const struct quota_format_ops ocfs2_format_ops = {
1303         .check_quota_file       = ocfs2_local_check_quota_file,
1304         .read_file_info         = ocfs2_local_read_info,
1305         .write_file_info        = ocfs2_global_write_info,
1306         .free_file_info         = ocfs2_local_free_info,
1307 };
1308
1309 struct quota_format_type ocfs2_quota_format = {
1310         .qf_fmt_id = QFMT_OCFS2,
1311         .qf_ops = &ocfs2_format_ops,
1312         .qf_owner = THIS_MODULE
1313 };