(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:
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 (unlikely(fid_is_last_id(fid))) {
- if (scrub) {
- if (lma->lma_compat & LMAC_FID_ON_OST)
- rc = SCRUB_NEXT_OSTOBJ;
- else
- rc = osd_scrub_check_local_fldb(info,
- dev, fid);
- }
-
- /* XXX: For up layer iteration, LAST_ID is a visible
- * object to be checked and repaired, so return
- * it directly.
- *
- * In fact, the OSD layer otable-based iteration
- * should not care about the FID type, it is the
- * up layer user's duty (LFSCK) to handle that.
- * It will be fixed in other patch in future. */
- return rc;
- }
-
- 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))
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;
- /* Here, it may be MDT-object, or may be 2.4 OST-object.
- * Fall through. */
+ /* For external visible MDT-object with non-normal FID. */
+ if (fid_is_namespace_visible(fid) && !fid_is_norm(fid))
+ return 0;
+
+ /* 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. */
{ "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_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;
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);
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;
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);
}
}
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);
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);
}