4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
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.
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).
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
23 * Copyright (c) 2017, Intel Corporation.
26 * lustre/include/lustre_scrub.h
28 * Shared definitions and declarations for Lustre OI scrub.
30 * Author: Fan Yong <fan.yong@intel.com>
33 #ifndef _LUSTRE_SCRUB_H
34 # define _LUSTRE_SCRUB_H
36 #include <libcfs/linux/linux-uuid.h>
37 #include <dt_object.h>
38 #include <lustre_net.h>
40 #define OSD_OI_FID_OID_BITS_MAX 10
41 #define OSD_OI_FID_NR_MAX (1UL << OSD_OI_FID_OID_BITS_MAX)
42 #define SCRUB_OI_BITMAP_SIZE (OSD_OI_FID_NR_MAX >> 3)
43 #define PFID_STRIPE_IDX_BITS 16
44 #define PFID_STRIPE_COUNT_MASK ((1 << PFID_STRIPE_IDX_BITS) - 1)
46 #define SCRUB_MAGIC_V1 0x4C5FD252
47 #define SCRUB_MAGIC_V2 0x4C5FE253
48 #define SCRUB_CHECKPOINT_INTERVAL 60
49 #define SCRUB_WINDOW_SIZE 1024
51 enum scrub_next_status {
52 /* exit current loop and process next group */
55 /* skip current object and process next bit */
56 SCRUB_NEXT_CONTINUE = 2,
58 /* exit all the loops */
61 /* wait for free cache slot */
64 /* simulate system crash during OI scrub */
67 /* simulate failure during OI scrub */
70 /* new created object, no scrub on it */
71 SCRUB_NEXT_NOSCRUB = 7,
73 /* the object has no FID-in-LMA */
77 SCRUB_NEXT_OSTOBJ = 9,
79 /* old OST-object, no LMA or no FID-on-OST flags in LMA */
80 SCRUB_NEXT_OSTOBJ_OLD = 10,
83 enum scrub_local_file_flags {
84 SLFF_SCAN_SUBITEMS = 0x0001,
85 SLFF_HIDE_FID = 0x0002,
86 SLFF_SHOW_NAME = 0x0004,
88 SLFF_IDX_IN_FID = 0x0010,
92 /* The scrub file is new created, for new MDT, upgrading from old disk,
93 * or re-creating the scrub file manually. */
96 /* The scrub is checking/repairing the OI files. */
99 /* The scrub checked/repaired the OI files successfully. */
102 /* The scrub failed to check/repair the OI files. */
105 /* The scrub is stopped manually, the OI files may be inconsistent. */
108 /* The scrub is paused automatically when umount. */
111 /* The scrub crashed during the scanning, should be restarted. */
116 /* OI files have been recreated, OI mappings should be re-inserted. */
117 SF_RECREATED = 0x0000000000000001ULL,
119 /* OI files are invalid, should be rebuild ASAP */
120 SF_INCONSISTENT = 0x0000000000000002ULL,
122 /* OI scrub is triggered automatically. */
123 SF_AUTO = 0x0000000000000004ULL,
125 /* The device is upgraded from 1.8 format. */
126 SF_UPGRADE = 0x0000000000000008ULL,
130 /* Exit when fail. */
133 /* Check only without repairing. */
138 /* Set failout flag. */
139 SS_SET_FAILOUT = 0x00000001,
141 /* Clear failout flag. */
142 SS_CLEAR_FAILOUT = 0x00000002,
144 /* Reset scrub start position. */
145 SS_RESET = 0x00000004,
147 /* Trigger full scrub automatically. */
148 SS_AUTO_FULL = 0x00000008,
150 /* Trigger partial scrub automatically. */
151 SS_AUTO_PARTIAL = 0x00000010,
153 /* Set dryrun flag. */
154 SS_SET_DRYRUN = 0x00000020,
156 /* Clear dryrun flag. */
157 SS_CLEAR_DRYRUN = 0x00000040,
161 OLF_SCAN_SUBITEMS = 0x0001,
162 OLF_HIDE_FID = 0x0002,
163 OLF_SHOW_NAME = 0x0004,
165 OLF_IDX_IN_FID = 0x0010,
166 OLF_NOT_BACKUP = 0x0020,
169 /* There are some overhead to detect OI inconsistency automatically
170 * during normal RPC handling. We do not want to always auto detect
171 * OI inconsistency especailly when OI scrub just done recently.
173 * The 'auto_scrub' defines the time (united as second) interval to
174 * enable auto detect OI inconsistency since last OI scurb done. */
176 /* Disable auto scrub. */
179 /* 1 second is too short interval, it is almost equal to always auto
180 * detect inconsistent OI, usually used for test. */
183 /* Enable auto detect OI inconsistency one month (60 * 60 * 24 * 30)
184 * after last OI scrub. */
185 AS_DEFAULT = 2592000LL,
189 /* 128-bit uuid for volume. */
192 /* See 'enum scrub_flags'. */
195 /* The scrub magic. */
198 /* See 'enum scrub_status'. */
201 /* See 'enum scrub_param'. */
204 /* The time for the last OI scrub completed. */
205 time64_t sf_time_last_complete;
207 /* The ttime for the latest OI scrub ran. */
208 time64_t sf_time_latest_start;
210 /* The time for the last OI scrub checkpoint. */
211 time64_t sf_time_last_checkpoint;
213 /* The position for the latest OI scrub started from. */
214 __u64 sf_pos_latest_start;
216 /* The position for the last OI scrub checkpoint. */
217 __u64 sf_pos_last_checkpoint;
219 /* The position for the first should be updated object. */
220 __u64 sf_pos_first_inconsistent;
222 /* How many objects have been checked. */
223 __u64 sf_items_checked;
225 /* How many objects have been updated. */
226 __u64 sf_items_updated;
228 /* How many objects failed to be processed. */
229 __u64 sf_items_failed;
231 /* How many prior objects have been updated during scanning. */
232 __u64 sf_items_updated_prior;
234 /* How many objects marked as LDISKFS_STATE_LUSTRE_NOSCRUB. */
235 __u64 sf_items_noscrub;
237 /* How many IGIF objects. */
240 /* How long the OI scrub has run in seconds. Do NOT change
241 * to time64_t since this breaks backwards compatibility.
242 * It shouldn't take more than 136 years to complete :-)
246 /* How many completed OI scrub ran on the device. */
247 __u32 sf_success_count;
249 /* How many OI files. */
252 /* Keep the flags after scrub reset. See 'enum scrub_internal_flags' */
253 __u16 sf_internal_flags;
256 __u64 sf_reserved_2[16];
258 /* Bitmap for OI files recreated case. */
259 __u8 sf_oi_bitmap[SCRUB_OI_BITMAP_SIZE];
262 struct lustre_scrub {
263 /* Object for the scrub file. */
264 struct dt_object *os_obj;
266 struct task_struct *os_task;
267 struct list_head os_inconsistent_items;
268 /* once inconsistent mapping can't be fixed, put into this list */
269 struct list_head os_stale_items;
271 /* write lock for scrub prep/update/post/checkpoint,
272 * read lock for scrub dump. */
273 struct rw_semaphore os_rwsem;
276 /* Scrub file in memory. */
277 struct scrub_file os_file;
279 /* Buffer for scrub file load/store. */
280 struct scrub_file os_file_disk;
284 /* The time for last checkpoint, seconds */
285 time64_t os_time_last_checkpoint;
287 /* The time for next checkpoint, seconds */
288 time64_t os_time_next_checkpoint;
290 /* How long to wait to start scrubbing */
291 time64_t os_auto_scrub_interval;
293 /* How many objects have been checked since last checkpoint. */
294 __u64 os_new_checked;
295 __u64 os_pos_current;
296 __u32 os_start_flags;
297 /* Some of these bits can be set by different threads so
298 * all updates must be protected by ->os_lock to avoid
299 * racing read-modify-write cycles causing corruption.
301 unsigned int os_in_prior:1, /* process inconsistent item
302 * found by RPC prior */
303 os_waiting:1, /* Waiting for scan window. */
304 os_full_speed:1, /* run w/o speed limit */
305 os_paused:1, /* The scrub is paused. */
309 os_running:1, /* scrub thread is running */
314 #define INDEX_BACKUP_MAGIC_V1 0x1E41F208
315 #define INDEX_BACKUP_BUFSIZE (4096 * 4)
317 enum lustre_index_backup_policy {
318 /* By default, do not backup the index */
321 /* Backup the dirty index objects when umount */
325 struct lustre_index_backup_header {
330 struct lu_fid libh_owner;
331 __u64 libh_pad[60]; /* keep header 512 bytes aligned */
334 struct lustre_index_backup_unit {
335 struct list_head libu_link;
336 struct lu_fid libu_fid;
341 struct lustre_index_restore_unit {
342 struct list_head liru_link;
343 struct lu_fid liru_pfid;
344 struct lu_fid liru_cfid;
350 void scrub_file_init(struct lustre_scrub *scrub, uuid_t uuid);
351 void scrub_file_reset(struct lustre_scrub *scrub, uuid_t uuid, u64 flags);
352 int scrub_file_load(const struct lu_env *env, struct lustre_scrub *scrub);
353 int scrub_file_store(const struct lu_env *env, struct lustre_scrub *scrub);
354 bool scrub_needs_check(struct lustre_scrub *scrub, const struct lu_fid *fid,
356 int scrub_checkpoint(const struct lu_env *env, struct lustre_scrub *scrub);
357 int scrub_thread_prep(const struct lu_env *env, struct lustre_scrub *scrub,
358 uuid_t uuid, u64 start);
359 int scrub_thread_post(const struct lu_env *env, struct lustre_scrub *scrub,
361 int scrub_start(int (*threadfn)(void *data), struct lustre_scrub *scrub,
362 void *data, __u32 flags);
363 void scrub_stop(struct lustre_scrub *scrub);
364 void scrub_dump(struct seq_file *m, struct lustre_scrub *scrub);
366 int lustre_liru_new(struct list_head *head, const struct lu_fid *pfid,
367 const struct lu_fid *cfid, __u64 child,
368 const char *name, int namelen);
370 int lustre_index_register(struct dt_device *dev, const char *devname,
371 struct list_head *head, spinlock_t *lock, int *guard,
372 const struct lu_fid *fid,
373 __u32 keysize, __u32 recsize);
375 void lustre_index_backup(const struct lu_env *env, struct dt_device *dev,
376 const char *devname, struct list_head *head,
377 spinlock_t *lock, int *guard, bool backup);
378 int lustre_index_restore(const struct lu_env *env, struct dt_device *dev,
379 const struct lu_fid *parent_fid,
380 const struct lu_fid *tgt_fid,
381 const struct lu_fid *bak_fid, const char *name,
382 struct list_head *head, spinlock_t *lock,
383 char *buf, int bufsize);
385 static inline void lustre_fid2lbx(char *buf, const struct lu_fid *fid, int len)
387 snprintf(buf, len, DFID_NOBRACE".lbx", PFID(fid));
390 static inline const char *osd_scrub2name(struct lustre_scrub *scrub)
392 return scrub->os_name;
394 #endif /* _LUSTRE_SCRUB_H */