^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling. Part of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Linux-NTFS project.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2005 Anton Altaparmakov
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifdef NTFS_RW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/highmem.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "aops.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include "debug.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "endian.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include "time.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include "types.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include "usnjrnl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include "volume.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * ntfs_stamp_usnjrnl - stamp the transaction log ($UsnJrnl) on an ntfs volume
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * @vol: ntfs volume on which to stamp the transaction log
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * Stamp the transaction log ($UsnJrnl) on the ntfs volume @vol and return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * 'true' on success and 'false' on error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * This function assumes that the transaction log has already been loaded and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * consistency checked by a call to fs/ntfs/super.c::load_and_init_usnjrnl().
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) bool ntfs_stamp_usnjrnl(ntfs_volume *vol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ntfs_debug("Entering.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) if (likely(!NVolUsnJrnlStamped(vol))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) sle64 stamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct page *page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) USN_HEADER *uh;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) if (IS_ERR(page)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ntfs_error(vol->sb, "Failed to read from "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) "$UsnJrnl/$DATA/$Max attribute.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) uh = (USN_HEADER*)page_address(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) stamp = get_current_ntfs_time();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ntfs_debug("Stamping transaction log ($UsnJrnl): old "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) "journal_id 0x%llx, old lowest_valid_usn "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) "0x%llx, new journal_id 0x%llx, new "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) "lowest_valid_usn 0x%llx.",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) (long long)sle64_to_cpu(uh->journal_id),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) (long long)sle64_to_cpu(uh->lowest_valid_usn),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) (long long)sle64_to_cpu(stamp),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) i_size_read(vol->usnjrnl_j_ino));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) uh->lowest_valid_usn =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) cpu_to_sle64(i_size_read(vol->usnjrnl_j_ino));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) uh->journal_id = stamp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) flush_dcache_page(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) set_page_dirty(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ntfs_unmap_page(page);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* Set the flag so we do not have to do it again on remount. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) NVolSetUsnJrnlStamped(vol);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ntfs_debug("Done.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #endif /* NTFS_RW */