alloc.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /* -*- mode: c; c-basic-offset: 8; -*-
  2. * vim: noexpandtab sw=8 ts=8 sts=0:
  3. *
  4. * alloc.h
  5. *
  6. * Function prototypes
  7. *
  8. * Copyright (C) 2002, 2004 Oracle. All rights reserved.
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public
  12. * License as published by the Free Software Foundation; either
  13. * version 2 of the License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  18. * General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public
  21. * License along with this program; if not, write to the
  22. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  23. * Boston, MA 021110-1307, USA.
  24. */
  25. #ifndef OCFS2_ALLOC_H
  26. #define OCFS2_ALLOC_H
  27. struct ocfs2_alloc_context;
  28. int ocfs2_insert_extent(struct ocfs2_super *osb,
  29. struct ocfs2_journal_handle *handle,
  30. struct inode *inode,
  31. struct buffer_head *fe_bh,
  32. u64 blkno,
  33. u32 new_clusters,
  34. struct ocfs2_alloc_context *meta_ac);
  35. int ocfs2_num_free_extents(struct ocfs2_super *osb,
  36. struct inode *inode,
  37. struct ocfs2_dinode *fe);
  38. /* how many new metadata chunks would an allocation need at maximum? */
  39. static inline int ocfs2_extend_meta_needed(struct ocfs2_dinode *fe)
  40. {
  41. /*
  42. * Rather than do all the work of determining how much we need
  43. * (involves a ton of reads and locks), just ask for the
  44. * maximal limit. That's a tree depth shift. So, one block for
  45. * level of the tree (current l_tree_depth), one block for the
  46. * new tree_depth==0 extent_block, and one block at the new
  47. * top-of-the tree.
  48. */
  49. return le16_to_cpu(fe->id2.i_list.l_tree_depth) + 2;
  50. }
  51. int ocfs2_truncate_log_init(struct ocfs2_super *osb);
  52. void ocfs2_truncate_log_shutdown(struct ocfs2_super *osb);
  53. void ocfs2_schedule_truncate_log_flush(struct ocfs2_super *osb,
  54. int cancel);
  55. int ocfs2_flush_truncate_log(struct ocfs2_super *osb);
  56. int ocfs2_begin_truncate_log_recovery(struct ocfs2_super *osb,
  57. int slot_num,
  58. struct ocfs2_dinode **tl_copy);
  59. int ocfs2_complete_truncate_log_recovery(struct ocfs2_super *osb,
  60. struct ocfs2_dinode *tl_copy);
  61. struct ocfs2_truncate_context {
  62. struct inode *tc_ext_alloc_inode;
  63. struct buffer_head *tc_ext_alloc_bh;
  64. int tc_ext_alloc_locked; /* is it cluster locked? */
  65. /* these get destroyed once it's passed to ocfs2_commit_truncate. */
  66. struct buffer_head *tc_last_eb_bh;
  67. };
  68. int ocfs2_prepare_truncate(struct ocfs2_super *osb,
  69. struct inode *inode,
  70. struct buffer_head *fe_bh,
  71. struct ocfs2_truncate_context **tc);
  72. int ocfs2_commit_truncate(struct ocfs2_super *osb,
  73. struct inode *inode,
  74. struct buffer_head *fe_bh,
  75. struct ocfs2_truncate_context *tc);
  76. #endif /* OCFS2_ALLOC_H */