source: MondoRescue/branches/3.3/mindi-busybox/util-linux/volume_id/nilfs.c@ 3625

Last change on this file since 3625 was 3621, checked in by Bruno Cornec, 10 years ago

New 3?3 banch for incorporation of latest busybox 1.25. Changing minor version to handle potential incompatibilities.

  • Property svn:eol-style set to native
File size: 4.1 KB
Line 
1/*
2 * volume_id - reads filesystem label and uuid
3 *
4 * Copyright (C) 2004 Kay Sievers <kay.sievers@vrfy.org>
5 * Copyright (C) 2012 S-G Bergh <sgb@systemasis.org>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22//kbuild:lib-$(CONFIG_FEATURE_VOLUMEID_NILFS) += nilfs.o
23
24//config:
25//config:config FEATURE_VOLUMEID_NILFS
26//config: bool "nilfs filesystem"
27//config: default y
28//config: depends on VOLUMEID
29//config: help
30//config: NILFS is a New Implementation of a Log-Structured File System (LFS)
31//config: that supports continuous snapshots. This provides features like
32//config: versioning of the entire filesystem, restoration of files that
33//config: were deleted a few minutes ago. NILFS keeps consistency like
34//config: conventional LFS, so it provides quick recovery after system crashes.
35//config:
36//config: The possible use of NILFS includes versioning, tamper detection,
37//config: SOX compliance logging, and so forth. It can serve as an alternative
38//config: filesystem for Linux desktop environment, or as a basis of advanced
39//config: storage appliances.
40//config:
41
42#include "volume_id_internal.h"
43
44#define NILFS_UUID_SIZE 16
45#define NILFS_LABEL_SIZE 80
46#define NILFS_SB1_OFFSET 0x400
47#define NILFS_SB2_OFFSET 0x1000
48#define NILFS_MAGIC 0x3434
49
50struct nilfs2_super_block {
51/* 0x00 */ uint32_t s_rev_level; // Major revision level.
52/* 0x04 */ uint16_t s_minor_rev_level; // Minor revision level.
53/* 0x06 */ uint16_t s_magic; // Magic signature.
54/* 0x08 */ uint16_t s_bytes;
55/* 0x0A */ uint16_t s_flags;
56/* 0x0C */ uint32_t s_crc_seed;
57/* 0x10 */ uint32_t s_sum;
58/* 0x14 */ uint32_t s_log_block_size;
59/* 0x18 */ uint64_t s_nsegments;
60/* 0x20 */ uint64_t s_dev_size; // Block device size in bytes.
61/* 0x28 */ uint64_t s_first_data_block;
62/* 0x30 */ uint32_t s_blocks_per_segment;
63/* 0x34 */ uint32_t s_r_segments_percentage;
64/* 0x38 */ uint64_t s_last_cno;
65/* 0x40 */ uint64_t s_last_pseg;
66/* 0x48 */ uint64_t s_last_seq;
67/* 0x50 */ uint64_t s_free_blocks_count;
68/* 0x58 */ uint64_t s_ctime;
69/* 0x60 */ uint64_t s_mtime;
70/* 0x68 */ uint64_t s_wtime;
71/* 0x70 */ uint16_t s_mnt_count;
72/* 0x72 */ uint16_t s_max_mnt_count;
73/* 0x74 */ uint16_t s_state;
74/* 0x76 */ uint16_t s_errors;
75/* 0x78 */ uint64_t s_lastcheck;
76/* 0x80 */ uint32_t s_checkinterval;
77/* 0x84 */ uint32_t s_creator_os;
78/* 0x88 */ uint16_t s_def_resuid;
79/* 0x8A */ uint16_t s_def_resgid;
80/* 0x8C */ uint32_t s_first_ino;
81/* 0x90 */ uint16_t s_inode_size;
82/* 0x92 */ uint16_t s_dat_entry_size;
83/* 0x94 */ uint16_t s_checkpoint_size;
84/* 0x96 */ uint16_t s_segment_usage_size;
85/* 0x98 */ uint8_t s_uuid[NILFS_UUID_SIZE]; // 128-bit UUID for volume.
86/* 0xA8 */ uint8_t s_volume_name[NILFS_LABEL_SIZE]; // Volume label.
87/* 0xF8 */ // ...
88} PACKED;
89
90int FAST_FUNC volume_id_probe_nilfs(struct volume_id *id /*,uint64_t off*/)
91{
92 struct nilfs2_super_block *sb;
93
94 // Primary super block
95 dbg("nilfs: probing at offset 0x%x", NILFS_SB1_OFFSET);
96
97 sb = volume_id_get_buffer(id, NILFS_SB1_OFFSET, sizeof(*sb));
98
99 if (sb == NULL)
100 return -1;
101
102 if (sb->s_magic != NILFS_MAGIC)
103 return -1;
104
105 // The secondary superblock is not always used, so ignore it for now.
106 // When used it is at 4K from the end of the partition (sb->s_dev_size - NILFS_SB2_OFFSET).
107
108 volume_id_set_label_string(id, sb->s_volume_name, NILFS_LABEL_SIZE < VOLUME_ID_LABEL_SIZE ?
109 NILFS_LABEL_SIZE : VOLUME_ID_LABEL_SIZE);
110 volume_id_set_uuid(id, sb->s_uuid, UUID_DCE);
111
112 if (sb->s_rev_level == 2)
113 IF_FEATURE_BLKID_TYPE(id->type = "nilfs2");
114
115 return 0;
116}
Note: See TracBrowser for help on using the repository browser.