Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 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 | |
| 23 | #ifdef NTFS_RW |
| 24 | |
| 25 | #include <linux/fs.h> |
| 26 | #include <linux/highmem.h> |
| 27 | #include <linux/mm.h> |
| 28 | |
| 29 | #include "aops.h" |
| 30 | #include "debug.h" |
| 31 | #include "endian.h" |
| 32 | #include "time.h" |
| 33 | #include "types.h" |
| 34 | #include "usnjrnl.h" |
| 35 | #include "volume.h" |
| 36 | |
| 37 | /** |
| 38 | * ntfs_stamp_usnjrnl - stamp the transaction log ($UsnJrnl) on an ntfs volume |
| 39 | * @vol: ntfs volume on which to stamp the transaction log |
| 40 | * |
| 41 | * Stamp the transaction log ($UsnJrnl) on the ntfs volume @vol and return |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 42 | * 'true' on success and 'false' on error. |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 43 | * |
| 44 | * This function assumes that the transaction log has already been loaded and |
| 45 | * consistency checked by a call to fs/ntfs/super.c::load_and_init_usnjrnl(). |
| 46 | */ |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 47 | bool ntfs_stamp_usnjrnl(ntfs_volume *vol) |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 48 | { |
| 49 | ntfs_debug("Entering."); |
| 50 | if (likely(!NVolUsnJrnlStamped(vol))) { |
| 51 | sle64 stamp; |
| 52 | struct page *page; |
| 53 | USN_HEADER *uh; |
| 54 | |
| 55 | page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0); |
| 56 | if (IS_ERR(page)) { |
| 57 | ntfs_error(vol->sb, "Failed to read from " |
| 58 | "$UsnJrnl/$DATA/$Max attribute."); |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 59 | return false; |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 60 | } |
| 61 | uh = (USN_HEADER*)page_address(page); |
| 62 | stamp = get_current_ntfs_time(); |
| 63 | ntfs_debug("Stamping transaction log ($UsnJrnl): old " |
| 64 | "journal_id 0x%llx, old lowest_valid_usn " |
| 65 | "0x%llx, new journal_id 0x%llx, new " |
| 66 | "lowest_valid_usn 0x%llx.", |
| 67 | (long long)sle64_to_cpu(uh->journal_id), |
| 68 | (long long)sle64_to_cpu(uh->lowest_valid_usn), |
| 69 | (long long)sle64_to_cpu(stamp), |
| 70 | i_size_read(vol->usnjrnl_j_ino)); |
| 71 | uh->lowest_valid_usn = |
| 72 | cpu_to_sle64(i_size_read(vol->usnjrnl_j_ino)); |
| 73 | uh->journal_id = stamp; |
| 74 | flush_dcache_page(page); |
| 75 | set_page_dirty(page); |
| 76 | ntfs_unmap_page(page); |
| 77 | /* Set the flag so we do not have to do it again on remount. */ |
| 78 | NVolSetUsnJrnlStamped(vol); |
| 79 | } |
| 80 | ntfs_debug("Done."); |
Richard Knutsson | c49c311 | 2006-09-30 23:27:12 -0700 | [diff] [blame] | 81 | return true; |
Anton Altaparmakov | 3f2faef | 2005-06-25 15:28:56 +0100 | [diff] [blame] | 82 | } |
| 83 | |
| 84 | #endif /* NTFS_RW */ |