* GPL HEADER END
*/
/*
- * Copyright (c) 2013, 2014, Intel Corporation.
+ * Copyright (c) 2013, 2015, Intel Corporation.
*/
/*
* lustre/lfsck/lfsck_bookmark.c
{
struct thandle *handle;
struct dt_object *obj = lfsck->li_bookmark_obj;
+ struct dt_device *dev = lfsck_obj2dev(obj);
loff_t pos = 0;
int len = sizeof(struct lfsck_bookmark);
int rc;
lfsck_bookmark_cpu_to_le(&lfsck->li_bookmark_disk,
&lfsck->li_bookmark_ram);
- handle = dt_trans_create(env, lfsck->li_bottom);
+ handle = dt_trans_create(env, dev);
if (IS_ERR(handle))
GOTO(log, rc = PTR_ERR(handle));
if (rc != 0)
GOTO(out, rc);
- rc = dt_trans_start_local(env, lfsck->li_bottom, handle);
+ rc = dt_trans_start_local(env, dev, handle);
if (rc != 0)
GOTO(out, rc);
GOTO(out, rc);
out:
- dt_trans_stop(env, lfsck->li_bottom, handle);
+ dt_trans_stop(env, dev, handle);
log:
if (rc != 0)
RETURN(PTR_ERR(root));
if (unlikely(!dt_try_as_dir(env, root))) {
- lu_object_put(env, &root->do_lu);
+ lfsck_object_put(env, root);
RETURN(-ENOTDIR);
}
obj = local_file_find_or_create(env, lfsck->li_los, root,
LFSCK_BOOKMARK,
S_IFREG | S_IRUGO | S_IWUSR);
- lu_object_put(env, &root->do_lu);
+ lfsck_object_put(env, root);
if (IS_ERR(obj))
RETURN(PTR_ERR(obj));
lfsck->li_bookmark_obj = obj;
rc = lfsck_bookmark_load(env, lfsck);
- if (rc == -ENODATA)
+ if (rc == 0) {
+ struct lfsck_bookmark *mb = &lfsck->li_bookmark_ram;
+
+ /* It is upgraded from old release, set it as
+ * LFSCK_ASYNC_WIN_DEFAULT to avoid memory pressure. */
+ if (unlikely(mb->lb_async_windows == 0)) {
+ mb->lb_async_windows = LFSCK_ASYNC_WIN_DEFAULT;
+ mutex_lock(&lfsck->li_mutex);
+ rc = lfsck_bookmark_store(env, lfsck);
+ mutex_unlock(&lfsck->li_mutex);
+ }
+ } else if (rc == -ENODATA) {
rc = lfsck_bookmark_init(env, lfsck);
+ }
RETURN(rc);
}
}
if (start->ls_valid & LSV_ASYNC_WINDOWS) {
+ if (start->ls_async_windows < 1 ||
+ start->ls_async_windows > LFSCK_ASYNC_WIN_MAX)
+ return -EINVAL;
+
if (bk->lb_async_windows != start->ls_async_windows) {
bk->lb_async_windows = start->ls_async_windows;
dirty = true;