Whamcloud - gitweb
e85858600a4a8246dd6085805cafc76c9505661f
[fs/lustre-release.git] / lustre / include / lustre_scrub.h
1 /*
2  * GPL HEADER START
3  *
4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 only,
8  * as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * General Public License version 2 for more details (a copy is included
14  * in the LICENSE file that accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License
17  * version 2 along with this program; If not, see
18  * http://www.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2017, Intel Corporation.
24  */
25 /*
26  * lustre/include/lustre_scrub.h
27  *
28  * Shared definitions and declarations for Lustre OI scrub.
29  *
30  * Author: Fan Yong <fan.yong@intel.com>
31  */
32
33 #ifndef _LUSTRE_SCRUB_H
34 # define _LUSTRE_SCRUB_H
35
36 #include <dt_object.h>
37 #include <lustre_net.h>
38
39 #define OSD_OI_FID_OID_BITS_MAX 10
40 #define OSD_OI_FID_NR_MAX       (1UL << OSD_OI_FID_OID_BITS_MAX)
41 #define SCRUB_OI_BITMAP_SIZE    (OSD_OI_FID_NR_MAX >> 3)
42
43 #define SCRUB_MAGIC_V1                  0x4C5FD252
44 #define SCRUB_CHECKPOINT_INTERVAL       60
45 #define SCRUB_WINDOW_SIZE               1024
46
47 #define HALF_SEC                        msecs_to_jiffies(MSEC_PER_SEC >> 1)
48
49 enum scrub_next_status {
50         /* exit current loop and process next group */
51         SCRUB_NEXT_BREAK        = 1,
52
53         /* skip current object and process next bit */
54         SCRUB_NEXT_CONTINUE     = 2,
55
56         /* exit all the loops */
57         SCRUB_NEXT_EXIT         = 3,
58
59         /* wait for free cache slot */
60         SCRUB_NEXT_WAIT         = 4,
61
62         /* simulate system crash during OI scrub */
63         SCRUB_NEXT_CRASH        = 5,
64
65         /* simulate failure during OI scrub */
66         SCRUB_NEXT_FATAL        = 6,
67
68         /* new created object, no scrub on it */
69         SCRUB_NEXT_NOSCRUB      = 7,
70
71         /* the object has no FID-in-LMA */
72         SCRUB_NEXT_NOLMA        = 8,
73
74         /* for OST-object */
75         SCRUB_NEXT_OSTOBJ       = 9,
76
77         /* old OST-object, no LMA or no FID-on-OST flags in LMA */
78         SCRUB_NEXT_OSTOBJ_OLD   = 10,
79 };
80
81 enum scrub_local_file_flags {
82         SLFF_SCAN_SUBITEMS      = 0x0001,
83         SLFF_HIDE_FID           = 0x0002,
84         SLFF_SHOW_NAME          = 0x0004,
85         SLFF_NO_OI              = 0x0008,
86         SLFF_IDX_IN_FID         = 0x0010,
87 };
88
89 enum scrub_status {
90         /* The scrub file is new created, for new MDT, upgrading from old disk,
91          * or re-creating the scrub file manually. */
92         SS_INIT         = 0,
93
94         /* The scrub is checking/repairing the OI files. */
95         SS_SCANNING     = 1,
96
97         /* The scrub checked/repaired the OI files successfully. */
98         SS_COMPLETED    = 2,
99
100         /* The scrub failed to check/repair the OI files. */
101         SS_FAILED       = 3,
102
103         /* The scrub is stopped manually, the OI files may be inconsistent. */
104         SS_STOPPED      = 4,
105
106         /* The scrub is paused automatically when umount. */
107         SS_PAUSED       = 5,
108
109         /* The scrub crashed during the scanning, should be restarted. */
110         SS_CRASHED      = 6,
111 };
112
113 enum scrub_flags {
114         /* OI files have been recreated, OI mappings should be re-inserted. */
115         SF_RECREATED    = 0x0000000000000001ULL,
116
117         /* OI files are invalid, should be rebuild ASAP */
118         SF_INCONSISTENT = 0x0000000000000002ULL,
119
120         /* OI scrub is triggered automatically. */
121         SF_AUTO         = 0x0000000000000004ULL,
122
123         /* The device is upgraded from 1.8 format. */
124         SF_UPGRADE      = 0x0000000000000008ULL,
125 };
126
127 enum scrub_param {
128         /* Exit when fail. */
129         SP_FAILOUT      = 0x0001,
130
131         /* Check only without repairing. */
132         SP_DRYRUN       = 0x0002,
133 };
134
135 enum scrub_start {
136         /* Set failout flag. */
137         SS_SET_FAILOUT          = 0x00000001,
138
139         /* Clear failout flag. */
140         SS_CLEAR_FAILOUT        = 0x00000002,
141
142         /* Reset scrub start position. */
143         SS_RESET                = 0x00000004,
144
145         /* Trigger full scrub automatically. */
146         SS_AUTO_FULL            = 0x00000008,
147
148         /* Trigger partial scrub automatically. */
149         SS_AUTO_PARTIAL         = 0x00000010,
150
151         /* Set dryrun flag. */
152         SS_SET_DRYRUN           = 0x00000020,
153
154         /* Clear dryrun flag. */
155         SS_CLEAR_DRYRUN         = 0x00000040,
156 };
157
158 enum osd_lf_flags {
159         OLF_SCAN_SUBITEMS       = 0x0001,
160         OLF_HIDE_FID            = 0x0002,
161         OLF_SHOW_NAME           = 0x0004,
162         OLF_NO_OI               = 0x0008,
163         OLF_IDX_IN_FID          = 0x0010,
164 };
165
166 struct scrub_file {
167         /* 128-bit uuid for volume. */
168         __u8    sf_uuid[16];
169
170         /* See 'enum scrub_flags'. */
171         __u64   sf_flags;
172
173         /* The scrub magic. */
174         __u32   sf_magic;
175
176         /* See 'enum scrub_status'. */
177         __u16   sf_status;
178
179         /* See 'enum scrub_param'. */
180         __u16   sf_param;
181
182         /* The time for the last OI scrub completed. */
183         __u64   sf_time_last_complete;
184
185         /* The time for the latest OI scrub ran. */
186         __u64   sf_time_latest_start;
187
188         /* The time for the last OI scrub checkpoint. */
189         __u64   sf_time_last_checkpoint;
190
191         /* The position for the latest OI scrub started from. */
192         __u64   sf_pos_latest_start;
193
194         /* The position for the last OI scrub checkpoint. */
195         __u64   sf_pos_last_checkpoint;
196
197         /* The position for the first should be updated object. */
198         __u64   sf_pos_first_inconsistent;
199
200         /* How many objects have been checked. */
201         __u64   sf_items_checked;
202
203         /* How many objects have been updated. */
204         __u64   sf_items_updated;
205
206         /* How many objects failed to be processed. */
207         __u64   sf_items_failed;
208
209         /* How many prior objects have been updated during scanning. */
210         __u64   sf_items_updated_prior;
211
212         /* How many objects marked as LDISKFS_STATE_LUSTRE_NOSCRUB. */
213         __u64   sf_items_noscrub;
214
215         /* How many IGIF objects. */
216         __u64   sf_items_igif;
217
218         /* How long the OI scrub has run. */
219         __u32   sf_run_time;
220
221         /* How many completed OI scrub ran on the device. */
222         __u32   sf_success_count;
223
224         /* How many OI files. */
225         __u16   sf_oi_count;
226
227         /* Keep the flags after scrub reset. See 'enum scrub_internal_flags' */
228         __u16   sf_internal_flags;
229
230         __u32   sf_reserved_1;
231         __u64   sf_reserved_2[16];
232
233         /* Bitmap for OI files recreated case. */
234         __u8    sf_oi_bitmap[SCRUB_OI_BITMAP_SIZE];
235 };
236
237 struct lustre_scrub {
238         struct lu_object_header os_obj_header;
239         /* Object for the scrub file. */
240         struct dt_object       *os_obj;
241
242         struct ptlrpc_thread    os_thread;
243         struct list_head        os_inconsistent_items;
244
245         /* write lock for scrub prep/update/post/checkpoint,
246          * read lock for scrub dump. */
247         struct rw_semaphore     os_rwsem;
248         spinlock_t              os_lock;
249
250         /* Scrub file in memory. */
251         struct scrub_file       os_file;
252
253         /* Buffer for scrub file load/store. */
254         struct scrub_file       os_file_disk;
255
256         const char             *os_name;
257
258         /* The time for last checkpoint, jiffies */
259         cfs_time_t              os_time_last_checkpoint;
260
261         /* The time for next checkpoint, jiffies */
262         cfs_time_t              os_time_next_checkpoint;
263
264         /* How many objects have been checked since last checkpoint. */
265         __u64                   os_new_checked;
266         __u64                   os_pos_current;
267         __u32                   os_start_flags;
268         unsigned int            os_in_prior:1, /* process inconsistent item
269                                                 * found by RPC prior */
270                                 os_waiting:1, /* Waiting for scan window. */
271                                 os_full_speed:1, /* run w/o speed limit */
272                                 os_paused:1, /* The scrub is paused. */
273                                 os_convert_igif:1,
274                                 os_partial_scan:1,
275                                 os_in_join:1,
276                                 os_full_scrub:1;
277 };
278
279 void scrub_file_init(struct lustre_scrub *scrub, __u8 *uuid);
280 void scrub_file_reset(struct lustre_scrub *scrub, __u8 *uuid, __u64 flags);
281 int scrub_file_load(const struct lu_env *env, struct lustre_scrub *scrub);
282 int scrub_file_store(const struct lu_env *env, struct lustre_scrub *scrub);
283 int scrub_checkpoint(const struct lu_env *env, struct lustre_scrub *scrub);
284 int scrub_start(int (*threadfn)(void *data), struct lustre_scrub *scrub,
285                 void *data, __u32 flags);
286 void scrub_stop(struct lustre_scrub *scrub);
287 void scrub_dump(struct seq_file *m, struct lustre_scrub *scrub);
288
289 static inline const char *osd_scrub2name(struct lustre_scrub *scrub)
290 {
291         return scrub->os_name;
292 }
293 #endif /* _LUSTRE_SCRUB_H */