Thomas Gleixner | a1d312d | 2019-05-22 09:51:42 +0200 | [diff] [blame] | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 2 | /* |
| 3 | * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling. Part of the |
| 4 | * Linux-NTFS project. |
| 5 | * |
| 6 | * Copyright (c) 2005 Anton Altaparmakov |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 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 |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 28 | * 'true' on success and 'false' on error. |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 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 | */ |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 33 | bool ntfs_stamp_usnjrnl(ntfs_volume *vol) |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 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."); |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 45 | return false; |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 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."); |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 67 | return true; |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 68 | } |
| 69 | |
| 70 | #endif /* NTFS_RW */ |