usnjrnl.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /*
  2. * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling. Part of the
  3. * Linux-NTFS project.
  4. *
  5. * Copyright (c) 2005 Anton Altaparmakov
  6. *
  7. * This program/include file is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License as published
  9. * by the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program/include file is distributed in the hope that it will be
  13. * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  14. * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program (in the main directory of the Linux-NTFS
  19. * distribution in the file COPYING); if not, write to the Free Software
  20. * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. */
  22. #ifdef NTFS_RW
  23. #include <linux/fs.h>
  24. #include <linux/highmem.h>
  25. #include <linux/mm.h>
  26. #include "aops.h"
  27. #include "debug.h"
  28. #include "endian.h"
  29. #include "time.h"
  30. #include "types.h"
  31. #include "usnjrnl.h"
  32. #include "volume.h"
  33. /**
  34. * ntfs_stamp_usnjrnl - stamp the transaction log ($UsnJrnl) on an ntfs volume
  35. * @vol: ntfs volume on which to stamp the transaction log
  36. *
  37. * Stamp the transaction log ($UsnJrnl) on the ntfs volume @vol and return
  38. * 'true' on success and 'false' on error.
  39. *
  40. * This function assumes that the transaction log has already been loaded and
  41. * consistency checked by a call to fs/ntfs/super.c::load_and_init_usnjrnl().
  42. */
  43. bool ntfs_stamp_usnjrnl(ntfs_volume *vol)
  44. {
  45. ntfs_debug("Entering.");
  46. if (likely(!NVolUsnJrnlStamped(vol))) {
  47. sle64 stamp;
  48. struct page *page;
  49. USN_HEADER *uh;
  50. page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0);
  51. if (IS_ERR(page)) {
  52. ntfs_error(vol->sb, "Failed to read from "
  53. "$UsnJrnl/$DATA/$Max attribute.");
  54. return false;
  55. }
  56. uh = (USN_HEADER*)page_address(page);
  57. stamp = get_current_ntfs_time();
  58. ntfs_debug("Stamping transaction log ($UsnJrnl): old "
  59. "journal_id 0x%llx, old lowest_valid_usn "
  60. "0x%llx, new journal_id 0x%llx, new "
  61. "lowest_valid_usn 0x%llx.",
  62. (long long)sle64_to_cpu(uh->journal_id),
  63. (long long)sle64_to_cpu(uh->lowest_valid_usn),
  64. (long long)sle64_to_cpu(stamp),
  65. i_size_read(vol->usnjrnl_j_ino));
  66. uh->lowest_valid_usn =
  67. cpu_to_sle64(i_size_read(vol->usnjrnl_j_ino));
  68. uh->journal_id = stamp;
  69. flush_dcache_page(page);
  70. set_page_dirty(page);
  71. ntfs_unmap_page(page);
  72. /* Set the flag so we do not have to do it again on remount. */
  73. NVolSetUsnJrnlStamped(vol);
  74. }
  75. ntfs_debug("Done.");
  76. return true;
  77. }
  78. #endif /* NTFS_RW */