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);
(val == SCRUB_NEXT_OSTOBJ ||
val == SCRUB_NEXT_OSTOBJ_OLD) ? OI_KNOWN_ON_OST : 0);
if (rc != 0) {
- if (rc != -ENOENT)
+ if (rc != -ENOENT && rc != -ESTALE)
GOTO(out, rc);
iget:
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);
}
rc = osd_get_lma(info, inode, &info->oti_obj_dentry, lma);
if (rc == 0) {
has_lma = true;
- if (lma->lma_compat & LMAC_NOT_IN_OI) {
- ldiskfs_set_inode_state(inode,
- LDISKFS_STATE_LUSTRE_NO_OI);
+ if (lma->lma_compat & LMAC_NOT_IN_OI ||
+ lma->lma_incompat & LMAI_AGENT)
return SCRUB_NEXT_CONTINUE;
- }
*fid = lma->lma_self_fid;
- if (fid_is_internal(&lma->lma_self_fid)) {
- if (!scrub)
- rc = SCRUB_NEXT_CONTINUE;
- return rc;
- }
-
if (!scrub)
return 0;
- if (fid_is_namespace_visible(fid) && !fid_is_norm(fid))
- return 0;
-
if (lma->lma_compat & LMAC_FID_ON_OST)
return SCRUB_NEXT_OSTOBJ;
- if (fid_is_idif(fid) || fid_is_last_id(fid))
+ if (fid_is_idif(fid))
return SCRUB_NEXT_OSTOBJ_OLD;
- if (lma->lma_incompat & LMAI_AGENT)
- return SCRUB_NEXT_CONTINUE;
+ /* For local object. */
+ if (fid_is_internal(fid))
+ return 0;
+
+ /* For external visible MDT-object with non-normal FID. */
+ if (fid_is_namespace_visible(fid) && !fid_is_norm(fid))
+ return 0;
- /* Here, it may be MDT-object, or may be 2.4 OST-object.
- * Fall through. */
+ /* For the object with normal FID, it may be MDT-object,
+ * or may be 2.4 OST-object, need further distinguish.
+ * Fall through to next section. */
}
if (rc == -ENODATA || rc == 0) {
RETURN(rc);
}
- /* If the inode has no OI mapping, then it is special locally used,
- * should be invisible to OI scrub or up layer LFSCK. */
- if (ldiskfs_test_inode_state(inode, LDISKFS_STATE_LUSTRE_NO_OI))
- GOTO(put, rc = SCRUB_NEXT_CONTINUE);
-
if (scrub &&
ldiskfs_test_inode_state(inode, LDISKFS_STATE_LUSTRE_NOSCRUB)) {
/* Only skip it for the first OI scrub accessing. */
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
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;
rc, scrub->os_pos_current);
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);
{ "LAST_GROUP", { FID_SEQ_LOCAL_FILE, OFD_LAST_GROUP_OID, 0 },
OLF_SHOW_NAME, NULL, NULL },
+ /* SLAVE_LOG, llog for destroy slave stripes of striped dir */
+ { "SLAVE_LOG", { FID_SEQ_LOCAL_FILE, SLAVE_LLOG_CATALOGS_OID, 0 },
+ 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 },
{ "fid", { FID_SEQ_DOT_LUSTRE, FID_OID_DOT_LUSTRE_OBF, 0 }, 0,
NULL, NULL },
+ /* .lustre/lost+found */
+ { "lost+found", { FID_SEQ_DOT_LUSTRE, FID_OID_DOT_LUSTRE_LPF, 0 }, 0,
+ NULL, NULL },
+
{ 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 osd_ios_filldir_buf {
+#ifdef HAVE_DIR_CONTEXT
+ /* please keep it as first member */
+ struct dir_context ctx;
+#endif
struct osd_thread_info *oifb_info;
struct osd_device *oifb_dev;
struct dentry *oifb_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);
}
osd_ios_general_scan(struct osd_thread_info *info, struct osd_device *dev,
struct dentry *dentry, filldir_t filldir)
{
- struct osd_ios_filldir_buf buf = { info, dev, dentry };
+ struct osd_ios_filldir_buf buf = {
+#ifdef HAVE_DIR_CONTEXT
+ .ctx.actor = filldir,
+#endif
+ .oifb_info = info,
+ .oifb_dev = dev,
+ .oifb_dentry = dentry };
struct file *filp = &info->oti_it_ea.oie_file;
struct inode *inode = dentry->d_inode;
const struct file_operations *fops = inode->i_fop;
filp->private_data = NULL;
set_file_inode(filp, inode);
+#ifdef HAVE_DIR_CONTEXT
+ buf.ctx.pos = filp->f_pos;
+ rc = fops->iterate(filp, &buf.ctx);
+ filp->f_pos = buf.ctx.pos;
+#else
rc = fops->readdir(filp, &buf, filldir);
+#endif
fops->release(inode, filp);
RETURN(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);
}
struct osd_scrub *scrub = &dev->od_scrub;
struct ptlrpc_thread *thread = &scrub->os_thread;
struct l_wait_info lwi = { 0 };
+ struct task_struct *task;
int rc;
ENTRY;
}
spin_unlock(&scrub->os_lock);
- if (scrub->os_file.sf_status == SS_COMPLETED)
+ if (scrub->os_file.sf_status == SS_COMPLETED) {
+ if (!(flags & SS_SET_FAILOUT))
+ flags |= SS_CLEAR_FAILOUT;
+
+ if (!(flags & SS_SET_DRYRUN))
+ flags |= SS_CLEAR_DRYRUN;
+
flags |= SS_RESET;
+ }
scrub->os_start_flags = flags;
thread_set_flags(thread, 0);
- rc = PTR_ERR(kthread_run(osd_scrub_main, dev, "OI_scrub"));
- if (IS_ERR_VALUE(rc)) {
- CERROR("%.16s: cannot start iteration thread, rc = %d\n",
+ task = kthread_run(osd_scrub_main, dev, "OI_scrub");
+ 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);
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);
}
inode = filp->f_dentry->d_inode;
- ldiskfs_set_inode_state(inode, LDISKFS_STATE_LUSTRE_NO_OI);
/* 'What the @fid is' is not imporatant, because the object
* has no OI mapping, and only is visible inside the OSD.*/
lu_igif_build(fid, inode->i_ino, inode->i_generation);
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);
NULL
};
-static int scrub_bits_dump(char **buf, int *len, int bits, const char *names[],
+static int scrub_bits_dump(struct seq_file *m, int bits, const char *names[],
const char *prefix)
{
- int save = *len;
int flag;
int rc;
int i;
- rc = snprintf(*buf, *len, "%s:%c", prefix, bits != 0 ? ' ' : '\n');
- if (rc <= 0)
- return -ENOSPC;
+ rc = seq_printf(m, "%s:%c", prefix, bits != 0 ? ' ' : '\n');
+ if (rc < 0)
+ return rc;
- *buf += rc;
- *len -= rc;
for (i = 0, flag = 1; bits != 0; i++, flag = 1 << i) {
if (flag & bits) {
bits &= ~flag;
- rc = snprintf(*buf, *len, "%s%c", names[i],
- bits != 0 ? ',' : '\n');
- if (rc <= 0)
- return -ENOSPC;
-
- *buf += rc;
- *len -= rc;
+ rc = seq_printf(m, "%s%c", names[i],
+ bits != 0 ? ',' : '\n');
+ if (rc < 0)
+ return rc;
}
}
- return save - *len;
+ return 0;
}
-static int scrub_time_dump(char **buf, int *len, __u64 time, const char *prefix)
+static int scrub_time_dump(struct seq_file *m, __u64 time, const char *prefix)
{
int rc;
if (time != 0)
- rc = snprintf(*buf, *len, "%s: "LPU64" seconds\n", prefix,
+ rc = seq_printf(m, "%s: "LPU64" seconds\n", prefix,
cfs_time_current_sec() - time);
else
- rc = snprintf(*buf, *len, "%s: N/A\n", prefix);
- if (rc <= 0)
- return -ENOSPC;
-
- *buf += rc;
- *len -= rc;
+ rc = seq_printf(m, "%s: N/A\n", prefix);
return rc;
}
-static int scrub_pos_dump(char **buf, int *len, __u64 pos, const char *prefix)
+static int scrub_pos_dump(struct seq_file *m, __u64 pos, const char *prefix)
{
int rc;
if (pos != 0)
- rc = snprintf(*buf, *len, "%s: "LPU64"\n", prefix, pos);
+ rc = seq_printf(m, "%s: "LPU64"\n", prefix, pos);
else
- rc = snprintf(*buf, *len, "%s: N/A\n", prefix);
- if (rc <= 0)
- return -ENOSPC;
-
- *buf += rc;
- *len -= rc;
+ rc = seq_printf(m, "%s: N/A\n", prefix);
return rc;
}
-int osd_scrub_dump(struct osd_device *dev, char *buf, int len)
+int osd_scrub_dump(struct seq_file *m, struct osd_device *dev)
{
struct osd_scrub *scrub = &dev->od_scrub;
struct scrub_file *sf = &scrub->os_file;
__u64 checked;
__u64 speed;
- int save = len;
- int ret = -ENOSPC;
int rc;
down_read(&scrub->os_rwsem);
- rc = snprintf(buf, len,
- "name: OI_scrub\n"
- "magic: 0x%x\n"
- "oi_files: %d\n"
- "status: %s\n",
- sf->sf_magic, (int)sf->sf_oi_count,
- scrub_status_names[sf->sf_status]);
- if (rc <= 0)
+ rc = seq_printf(m, "name: OI_scrub\n"
+ "magic: 0x%x\n"
+ "oi_files: %d\n"
+ "status: %s\n",
+ sf->sf_magic, (int)sf->sf_oi_count,
+ scrub_status_names[sf->sf_status]);
+ if (rc < 0)
goto out;
- buf += rc;
- len -= rc;
- rc = scrub_bits_dump(&buf, &len, sf->sf_flags, scrub_flags_names,
+ rc = scrub_bits_dump(m, sf->sf_flags, scrub_flags_names,
"flags");
if (rc < 0)
goto out;
- rc = scrub_bits_dump(&buf, &len, sf->sf_param, scrub_param_names,
+ rc = scrub_bits_dump(m, sf->sf_param, scrub_param_names,
"param");
if (rc < 0)
goto out;
- rc = scrub_time_dump(&buf, &len, sf->sf_time_last_complete,
+ rc = scrub_time_dump(m, sf->sf_time_last_complete,
"time_since_last_completed");
if (rc < 0)
goto out;
- rc = scrub_time_dump(&buf, &len, sf->sf_time_latest_start,
+ rc = scrub_time_dump(m, sf->sf_time_latest_start,
"time_since_latest_start");
if (rc < 0)
goto out;
- rc = scrub_time_dump(&buf, &len, sf->sf_time_last_checkpoint,
+ rc = scrub_time_dump(m, sf->sf_time_last_checkpoint,
"time_since_last_checkpoint");
if (rc < 0)
goto out;
- rc = scrub_pos_dump(&buf, &len, sf->sf_pos_latest_start,
+ rc = scrub_pos_dump(m, sf->sf_pos_latest_start,
"latest_start_position");
if (rc < 0)
goto out;
- rc = scrub_pos_dump(&buf, &len, sf->sf_pos_last_checkpoint,
+ rc = scrub_pos_dump(m, sf->sf_pos_last_checkpoint,
"last_checkpoint_position");
if (rc < 0)
goto out;
- rc = scrub_pos_dump(&buf, &len, sf->sf_pos_first_inconsistent,
+ rc = scrub_pos_dump(m, sf->sf_pos_first_inconsistent,
"first_failure_position");
if (rc < 0)
goto out;
checked = sf->sf_items_checked + scrub->os_new_checked;
- rc = snprintf(buf, len,
- "checked: "LPU64"\n"
+ rc = seq_printf(m, "checked: "LPU64"\n"
"updated: "LPU64"\n"
"failed: "LPU64"\n"
"prior_updated: "LPU64"\n"
checked, sf->sf_items_updated, sf->sf_items_failed,
sf->sf_items_updated_prior, sf->sf_items_noscrub,
sf->sf_items_igif, sf->sf_success_count);
- if (rc <= 0)
+ if (rc < 0)
goto out;
- buf += rc;
- len -= rc;
speed = checked;
if (thread_is_running(&scrub->os_thread)) {
cfs_duration_t duration = cfs_time_current() -
do_div(new_checked, duration);
if (rtime != 0)
do_div(speed, rtime);
- rc = snprintf(buf, len,
- "run_time: %u seconds\n"
+ rc = seq_printf(m, "run_time: %u seconds\n"
"average_speed: "LPU64" objects/sec\n"
"real-time_speed: "LPU64" objects/sec\n"
"current_position: %u\n"
} else {
if (sf->sf_run_time != 0)
do_div(speed, sf->sf_run_time);
- rc = snprintf(buf, len,
- "run_time: %u seconds\n"
+ rc = seq_printf(m, "run_time: %u seconds\n"
"average_speed: "LPU64" objects/sec\n"
"real-time_speed: N/A\n"
"current_position: N/A\n"
sf->sf_run_time, speed, scrub->os_lf_scanned,
scrub->os_lf_repaired, scrub->os_lf_failed);
}
- if (rc <= 0)
- goto out;
-
- buf += rc;
- len -= rc;
- ret = save - len;
out:
up_read(&scrub->os_rwsem);
- return ret;
+ return (rc < 0 ? -ENOSPC : 0);
}