Whamcloud - gitweb
LU-16518 rsync: fix new clang error in lustre_rsync.c
[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 <linux/uuid.h>
37 #include <dt_object.h>
38 #include <lustre_net.h>
39 #include <uapi/linux/lustre/lustre_disk.h>
40
41 #define SCRUB_CHECKPOINT_INTERVAL       60
42 #define SCRUB_WINDOW_SIZE               1024
43
44 enum scrub_next_status {
45         /* exit current loop and process next group */
46         SCRUB_NEXT_BREAK        = 1,
47
48         /* skip current object and process next bit */
49         SCRUB_NEXT_CONTINUE     = 2,
50
51         /* exit all the loops */
52         SCRUB_NEXT_EXIT         = 3,
53
54         /* wait for free cache slot */
55         SCRUB_NEXT_WAIT         = 4,
56
57         /* simulate system crash during OI scrub */
58         SCRUB_NEXT_CRASH        = 5,
59
60         /* simulate failure during OI scrub */
61         SCRUB_NEXT_FATAL        = 6,
62
63         /* new created object, no scrub on it */
64         SCRUB_NEXT_NOSCRUB      = 7,
65
66         /* the object has no FID-in-LMA */
67         SCRUB_NEXT_NOLMA        = 8,
68
69         /* for OST-object */
70         SCRUB_NEXT_OSTOBJ       = 9,
71
72         /* old OST-object, no LMA or no FID-on-OST flags in LMA */
73         SCRUB_NEXT_OSTOBJ_OLD   = 10,
74 };
75
76 enum scrub_local_file_flags {
77         SLFF_SCAN_SUBITEMS      = 0x0001,
78         SLFF_HIDE_FID           = 0x0002,
79         SLFF_SHOW_NAME          = 0x0004,
80         SLFF_NO_OI              = 0x0008,
81         SLFF_IDX_IN_FID         = 0x0010,
82 };
83
84 enum scrub_start {
85         /* Set failout flag. */
86         SS_SET_FAILOUT          = 0x00000001,
87
88         /* Clear failout flag. */
89         SS_CLEAR_FAILOUT        = 0x00000002,
90
91         /* Reset scrub start position. */
92         SS_RESET                = 0x00000004,
93
94         /* Trigger full scrub automatically. */
95         SS_AUTO_FULL            = 0x00000008,
96
97         /* Trigger partial scrub automatically. */
98         SS_AUTO_PARTIAL         = 0x00000010,
99
100         /* Set dryrun flag. */
101         SS_SET_DRYRUN           = 0x00000020,
102
103         /* Clear dryrun flag. */
104         SS_CLEAR_DRYRUN         = 0x00000040,
105 };
106
107 enum osd_lf_flags {
108         OLF_SCAN_SUBITEMS       = 0x0001,
109         OLF_HIDE_FID            = 0x0002,
110         OLF_SHOW_NAME           = 0x0004,
111         OLF_NO_OI               = 0x0008,
112         OLF_IDX_IN_FID          = 0x0010,
113         OLF_NOT_BACKUP          = 0x0020,
114 };
115
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.
119  *
120  * The 'auto_scrub' defines the time (united as second) interval to
121  * enable auto detect OI inconsistency since last OI scurb done. */
122 enum auto_scrub {
123         /* Disable auto scrub. */
124         AS_NEVER        = 0,
125
126         /* 1 second is too short interval, it is almost equal to always auto
127          * detect inconsistent OI, usually used for test. */
128         AS_ALWAYS       = 1,
129
130         /* Enable auto detect OI inconsistency one month (60 * 60 * 24 * 30)
131          * after last OI scrub. */
132         AS_DEFAULT      = 2592000LL,
133 };
134
135 struct lustre_scrub {
136         /* Object for the scrub file. */
137         struct dt_object       *os_obj;
138
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;
143
144         /* write lock for scrub prep/update/post/checkpoint,
145          * read lock for scrub dump. */
146         struct rw_semaphore     os_rwsem;
147         spinlock_t              os_lock;
148
149         /* Scrub file in memory. */
150         struct scrub_file       os_file;
151
152         /* Buffer for scrub file load/store. */
153         struct scrub_file       os_file_disk;
154
155         const char             *os_name;
156
157         /* The time for last checkpoint, seconds */
158         time64_t                os_time_last_checkpoint;
159
160         /* The time for next checkpoint, seconds */
161         time64_t                os_time_next_checkpoint;
162
163         /* How long to wait to start scrubbing */
164         time64_t                os_auto_scrub_interval;
165
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.
173          */
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. */
179                                 os_convert_igif:1,
180                                 os_partial_scan:1,
181                                 os_in_join:1,
182                                 os_running:1,   /* scrub thread is running */
183                                 os_full_scrub:1,
184                                 os_has_ml_file:1;
185 };
186
187 #define INDEX_BACKUP_MAGIC_V1   0x1E41F208
188 #define INDEX_BACKUP_BUFSIZE    (4096 * 4)
189
190 enum lustre_index_backup_policy {
191         /* By default, do not backup the index */
192         LIBP_NONE       = 0,
193
194         /* Backup the dirty index objects when umount */
195         LIBP_AUTO       = 1,
196 };
197
198 struct lustre_index_backup_header {
199         __u32           libh_magic;
200         __u32           libh_count;
201         __u32           libh_keysize;
202         __u32           libh_recsize;
203         struct lu_fid   libh_owner;
204         __u64           libh_pad[60]; /* keep header 512 bytes aligned */
205 };
206
207 struct lustre_index_backup_unit {
208         struct list_head        libu_link;
209         struct lu_fid           libu_fid;
210         __u32                   libu_keysize;
211         __u32                   libu_recsize;
212 };
213
214 struct lustre_index_restore_unit {
215         struct list_head        liru_link;
216         struct lu_fid           liru_pfid;
217         struct lu_fid           liru_cfid;
218         __u64                   liru_clid;
219         int                     liru_len;
220         char                    liru_name[0];
221 };
222
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,
228                        u64 index);
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,
233                       int result);
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);
238
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);
242
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);
247
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);
257
258 static inline void lustre_fid2lbx(char *buf, const struct lu_fid *fid, int len)
259 {
260         snprintf(buf, len, DFID_NOBRACE".lbx", PFID(fid));
261 }
262
263 static inline const char *osd_scrub2name(struct lustre_scrub *scrub)
264 {
265         return scrub->os_name;
266 }
267 #endif /* _LUSTRE_SCRUB_H */