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 <linux/uuid.h>
37 #include <dt_object.h>
38 #include <lustre_net.h>
39 #include <uapi/linux/lustre/lustre_disk.h>
41 #define SCRUB_CHECKPOINT_INTERVAL 60
42 #define SCRUB_WINDOW_SIZE 1024
44 enum scrub_next_status {
45 /* exit current loop and process next group */
48 /* skip current object and process next bit */
49 SCRUB_NEXT_CONTINUE = 2,
51 /* exit all the loops */
54 /* wait for free cache slot */
57 /* simulate system crash during OI scrub */
60 /* simulate failure during OI scrub */
63 /* new created object, no scrub on it */
64 SCRUB_NEXT_NOSCRUB = 7,
66 /* the object has no FID-in-LMA */
70 SCRUB_NEXT_OSTOBJ = 9,
72 /* old OST-object, no LMA or no FID-on-OST flags in LMA */
73 SCRUB_NEXT_OSTOBJ_OLD = 10,
76 enum scrub_local_file_flags {
77 SLFF_SCAN_SUBITEMS = 0x0001,
78 SLFF_HIDE_FID = 0x0002,
79 SLFF_SHOW_NAME = 0x0004,
81 SLFF_IDX_IN_FID = 0x0010,
85 /* Set failout flag. */
86 SS_SET_FAILOUT = 0x00000001,
88 /* Clear failout flag. */
89 SS_CLEAR_FAILOUT = 0x00000002,
91 /* Reset scrub start position. */
92 SS_RESET = 0x00000004,
94 /* Trigger full scrub automatically. */
95 SS_AUTO_FULL = 0x00000008,
97 /* Trigger partial scrub automatically. */
98 SS_AUTO_PARTIAL = 0x00000010,
100 /* Set dryrun flag. */
101 SS_SET_DRYRUN = 0x00000020,
103 /* Clear dryrun flag. */
104 SS_CLEAR_DRYRUN = 0x00000040,
108 OLF_SCAN_SUBITEMS = 0x0001,
109 OLF_HIDE_FID = 0x0002,
110 OLF_SHOW_NAME = 0x0004,
112 OLF_IDX_IN_FID = 0x0010,
113 OLF_NOT_BACKUP = 0x0020,
116 /* There are some overhead to detect OI inconsistency automatically
117 * during normal RPC handling. We do not want to always auto detect
118 * OI inconsistency especailly when OI scrub just done recently.
120 * The 'auto_scrub' defines the time (united as second) interval to
121 * enable auto detect OI inconsistency since last OI scurb done. */
123 /* Disable auto scrub. */
126 /* 1 second is too short interval, it is almost equal to always auto
127 * detect inconsistent OI, usually used for test. */
130 /* Enable auto detect OI inconsistency one month (60 * 60 * 24 * 30)
131 * after last OI scrub. */
132 AS_DEFAULT = 2592000LL,
135 struct lustre_scrub {
136 /* Object for the scrub file. */
137 struct dt_object *os_obj;
139 struct task_struct *os_task;
140 struct list_head os_inconsistent_items;
141 /* once inconsistent mapping can't be fixed, put into this list */
142 struct list_head os_stale_items;
144 /* write lock for scrub prep/update/post/checkpoint,
145 * read lock for scrub dump. */
146 struct rw_semaphore os_rwsem;
149 /* Scrub file in memory. */
150 struct scrub_file os_file;
152 /* Buffer for scrub file load/store. */
153 struct scrub_file os_file_disk;
157 /* The time for last checkpoint, seconds */
158 time64_t os_time_last_checkpoint;
160 /* The time for next checkpoint, seconds */
161 time64_t os_time_next_checkpoint;
163 /* How long to wait to start scrubbing */
164 time64_t os_auto_scrub_interval;
166 /* How many objects have been checked since last checkpoint. */
167 __u64 os_new_checked;
168 __u64 os_pos_current;
169 __u32 os_start_flags;
170 /* Some of these bits can be set by different threads so
171 * all updates must be protected by ->os_lock to avoid
172 * racing read-modify-write cycles causing corruption.
174 unsigned int os_in_prior:1, /* process inconsistent item
175 * found by RPC prior */
176 os_waiting:1, /* Waiting for scan window. */
177 os_full_speed:1, /* run w/o speed limit */
178 os_paused:1, /* The scrub is paused. */
182 os_running:1, /* scrub thread is running */
187 #define INDEX_BACKUP_MAGIC_V1 0x1E41F208
188 #define INDEX_BACKUP_BUFSIZE (4096 * 4)
190 enum lustre_index_backup_policy {
191 /* By default, do not backup the index */
194 /* Backup the dirty index objects when umount */
198 struct lustre_index_backup_header {
203 struct lu_fid libh_owner;
204 __u64 libh_pad[60]; /* keep header 512 bytes aligned */
207 struct lustre_index_backup_unit {
208 struct list_head libu_link;
209 struct lu_fid libu_fid;
214 struct lustre_index_restore_unit {
215 struct list_head liru_link;
216 struct lu_fid liru_pfid;
217 struct lu_fid liru_cfid;
223 void scrub_file_init(struct lustre_scrub *scrub, guid_t uuid);
224 void scrub_file_reset(struct lustre_scrub *scrub, guid_t uuid, u64 flags);
225 int scrub_file_load(const struct lu_env *env, struct lustre_scrub *scrub);
226 int scrub_file_store(const struct lu_env *env, struct lustre_scrub *scrub);
227 bool scrub_needs_check(struct lustre_scrub *scrub, const struct lu_fid *fid,
229 int scrub_checkpoint(const struct lu_env *env, struct lustre_scrub *scrub);
230 int scrub_thread_prep(const struct lu_env *env, struct lustre_scrub *scrub,
231 guid_t uuid, u64 start);
232 int scrub_thread_post(const struct lu_env *env, struct lustre_scrub *scrub,
234 int scrub_start(int (*threadfn)(void *data), struct lustre_scrub *scrub,
235 void *data, __u32 flags);
236 void scrub_stop(struct lustre_scrub *scrub);
237 void scrub_dump(struct seq_file *m, struct lustre_scrub *scrub);
239 int lustre_liru_new(struct list_head *head, const struct lu_fid *pfid,
240 const struct lu_fid *cfid, __u64 child,
241 const char *name, int namelen);
243 int lustre_index_register(struct dt_device *dev, const char *devname,
244 struct list_head *head, spinlock_t *lock, int *guard,
245 const struct lu_fid *fid,
246 __u32 keysize, __u32 recsize);
248 void lustre_index_backup(const struct lu_env *env, struct dt_device *dev,
249 const char *devname, struct list_head *head,
250 spinlock_t *lock, int *guard, bool backup);
251 int lustre_index_restore(const struct lu_env *env, struct dt_device *dev,
252 const struct lu_fid *parent_fid,
253 const struct lu_fid *tgt_fid,
254 const struct lu_fid *bak_fid, const char *name,
255 struct list_head *head, spinlock_t *lock,
256 char *buf, int bufsize);
258 static inline void lustre_fid2lbx(char *buf, const struct lu_fid *fid, int len)
260 snprintf(buf, len, DFID_NOBRACE".lbx", PFID(fid));
263 static inline const char *osd_scrub2name(struct lustre_scrub *scrub)
265 return scrub->os_name;
267 #endif /* _LUSTRE_SCRUB_H */