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