int lfsck_bookmark_setup(const struct lu_env *env, struct lfsck_instance *lfsck) { struct dt_object *root; struct dt_object *obj; int rc; ENTRY; root = dt_locate(env, lfsck->li_bottom, &lfsck->li_local_root_fid); if (IS_ERR(root)) RETURN(PTR_ERR(root)); dt_try_as_dir(env, root); obj = local_file_find_or_create(env, lfsck->li_los, root, lfsck_bookmark_name, S_IFREG | S_IRUGO | S_IWUSR); lu_object_put(env, &root->do_lu); if (IS_ERR(obj)) RETURN(PTR_ERR(obj)); lfsck->li_bookmark_obj = obj; rc = lfsck_bookmark_load(env, lfsck); if (rc == -ENODATA) rc = lfsck_bookmark_init(env, lfsck); RETURN(rc); }
int lfsck_bookmark_setup(const struct lu_env *env, struct lfsck_instance *lfsck) { struct dt_object *root; struct dt_object *obj; int rc; ENTRY; root = dt_locate(env, lfsck->li_bottom, &lfsck->li_local_root_fid); if (IS_ERR(root)) RETURN(PTR_ERR(root)); if (unlikely(!dt_try_as_dir(env, root))) { 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); 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 == 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); }