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