ext4_jbd2.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * Interface between ext4 and JBD
  3. */
  4. #include "ext4_jbd2.h"
  5. int __ext4_journal_get_undo_access(const char *where, handle_t *handle,
  6. struct buffer_head *bh)
  7. {
  8. int err = 0;
  9. if (ext4_handle_valid(handle)) {
  10. err = jbd2_journal_get_undo_access(handle, bh);
  11. if (err)
  12. ext4_journal_abort_handle(where, __func__, bh,
  13. handle, err);
  14. }
  15. return err;
  16. }
  17. int __ext4_journal_get_write_access(const char *where, handle_t *handle,
  18. struct buffer_head *bh)
  19. {
  20. int err = 0;
  21. if (ext4_handle_valid(handle)) {
  22. err = jbd2_journal_get_write_access(handle, bh);
  23. if (err)
  24. ext4_journal_abort_handle(where, __func__, bh,
  25. handle, err);
  26. }
  27. return err;
  28. }
  29. int __ext4_journal_forget(const char *where, handle_t *handle,
  30. struct buffer_head *bh)
  31. {
  32. int err = 0;
  33. if (ext4_handle_valid(handle)) {
  34. err = jbd2_journal_forget(handle, bh);
  35. if (err)
  36. ext4_journal_abort_handle(where, __func__, bh,
  37. handle, err);
  38. }
  39. else
  40. brelse(bh);
  41. return err;
  42. }
  43. int __ext4_journal_revoke(const char *where, handle_t *handle,
  44. ext4_fsblk_t blocknr, struct buffer_head *bh)
  45. {
  46. int err = 0;
  47. if (ext4_handle_valid(handle)) {
  48. err = jbd2_journal_revoke(handle, blocknr, bh);
  49. if (err)
  50. ext4_journal_abort_handle(where, __func__, bh,
  51. handle, err);
  52. }
  53. else
  54. brelse(bh);
  55. return err;
  56. }
  57. int __ext4_journal_get_create_access(const char *where,
  58. handle_t *handle, struct buffer_head *bh)
  59. {
  60. int err = 0;
  61. if (ext4_handle_valid(handle)) {
  62. err = jbd2_journal_get_create_access(handle, bh);
  63. if (err)
  64. ext4_journal_abort_handle(where, __func__, bh,
  65. handle, err);
  66. }
  67. return err;
  68. }
  69. int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
  70. struct inode *inode, struct buffer_head *bh)
  71. {
  72. int err = 0;
  73. if (ext4_handle_valid(handle)) {
  74. err = jbd2_journal_dirty_metadata(handle, bh);
  75. if (err)
  76. ext4_journal_abort_handle(where, __func__, bh,
  77. handle, err);
  78. } else {
  79. mark_buffer_dirty(bh);
  80. if (inode && inode_needs_sync(inode)) {
  81. sync_dirty_buffer(bh);
  82. if (buffer_req(bh) && !buffer_uptodate(bh)) {
  83. ext4_error(inode->i_sb, __func__,
  84. "IO error syncing inode, "
  85. "inode=%lu, block=%llu",
  86. inode->i_ino,
  87. (unsigned long long) bh->b_blocknr);
  88. err = -EIO;
  89. }
  90. }
  91. }
  92. return err;
  93. }