18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling.  Part of the
48c2ecf20Sopenharmony_ci *	       Linux-NTFS project.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright (c) 2005 Anton Altaparmakov
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifdef NTFS_RW
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/fs.h>
128c2ecf20Sopenharmony_ci#include <linux/highmem.h>
138c2ecf20Sopenharmony_ci#include <linux/mm.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include "aops.h"
168c2ecf20Sopenharmony_ci#include "debug.h"
178c2ecf20Sopenharmony_ci#include "endian.h"
188c2ecf20Sopenharmony_ci#include "time.h"
198c2ecf20Sopenharmony_ci#include "types.h"
208c2ecf20Sopenharmony_ci#include "usnjrnl.h"
218c2ecf20Sopenharmony_ci#include "volume.h"
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ci/**
248c2ecf20Sopenharmony_ci * ntfs_stamp_usnjrnl - stamp the transaction log ($UsnJrnl) on an ntfs volume
258c2ecf20Sopenharmony_ci * @vol:	ntfs volume on which to stamp the transaction log
268c2ecf20Sopenharmony_ci *
278c2ecf20Sopenharmony_ci * Stamp the transaction log ($UsnJrnl) on the ntfs volume @vol and return
288c2ecf20Sopenharmony_ci * 'true' on success and 'false' on error.
298c2ecf20Sopenharmony_ci *
308c2ecf20Sopenharmony_ci * This function assumes that the transaction log has already been loaded and
318c2ecf20Sopenharmony_ci * consistency checked by a call to fs/ntfs/super.c::load_and_init_usnjrnl().
328c2ecf20Sopenharmony_ci */
338c2ecf20Sopenharmony_cibool ntfs_stamp_usnjrnl(ntfs_volume *vol)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	ntfs_debug("Entering.");
368c2ecf20Sopenharmony_ci	if (likely(!NVolUsnJrnlStamped(vol))) {
378c2ecf20Sopenharmony_ci		sle64 stamp;
388c2ecf20Sopenharmony_ci		struct page *page;
398c2ecf20Sopenharmony_ci		USN_HEADER *uh;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci		page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0);
428c2ecf20Sopenharmony_ci		if (IS_ERR(page)) {
438c2ecf20Sopenharmony_ci			ntfs_error(vol->sb, "Failed to read from "
448c2ecf20Sopenharmony_ci					"$UsnJrnl/$DATA/$Max attribute.");
458c2ecf20Sopenharmony_ci			return false;
468c2ecf20Sopenharmony_ci		}
478c2ecf20Sopenharmony_ci		uh = (USN_HEADER*)page_address(page);
488c2ecf20Sopenharmony_ci		stamp = get_current_ntfs_time();
498c2ecf20Sopenharmony_ci		ntfs_debug("Stamping transaction log ($UsnJrnl): old "
508c2ecf20Sopenharmony_ci				"journal_id 0x%llx, old lowest_valid_usn "
518c2ecf20Sopenharmony_ci				"0x%llx, new journal_id 0x%llx, new "
528c2ecf20Sopenharmony_ci				"lowest_valid_usn 0x%llx.",
538c2ecf20Sopenharmony_ci				(long long)sle64_to_cpu(uh->journal_id),
548c2ecf20Sopenharmony_ci				(long long)sle64_to_cpu(uh->lowest_valid_usn),
558c2ecf20Sopenharmony_ci				(long long)sle64_to_cpu(stamp),
568c2ecf20Sopenharmony_ci				i_size_read(vol->usnjrnl_j_ino));
578c2ecf20Sopenharmony_ci		uh->lowest_valid_usn =
588c2ecf20Sopenharmony_ci				cpu_to_sle64(i_size_read(vol->usnjrnl_j_ino));
598c2ecf20Sopenharmony_ci		uh->journal_id = stamp;
608c2ecf20Sopenharmony_ci		flush_dcache_page(page);
618c2ecf20Sopenharmony_ci		set_page_dirty(page);
628c2ecf20Sopenharmony_ci		ntfs_unmap_page(page);
638c2ecf20Sopenharmony_ci		/* Set the flag so we do not have to do it again on remount. */
648c2ecf20Sopenharmony_ci		NVolSetUsnJrnlStamped(vol);
658c2ecf20Sopenharmony_ci	}
668c2ecf20Sopenharmony_ci	ntfs_debug("Done.");
678c2ecf20Sopenharmony_ci	return true;
688c2ecf20Sopenharmony_ci}
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci#endif /* NTFS_RW */
71