* Author: Fan Yong <yong.fan@whamcloud.com>
*/
-#define DEBUG_SUBSYSTEM S_MDS
+#define DEBUG_SUBSYSTEM S_LFSCK
#include <lustre/lustre_idl.h>
#include <lustre_disk.h>
return scrub->os_pos_current < ooc->ooc_pos_preload + SCRUB_WINDOW_SIZE;
}
+static inline const char *osd_scrub2name(struct osd_scrub *scrub)
+{
+ return LDISKFS_SB(osd_scrub2sb(scrub))->s_es->s_volume_name;
+}
+
/**
* update/insert/delete the specified OI mapping (@fid @id) according to the ops
*
/* DTO_INDEX_INSERT is enough for other two ops:
* delete/update, but save stack. */
- th = ldiskfs_journal_start_sb(osd_sb(dev),
+ th = osd_journal_start_sb(osd_sb(dev), LDISKFS_HT_MISC,
osd_dto_credits_noquota[DTO_INDEX_INSERT]);
if (IS_ERR(th)) {
rc = PTR_ERR(th);
- CERROR("%s: fail to start trans for scrub %d: rc = %d\n",
- osd_name(dev), ops, rc);
+ CDEBUG(D_LFSCK, "%s: fail to start trans for scrub op %d "
+ DFID" => %u/%u: rc = %d\n", osd_name(dev), ops,
+ PFID(fid), id->oii_ino, id->oii_gen, rc);
RETURN(rc);
}
}
ldiskfs_journal_stop(th);
- return rc;
+ if (rc < 0)
+ CDEBUG(D_LFSCK, "%s: fail to refresh OI map for scrub op %d "
+ DFID" => %u/%u: rc = %d\n", osd_name(dev), ops,
+ PFID(fid), id->oii_ino, id->oii_gen, rc);
+
+ RETURN(rc);
}
/* OI_scrub file ops */
{
struct scrub_file *sf = &scrub->os_file;
- CDEBUG(D_LFSCK, "Reset OI scrub file, flags = "LPX64"\n", flags);
+ CDEBUG(D_LFSCK, "%.16s: reset OI scrub file, flags = "LPX64"\n",
+ osd_scrub2name(scrub), flags);
memcpy(sf->sf_uuid, uuid, 16);
sf->sf_status = SS_INIT;
sf->sf_flags |= flags;
static int osd_scrub_file_load(struct osd_scrub *scrub)
{
loff_t pos = 0;
- char *name = LDISKFS_SB(osd_scrub2sb(scrub))->s_es->s_volume_name;
int len = sizeof(scrub->os_file_disk);
int rc;
osd_scrub_file_to_cpu(sf, &scrub->os_file_disk);
if (sf->sf_magic != SCRUB_MAGIC_V1) {
- CWARN("%.16s: invalid scrub magic 0x%x != 0x%x\n,",
- name, sf->sf_magic, SCRUB_MAGIC_V1);
+ CDEBUG(D_LFSCK, "%.16s: invalid scrub magic "
+ "0x%x != 0x%x\n", osd_scrub2name(scrub),
+ sf->sf_magic, SCRUB_MAGIC_V1);
/* Process it as new scrub file. */
rc = -ENOENT;
} else {
rc = 0;
}
} else if (rc != 0) {
- CERROR("%.16s: fail to load scrub file, expected = %d, "
- "rc = %d\n", name, len, rc);
+ CDEBUG(D_LFSCK, "%.16s: fail to load scrub file, "
+ "expected = %d: rc = %d\n",
+ osd_scrub2name(scrub), len, rc);
if (rc > 0)
rc = -EFAULT;
} else {
jh = osd_journal_start_sb(osd_sb(dev), LDISKFS_HT_MISC, credits);
if (IS_ERR(jh)) {
rc = PTR_ERR(jh);
- CERROR("%.16s: fail to start trans for scrub store, rc = %d\n",
- LDISKFS_SB(osd_scrub2sb(scrub))->s_es->s_volume_name,rc);
+ CDEBUG(D_LFSCK, "%.16s: fail to start trans for scrub store: "
+ "rc = %d\n", osd_scrub2name(scrub), rc);
return rc;
}
len, 0, &pos, jh);
ldiskfs_journal_stop(jh);
if (rc != 0)
- CERROR("%.16s: fail to store scrub file, expected = %d, "
- "rc = %d\n",
- LDISKFS_SB(osd_scrub2sb(scrub))->s_es->s_volume_name,
- len, rc);
+ CDEBUG(D_LFSCK, "%.16s: fail to store scrub file, "
+ "expected = %d: rc = %d\n",
+ osd_scrub2name(scrub), len, rc);
+
scrub->os_time_last_checkpoint = cfs_time_current();
scrub->os_time_next_checkpoint = scrub->os_time_last_checkpoint +
cfs_time_seconds(SCRUB_CHECKPOINT_INTERVAL);
osd_dto_credits_noquota[DTO_XATTR_SET] * 3);
if (IS_ERR(jh)) {
rc = PTR_ERR(jh);
- CERROR("%s: fail to start trans for convert ff: "DFID
- ": rc = %d\n",
- osd_name(dev), PFID(fid), rc);
+ CDEBUG(D_LFSCK, "%s: fail to start trans for convert ff "
+ DFID": rc = %d\n", osd_name(dev), PFID(fid), rc);
RETURN(rc);
}
stop:
ldiskfs_journal_stop(jh);
+ if (rc < 0)
+ CDEBUG(D_LFSCK, "%s: fail to convert ff "DFID": rc = %d\n",
+ osd_name(dev), PFID(fid), rc);
return rc;
}
GOTO(out, rc = val);
if (scrub->os_in_prior)
- oii = cfs_list_entry(oic, struct osd_inconsistent_item,
- oii_cache);
+ oii = list_entry(oic, struct osd_inconsistent_item,
+ oii_cache);
if (lid->oii_ino < sf->sf_pos_latest_start && oii == NULL)
GOTO(out, rc = 0);
iput(inode);
if (oii != NULL) {
- LASSERT(!cfs_list_empty(&oii->oii_list));
+ LASSERT(!list_empty(&oii->oii_list));
spin_lock(&scrub->os_lock);
- cfs_list_del_init(&oii->oii_list);
+ list_del_init(&oii->oii_list);
spin_unlock(&scrub->os_lock);
OBD_FREE_PTR(oii);
}
sf->sf_run_time += cfs_duration_sec(cfs_time_current() + HALF_SEC -
scrub->os_time_last_checkpoint);
result = osd_scrub_file_store(scrub);
- if (result < 0)
- CERROR("%.16s: fail to osd_scrub_post, rc = %d\n",
- LDISKFS_SB(osd_scrub2sb(scrub))->s_es->s_volume_name,
- result);
up_write(&scrub->os_rwsem);
EXIT;
int rc;
ENTRY;
+ /* Not handle the backend root object and agent parent object.
+ * They are neither visible to namespace nor have OI mappings. */
+ if (unlikely(pos == osd_sb(dev)->s_root->d_inode->i_ino ||
+ pos == osd_remote_parent_ino(dev)))
+ RETURN(SCRUB_NEXT_CONTINUE);
+
osd_id_gen(lid, pos, OSD_OII_NOGEN);
inode = osd_iget(info, dev, lid);
if (IS_ERR(inode)) {
if (rc == -ENOENT || rc == -ESTALE)
RETURN(SCRUB_NEXT_CONTINUE);
- CERROR("%.16s: fail to read inode, ino# = %u, rc = %d\n",
- LDISKFS_SB(sb)->s_es->s_volume_name, pos, rc);
+ CDEBUG(D_LFSCK, "%.16s: fail to read inode, ino# = %u: "
+ "rc = %d\n", LDISKFS_SB(sb)->s_es->s_volume_name,
+ pos, rc);
RETURN(rc);
}
lwi = LWI_TIMEOUT(cfs_time_seconds(cfs_fail_val), NULL, NULL);
l_wait_event(thread->t_ctl_waitq,
- !cfs_list_empty(&scrub->os_inconsistent_items) ||
+ !list_empty(&scrub->os_inconsistent_items) ||
!thread_is_running(thread),
&lwi);
}
if (unlikely(!thread_is_running(thread)))
return SCRUB_NEXT_EXIT;
- if (!cfs_list_empty(&scrub->os_inconsistent_items)) {
+ if (!list_empty(&scrub->os_inconsistent_items)) {
struct osd_inconsistent_item *oii;
- oii = cfs_list_entry(scrub->os_inconsistent_items.next,
- struct osd_inconsistent_item, oii_list);
+ oii = list_entry(scrub->os_inconsistent_items.next,
+ struct osd_inconsistent_item, oii_list);
*oic = &oii->oii_cache;
scrub->os_in_prior = 1;
return 0;
{
spin_lock(&scrub->os_lock);
if (osd_scrub_has_window(scrub, &it->ooi_cache) ||
- !cfs_list_empty(&scrub->os_inconsistent_items) ||
+ !list_empty(&scrub->os_inconsistent_items) ||
it->ooi_waiting || !thread_is_running(&scrub->os_thread))
scrub->os_waiting = 0;
else
rc = osd_scrub_checkpoint(scrub);
if (rc != 0) {
- CERROR("%.16s: fail to checkpoint, pos = %u, rc = %d\n",
- LDISKFS_SB(param->sb)->s_es->s_volume_name,
+ CDEBUG(D_LFSCK, "%.16s: fail to checkpoint, pos = %u: "
+ "rc = %d\n", osd_scrub2name(scrub),
scrub->os_pos_current, rc);
/* Continue, as long as the scrub itself can go ahead. */
}
if (scrub->os_full_speed || rc == SCRUB_NEXT_CONTINUE)
return 0;
- if (osd_scrub_has_window(scrub, ooc)) {
+ if (ooc != NULL && osd_scrub_has_window(scrub, ooc)) {
*noslot = 0;
return 0;
}
- l_wait_event(thread->t_ctl_waitq,
- osd_scrub_wakeup(scrub, it),
- &lwi);
+ if (it != NULL)
+ l_wait_event(thread->t_ctl_waitq, osd_scrub_wakeup(scrub, it),
+ &lwi);
- if (osd_scrub_has_window(scrub, ooc))
+ if (ooc != NULL && osd_scrub_has_window(scrub, ooc))
*noslot = 0;
else
*noslot = 1;
param.gbase = 1 + param.bg * LDISKFS_INODES_PER_GROUP(param.sb);
param.bitmap = ldiskfs_read_inode_bitmap(param.sb, param.bg);
if (param.bitmap == NULL) {
- CERROR("%.16s: fail to read bitmap for %u, "
+ CDEBUG(D_LFSCK, "%.16s: fail to read bitmap for %u, "
"scrub will stop, urgent mode\n",
LDISKFS_SB(param.sb)->s_es->s_volume_name,
(__u32)param.bg);
if (rc == SCRUB_IT_ALL)
it->ooi_all_cached = 1;
- CDEBUG(D_LFSCK, "OSD pre-loaded: max = %u, preload = %u, rc = %d\n",
- le32_to_cpu(LDISKFS_SB(osd_sb(dev))->s_es->s_inodes_count),
- ooc->ooc_pos_preload, rc);
-
if (scrub->os_waiting && osd_scrub_has_window(scrub, ooc)) {
spin_lock(&scrub->os_lock);
scrub->os_waiting = 0;
struct osd_device *dev = (struct osd_device *)args;
struct osd_scrub *scrub = &dev->od_scrub;
struct ptlrpc_thread *thread = &scrub->os_thread;
- struct super_block *sb = osd_sb(dev);
int rc;
ENTRY;
rc = lu_env_init(&env, LCT_LOCAL);
if (rc != 0) {
- CERROR("%.16s: OI scrub, fail to init env, rc = %d\n",
- LDISKFS_SB(sb)->s_es->s_volume_name, rc);
+ CDEBUG(D_LFSCK, "%.16s: OI scrub fail to init env: rc = %d\n",
+ osd_scrub2name(scrub), rc);
GOTO(noenv, rc);
}
rc = osd_scrub_prep(dev);
if (rc != 0) {
- CERROR("%.16s: OI scrub, fail to scrub prep, rc = %d\n",
- LDISKFS_SB(sb)->s_es->s_volume_name, rc);
+ CDEBUG(D_LFSCK, "%.16s: OI scrub fail to scrub prep: rc = %d\n",
+ osd_scrub2name(scrub), rc);
GOTO(out, rc);
}
scrub->os_pos_current = ooc->ooc_pos_preload;
}
- CDEBUG(D_LFSCK, "OI scrub: flags = 0x%x, pos = %u\n",
- scrub->os_start_flags, scrub->os_pos_current);
+ CDEBUG(D_LFSCK, "%.16s: OI scrub start, flags = 0x%x, pos = %u\n",
+ osd_scrub2name(scrub), scrub->os_start_flags,
+ scrub->os_pos_current);
rc = osd_inode_iteration(osd_oti_get(&env), dev, ~0U, false);
if (unlikely(rc == SCRUB_IT_CRASH))
post:
osd_scrub_post(scrub, rc);
- CDEBUG(D_LFSCK, "OI scrub: stop, rc = %d, pos = %u\n",
- rc, scrub->os_pos_current);
+ CDEBUG(D_LFSCK, "%.16s: OI scrub: stop, pos = %u: rc = %d\n",
+ osd_scrub2name(scrub), scrub->os_pos_current, rc);
out:
- while (!cfs_list_empty(&scrub->os_inconsistent_items)) {
+ while (!list_empty(&scrub->os_inconsistent_items)) {
struct osd_inconsistent_item *oii;
- oii = cfs_list_entry(scrub->os_inconsistent_items.next,
+ oii = list_entry(scrub->os_inconsistent_items.next,
struct osd_inconsistent_item, oii_list);
- cfs_list_del_init(&oii->oii_list);
+ list_del_init(&oii->oii_list);
OBD_FREE_PTR(oii);
}
lu_env_fini(&env);
OLF_SHOW_NAME, NULL, NULL },
/* lost+found */
- { "lost+found", { 0, 0, 0 }, OLF_SCAN_SUBITEMS | OLF_NO_OI,
- osd_ios_general_scan, osd_ios_lf_fill },
+ { "lost+found", { FID_SEQ_LOCAL_FILE, OSD_LPF_OID, 0 },
+ OLF_SCAN_SUBITEMS, osd_ios_general_scan, osd_ios_lf_fill },
{ NULL, { 0, 0, 0 }, 0, NULL, NULL }
};
};
struct osd_ios_item {
- cfs_list_t oii_list;
+ struct list_head oii_list;
struct dentry *oii_dentry;
scandir_t oii_scandir;
filldir_t oii_filldir;
{
struct dentry *dentry;
- CDEBUG(D_LFSCK, "init lookup one: parent = %.*s, name = %.*s\n",
- parent->d_name.len, parent->d_name.name, namelen, name);
-
dentry = ll_lookup_one_len(name, parent, namelen);
if (!IS_ERR(dentry) && dentry->d_inode == NULL) {
dput(dentry);
if (item == NULL)
RETURN(-ENOMEM);
- CFS_INIT_LIST_HEAD(&item->oii_list);
+ INIT_LIST_HEAD(&item->oii_list);
item->oii_dentry = dget(dentry);
item->oii_scandir = scandir;
item->oii_filldir = filldir;
- cfs_list_add_tail(&item->oii_list, &dev->od_ios_list);
+ list_add_tail(&item->oii_list, &dev->od_ios_list);
RETURN(0);
}
int rc;
ENTRY;
- CDEBUG(D_LFSCK, "init scan one: ino = %ld\n", inode->i_ino);
-
rc = osd_get_lma(info, inode, &info->oti_obj_dentry, lma);
- if (rc != 0 && rc != -ENODATA)
+ if (rc != 0 && rc != -ENODATA) {
+ CDEBUG(D_LFSCK, "%s: fail to get lma for init OI scrub: "
+ "rc = %d\n", osd_name(dev), rc);
+
RETURN(rc);
+ }
osd_id_gen(id, inode->i_ino, inode->i_generation);
if (rc == -ENODATA) {
else
tfid = *fid;
rc = osd_ea_fid_set(info, inode, &tfid, 0, 0);
- if (rc != 0)
+ if (rc != 0) {
+ CDEBUG(D_LFSCK, "%s: fail to set LMA for init OI "
+ "scrub: rc = %d\n", osd_name(dev), rc);
+
RETURN(rc);
+ }
} else {
if (lma->lma_compat & LMAC_NOT_IN_OI)
RETURN(0);
scrub->os_lf_scanned++;
child = osd_ios_lookup_one_len(name, parent, namelen);
if (IS_ERR(child)) {
- CWARN("%s: cannot lookup child '%.*s': rc = %d\n",
+ CDEBUG(D_LFSCK, "%s: cannot lookup child '%.*s': rc = %d\n",
osd_name(dev), namelen, name, (int)PTR_ERR(child));
RETURN(0);
}
rc = osd_ios_new_item(dev, child, osd_ios_general_scan,
osd_ios_lf_fill);
if (rc != 0)
- CWARN("%s: cannot add child '%.*s': rc = %d\n",
- osd_name(dev), namelen, name, rc);
+ CDEBUG(D_LFSCK, "%s: cannot add child '%.*s': "
+ "rc = %d\n", osd_name(dev), namelen, name, rc);
GOTO(put, rc);
}
"/lost+found.\n", namelen, name, PFID(fid));
scrub->os_lf_repaired++;
} else {
- CWARN("%s: cannot rename for '%.*s' "DFID": rc = %d\n",
- osd_name(dev), namelen, name, PFID(fid), rc);
+ CDEBUG(D_LFSCK, "%s: cannot rename for '%.*s' "
+ DFID": rc = %d\n",
+ osd_name(dev), namelen, name, PFID(fid), rc);
}
}
if (rc != 0)
break;
- if (cfs_list_empty(&dev->od_ios_list))
+ if (list_empty(&dev->od_ios_list))
break;
- item = cfs_list_entry(dev->od_ios_list.next,
- struct osd_ios_item, oii_list);
- cfs_list_del_init(&item->oii_list);
+ item = list_entry(dev->od_ios_list.next,
+ struct osd_ios_item, oii_list);
+ list_del_init(&item->oii_list);
LASSERT(item->oii_scandir != NULL);
scandir = item->oii_scandir;
dentry = item->oii_dentry;
}
- while (!cfs_list_empty(&dev->od_ios_list)) {
- item = cfs_list_entry(dev->od_ios_list.next,
- struct osd_ios_item, oii_list);
- cfs_list_del_init(&item->oii_list);
+ while (!list_empty(&dev->od_ios_list)) {
+ item = list_entry(dev->od_ios_list.next,
+ struct osd_ios_item, oii_list);
+ list_del_init(&item->oii_list);
dput(item->oii_dentry);
OBD_FREE_PTR(item);
}
if (IS_ERR(task)) {
rc = PTR_ERR(task);
CERROR("%.16s: cannot start iteration thread: rc = %d\n",
- LDISKFS_SB(osd_sb(dev))->s_es->s_volume_name, rc);
+ osd_scrub2name(scrub), rc);
RETURN(rc);
}
init_waitqueue_head(&scrub->os_thread.t_ctl_waitq);
init_rwsem(&scrub->os_rwsem);
spin_lock_init(&scrub->os_lock);
- CFS_INIT_LIST_HEAD(&scrub->os_inconsistent_items);
+ INIT_LIST_HEAD(&scrub->os_inconsistent_items);
push_ctxt(&saved, ctxt);
filp = filp_open(osd_scrub_name, O_RDWR | O_CREAT, 0644);
if (unlikely(oii == NULL))
RETURN(-ENOMEM);
- CFS_INIT_LIST_HEAD(&oii->oii_list);
+ INIT_LIST_HEAD(&oii->oii_list);
oii->oii_cache = *oic;
oii->oii_insert = insert;
RETURN(-EAGAIN);
}
- if (cfs_list_empty(&scrub->os_inconsistent_items))
+ if (list_empty(&scrub->os_inconsistent_items))
wakeup = 1;
- cfs_list_add_tail(&oii->oii_list, &scrub->os_inconsistent_items);
+ list_add_tail(&oii->oii_list, &scrub->os_inconsistent_items);
spin_unlock(&scrub->os_lock);
if (wakeup != 0)
ENTRY;
spin_lock(&scrub->os_lock);
- cfs_list_for_each_entry(oii, &scrub->os_inconsistent_items, oii_list) {
+ list_for_each_entry(oii, &scrub->os_inconsistent_items, oii_list) {
if (lu_fid_eq(fid, &oii->oii_cache.oic_fid)) {
*id = oii->oii_cache.oic_lid;
spin_unlock(&scrub->os_lock);