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,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License version 2 for more details. A copy is
14 * included in the COPYING file that accompanied this code.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 * Copyright (c) 2012, 2013, Intel Corporation.
26 * lustre/lfsck/lfsck_bookmark.c
28 * Author: Fan, Yong <fan.yong@intel.com>
31 #define DEBUG_SUBSYSTEM S_LFSCK
33 #include <lu_object.h>
34 #include <dt_object.h>
35 #include <lustre_fid.h>
36 #include <lustre/lustre_user.h>
38 #include "lfsck_internal.h"
40 #define LFSCK_BOOKMARK_MAGIC 0x20130C1D
42 static const char lfsck_bookmark_name[] = "lfsck_bookmark";
44 static void lfsck_bookmark_le_to_cpu(struct lfsck_bookmark *des,
45 struct lfsck_bookmark *src)
47 des->lb_magic = le32_to_cpu(src->lb_magic);
48 des->lb_version = le16_to_cpu(src->lb_version);
49 des->lb_param = le16_to_cpu(src->lb_param);
50 des->lb_speed_limit = le32_to_cpu(src->lb_speed_limit);
53 static void lfsck_bookmark_cpu_to_le(struct lfsck_bookmark *des,
54 struct lfsck_bookmark *src)
56 des->lb_magic = cpu_to_le32(src->lb_magic);
57 des->lb_version = cpu_to_le16(src->lb_version);
58 des->lb_param = cpu_to_le16(src->lb_param);
59 des->lb_speed_limit = cpu_to_le32(src->lb_speed_limit);
62 static int lfsck_bookmark_load(const struct lu_env *env,
63 struct lfsck_instance *lfsck)
66 int len = sizeof(struct lfsck_bookmark);
69 rc = dt_record_read(env, lfsck->li_bookmark_obj,
70 lfsck_buf_get(env, &lfsck->li_bookmark_disk, len),
73 struct lfsck_bookmark *bm = &lfsck->li_bookmark_ram;
75 lfsck_bookmark_le_to_cpu(bm, &lfsck->li_bookmark_disk);
76 if (bm->lb_magic != LFSCK_BOOKMARK_MAGIC) {
77 CWARN("%.16s: invalid lfsck_bookmark magic "
78 "0x%x != 0x%x\n", lfsck_lfsck2name(lfsck),
79 bm->lb_magic, LFSCK_BOOKMARK_MAGIC);
80 /* Process it as new lfsck_bookmark. */
84 if (rc == -EFAULT && pos == 0)
85 /* return -ENODATA for empty lfsck_bookmark. */
88 CERROR("%.16s: fail to load lfsck_bookmark, "
89 "expected = %d, rc = %d\n",
90 lfsck_lfsck2name(lfsck), len, rc);
95 int lfsck_bookmark_store(const struct lu_env *env, struct lfsck_instance *lfsck)
97 struct thandle *handle;
98 struct dt_object *obj = lfsck->li_bookmark_obj;
100 int len = sizeof(struct lfsck_bookmark);
104 lfsck_bookmark_cpu_to_le(&lfsck->li_bookmark_disk,
105 &lfsck->li_bookmark_ram);
106 handle = dt_trans_create(env, lfsck->li_bottom);
107 if (IS_ERR(handle)) {
108 rc = PTR_ERR(handle);
109 CERROR("%.16s: fail to create trans for storing "
110 "lfsck_bookmark: %d\n,", lfsck_lfsck2name(lfsck), rc);
114 rc = dt_declare_record_write(env, obj, len, 0, handle);
116 CERROR("%.16s: fail to declare trans for storing "
117 "lfsck_bookmark: %d\n,", lfsck_lfsck2name(lfsck), rc);
121 rc = dt_trans_start_local(env, lfsck->li_bottom, handle);
123 CERROR("%.16s: fail to start trans for storing "
124 "lfsck_bookmark: %d\n,", lfsck_lfsck2name(lfsck), rc);
128 rc = dt_record_write(env, obj,
129 lfsck_buf_get(env, &lfsck->li_bookmark_disk, len),
132 CERROR("%.16s: fail to store lfsck_bookmark, expected = %d, "
133 "rc = %d\n", lfsck_lfsck2name(lfsck), len, rc);
138 dt_trans_stop(env, lfsck->li_bottom, handle);
142 static int lfsck_bookmark_init(const struct lu_env *env,
143 struct lfsck_instance *lfsck)
145 struct lfsck_bookmark *mb = &lfsck->li_bookmark_ram;
148 memset(mb, 0, sizeof(*mb));
149 mb->lb_magic = LFSCK_BOOKMARK_MAGIC;
150 mb->lb_version = LFSCK_VERSION_V2;
151 mutex_lock(&lfsck->li_mutex);
152 rc = lfsck_bookmark_store(env, lfsck);
153 mutex_unlock(&lfsck->li_mutex);
157 int lfsck_bookmark_setup(const struct lu_env *env,
158 struct lfsck_instance *lfsck)
160 struct dt_object *root;
161 struct dt_object *obj;
165 root = dt_locate(env, lfsck->li_bottom, &lfsck->li_local_root_fid);
167 RETURN(PTR_ERR(root));
169 dt_try_as_dir(env, root);
170 obj = local_file_find_or_create(env, lfsck->li_los, root,
172 S_IFREG | S_IRUGO | S_IWUSR);
173 lu_object_put(env, &root->do_lu);
175 RETURN(PTR_ERR(obj));
177 lfsck->li_bookmark_obj = obj;
178 rc = lfsck_bookmark_load(env, lfsck);
180 rc = lfsck_bookmark_init(env, lfsck);