ext4_jbd2.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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. return err;
  40. }
  41. int __ext4_journal_revoke(const char *where, handle_t *handle,
  42. ext4_fsblk_t blocknr, struct buffer_head *bh)
  43. {
  44. int err = 0;
  45. if (ext4_handle_valid(handle)) {
  46. err = jbd2_journal_revoke(handle, blocknr, bh);
  47. if (err)
  48. ext4_journal_abort_handle(where, __func__, bh,
  49. handle, err);
  50. }
  51. return err;
  52. }
  53. int __ext4_journal_get_create_access(const char *where,
  54. handle_t *handle, struct buffer_head *bh)
  55. {
  56. int err = 0;
  57. if (ext4_handle_valid(handle)) {
  58. err = jbd2_journal_get_create_access(handle, bh);
  59. if (err)
  60. ext4_journal_abort_handle(where, __func__, bh,
  61. handle, err);
  62. }
  63. return err;
  64. }
  65. int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
  66. struct inode *inode, struct buffer_head *bh)
  67. {
  68. int err = 0;
  69. if (ext4_handle_valid(handle)) {
  70. err = jbd2_journal_dirty_metadata(handle, bh);
  71. if (err)
  72. ext4_journal_abort_handle(where, __func__, bh,
  73. handle, err);
  74. } else {
  75. mark_buffer_dirty(bh);
  76. if (inode && inode_needs_sync(inode)) {
  77. sync_dirty_buffer(bh);
  78. if (buffer_req(bh) && !buffer_uptodate(bh)) {
  79. ext4_error(inode->i_sb, __func__,
  80. "IO error syncing inode, "
  81. "inode=%lu, block=%llu",
  82. inode->i_ino,
  83. (unsigned long long) bh->b_blocknr);
  84. err = -EIO;
  85. }
  86. }
  87. }
  88. return err;
  89. }