return idc;
}
+static void osd_idc_dump_lma(const struct lu_env *env,
+ struct osd_device *osd,
+ unsigned long ino,
+ bool check_in_oi)
+{
+ struct osd_thread_info *info = osd_oti_get(env);
+ struct lustre_ost_attrs *loa = &info->oti_ost_attrs;
+ const struct lu_fid *fid;
+ struct osd_inode_id lid;
+ struct inode *inode;
+ int rc;
+
+ inode = osd_ldiskfs_iget(osd_sb(osd), ino);
+ if (IS_ERR(inode)) {
+ CERROR("%s: can't get inode %lu: rc = %d\n",
+ osd->od_svname, ino, (int)PTR_ERR(inode));
+ return;
+ }
+ if (is_bad_inode(inode)) {
+ CERROR("%s: bad inode %lu\n", osd->od_svname, ino);
+ goto put;
+ }
+ rc = osd_get_lma(info, inode, &info->oti_obj_dentry, loa);
+ if (rc) {
+ CERROR("%s: can't get LMA for %lu: rc = %d\n",
+ osd->od_svname, ino, rc);
+ goto put;
+ }
+ fid = &loa->loa_lma.lma_self_fid;
+ LCONSOLE(D_INFO, "%s: "DFID" in inode %lu/%u\n", osd->od_svname,
+ PFID(fid), ino, (unsigned)inode->i_generation);
+ if (!check_in_oi)
+ goto put;
+ rc = osd_oi_lookup(osd_oti_get(env), osd, fid, &lid, 0);
+ if (rc) {
+ CERROR("%s: can't lookup "DFID": rc = %d\n",
+ osd->od_svname, PFID(fid), rc);
+ goto put;
+ }
+ LCONSOLE(D_INFO, "%s: "DFID" maps to %u/%u\n", osd->od_svname,
+ PFID(fid), lid.oii_ino, lid.oii_gen);
+put:
+ iput(inode);
+}
+
+static void osd_idc_dump_debug(const struct lu_env *env,
+ struct osd_device *osd,
+ const struct lu_fid *fid,
+ unsigned long ino1,
+ unsigned long ino2)
+{
+ struct osd_inode_id lid;
+
+ int rc;
+
+ rc = osd_oi_lookup(osd_oti_get(env), osd, fid, &lid, 0);
+ if (!rc) {
+ LCONSOLE(D_INFO, "%s: "DFID" maps to %u/%u\n",
+ osd->od_svname, PFID(fid), lid.oii_ino, lid.oii_gen);
+ osd_idc_dump_lma(env, osd, lid.oii_ino, false);
+ } else {
+ CERROR("%s: can't lookup "DFID": rc = %d\n",
+ osd->od_svname, PFID(fid), rc);
+ }
+ if (ino1)
+ osd_idc_dump_lma(env, osd, ino1, true);
+ if (ino2)
+ osd_idc_dump_lma(env, osd, ino2, true);
+}
+
/*
* lookup mapping for given FID and fill it from the given object.
* the object is lolcal by definition.
if (obj->oo_inode == NULL)
return 0;
if (idc->oic_lid.oii_ino != obj->oo_inode->i_ino) {
- LASSERT(idc->oic_lid.oii_ino == 0);
+ if (idc->oic_lid.oii_ino) {
+ osd_idc_dump_debug(env, osd, fid,
+ idc->oic_lid.oii_ino,
+ obj->oo_inode->i_ino);
+ return -EINVAL;
+ }
idc->oic_lid.oii_ino = obj->oo_inode->i_ino;
idc->oic_lid.oii_gen = obj->oo_inode->i_generation;
}
lustre_loa_swab(loa, true);
/* Check LMA compatibility */
if (lma->lma_incompat & ~LMA_INCOMPAT_SUPP) {
- CWARN("%s: unsupported incompat LMA feature(s) %#x "
- "for fid = "DFID", ino = %lu\n",
+ rc = -EOPNOTSUPP;
+ CWARN("%s: unsupported incompat LMA feature(s) %#x for fid = "DFID", ino = %lu: rc = %d\n",
osd_ino2name(inode),
lma->lma_incompat & ~LMA_INCOMPAT_SUPP,
- PFID(&lma->lma_self_fid), inode->i_ino);
- rc = -EOPNOTSUPP;
+ PFID(&lma->lma_self_fid), inode->i_ino, rc);
}
} else if (rc == 0) {
rc = -ENODATA;
iput(inode);
inode = ERR_PTR(-ESTALE);
} else if (is_bad_inode(inode)) {
- CWARN("%s: bad inode: ino = %u\n",
- osd_dev2name(dev), id->oii_ino);
+ rc = -ENOENT;
+ CWARN("%s: bad inode: ino = %u: rc = %d\n",
+ osd_dev2name(dev), id->oii_ino, rc);
iput(inode);
- inode = ERR_PTR(-ENOENT);
+ inode = ERR_PTR(rc);
} else if ((rc = osd_attach_jinode(inode))) {
iput(inode);
inode = ERR_PTR(rc);
out:
if (rc < 0)
- CDEBUG(D_LFSCK, "%s: fail to check LMV EA, inode = %lu/%u,"
- DFID": rc = %d\n", osd_ino2name(inode),
- inode->i_ino, inode->i_generation,
+ CDEBUG(D_LFSCK,
+ "%s: cannot check LMV, ino = %lu/%u "DFID": rc = %d\n",
+ osd_ino2name(inode), inode->i_ino, inode->i_generation,
PFID(&oic->oic_fid), rc);
else
rc = 0;
struct osd_thandle *oh = container_of(jcb, struct osd_thandle, ot_jcb);
struct thandle *th = &oh->ot_super;
struct lu_device *lud = &th->th_dev->dd_lu_dev;
+ struct osd_device *osd = osd_dev(lud);
struct dt_txn_commit_cb *dcb, *tmp;
LASSERT(oh->ot_handle == NULL);
}
lu_ref_del_at(&lud->ld_reference, &oh->ot_dev_link, "osd-tx", th);
- lu_device_put(lud);
+ if (atomic_dec_and_test(&osd->od_commit_cb_in_flight))
+ wake_up(&osd->od_commit_cb_done);
th->th_dev = NULL;
OBD_FREE_PTR(oh);
th->th_dev = d;
th->th_result = 0;
oh->ot_credits = 0;
+ oh->oh_declared_ext = 0;
INIT_LIST_HEAD(&oh->ot_commit_dcb_list);
INIT_LIST_HEAD(&oh->ot_stop_dcb_list);
INIT_LIST_HEAD(&oh->ot_trunc_locks);
oh->ot_handle = jh;
LASSERT(oti->oti_txns == 0);
- lu_device_get(&d->dd_lu_dev);
+ atomic_inc(&dev->od_commit_cb_in_flight);
lu_ref_add_at(&d->dd_lu_dev.ld_reference, &oh->ot_dev_link,
"osd-tx", th);
oti->oti_txns++;
if (unlikely(remove_agents != 0))
osd_process_scheduled_agent_removals(env, osd);
+ LASSERT(oti->oti_ins_cache_depth > 0);
oti->oti_ins_cache_depth--;
/* reset OI cache for safety */
if (oti->oti_ins_cache_depth == 0)
bool ignore_edquot = !(attr->la_flags & LUSTRE_SET_SYNC_FL);
if (!ignore_edquot)
- CDEBUG(D_QUOTA, "%s: enforce quota on UID %u, GID %u"
- "(the quota space is %lld)\n",
- obj->oo_inode->i_sb->s_id, attr->la_uid,
+ CDEBUG(D_QUOTA,
+ "%s: enforce quota on UID %u, GID %u (quota space is %lld)\n",
+ osd_ino2name(obj->oo_inode), attr->la_uid,
attr->la_gid, bspace);
/* USERQUOTA */
rc = dquot_transfer(inode, &iattr);
if (rc) {
- CERROR("%s: quota transfer failed: rc = %d. Is quota "
- "enforcement enabled on the ldiskfs "
- "filesystem?\n", inode->i_sb->s_id, rc);
+ CERROR("%s: quota transfer failed. Is quota enforcement enabled on the ldiskfs filesystem? rc = %d\n",
+ osd_ino2name(inode), rc);
return rc;
}
}
rc = -ENOTSUPP;
#endif
if (rc) {
- CERROR("%s: quota transfer failed: rc = %d. Is project "
- "enforcement enabled on the ldiskfs "
- "filesystem?\n", inode->i_sb->s_id, rc);
+ CERROR("%s: quota transfer failed. Is project enforcement enabled on the ldiskfs filesystem? rc = %d\n",
+ osd_ino2name(inode), rc);
return rc;
}
}
LASSERT(obj->oo_inode != NULL);
+ if (CFS_FAIL_CHECK(OBD_FAIL_OSD_OI_ENOSPC))
+ return -ENOSPC;
+
oh = container_of(th, struct osd_thandle, ot_super);
LASSERT(oh->ot_handle);
osd_trans_exec_op(env, th, OSD_OT_INSERT);
__u32 saved_nlink = dir->i_nlink;
int rc;
+ if (OBD_FAIL_CHECK(OBD_FAIL_OSD_DOTDOT_ENOSPC))
+ return -ENOSPC;
+
dot_dot_ldp = (struct ldiskfs_dentry_param *)info->oti_ldp2;
osd_get_ldiskfs_dirent_param(dot_dot_ldp, dot_dot_fid);
i_projid_read(pobj->oo_inode) != 0) {
rc = osd_transfer_project(local, 0, th);
if (rc) {
- CERROR("%s: quota transfer failed: rc = %d. Is project "
- "quota enforcement enabled on the ldiskfs "
- "filesystem?\n", local->i_sb->s_id, rc);
+ CERROR("%s: quota transfer failed:. Is project quota enforcement enabled on the ldiskfs filesystem? rc = %d\n",
+ osd_ino2name(local), rc);
RETURN(ERR_PTR(rc));
}
}
obj->oo_dt.do_body_ops = &osd_body_ops;
}
- if (!result && !CFS_FAIL_CHECK(OBD_FAIL_OSD_NO_OI_ENTRY))
+ if (!result && !CFS_FAIL_CHECK(OBD_FAIL_OSD_NO_OI_ENTRY)) {
+ struct inode *inode = obj->oo_inode;
+
result = __osd_oi_insert(env, obj, fid, th);
+ if (result && inode) {
+ spin_lock(&obj->oo_guard);
+ clear_nlink(inode);
+ spin_unlock(&obj->oo_guard);
+ osd_dirty_inode(inode, I_DIRTY_DATASYNC);
+ ldiskfs_set_inode_state(inode,
+ LDISKFS_STATE_LUSTRE_DESTROY);
+ iput(inode);
+ obj->oo_inode = NULL;
+ }
+ }
/*
* a small optimization - dt_insert() isn't usually applied
struct thandle *handle)
{
struct osd_thandle *oh;
+ int rc;
/* it's possible that object doesn't exist yet */
LASSERT(handle != NULL);
osd_trans_declare_op(env, oh, OSD_OT_REF_ADD,
osd_dto_credits_noquota[DTO_ATTR_SET_BASE]);
- osd_idc_find_and_init(env, osd_dev(dt->do_lu.lo_dev), osd_dt_obj(dt));
+ rc = osd_idc_find_and_init(env, osd_dev(dt->do_lu.lo_dev),
+ osd_dt_obj(dt));
- return 0;
+ return rc;
}
/*
rc = osd_scrub_start(oti->oti_env, dev, SS_AUTO_PARTIAL |
SS_CLEAR_DRYRUN | SS_CLEAR_FAILOUT);
CDEBUG(D_LFSCK | D_CONSOLE | D_WARNING,
- "%s: trigger partial OI scrub for RPC inconsistency "
- "checking FID "DFID": rc = %d\n",
+ "%s: trigger partial OI scrub for RPC inconsistency checking FID "DFID": rc = %d\n",
osd_dev2name(dev), PFID(fid), rc);
if (rc == 0 || rc == -EALREADY)
goto again;
filp->f_cred = current_cred();
rc = osd_security_file_alloc(filp);
if (rc)
- RETURN(rc);
+ GOTO(unlock, rc);
filp->f_flags |= O_NOATIME;
filp->f_mode |= FMODE_NONOTIFY;
rc = iterate_dir(filp, &buf.ctx);
if (rc)
- RETURN(rc);
-
- if (hlock != NULL)
- ldiskfs_htree_unlock(hlock);
- else
- up_read(&obj->oo_ext_idx_sem);
+ GOTO(unlock, rc);
if (it->oie_rd_dirent == 0) {
/*
it->oie_dirent = it->oie_buf;
it->oie_it_dirent = 1;
}
+unlock:
+ if (hlock != NULL)
+ ldiskfs_htree_unlock(hlock);
+ else
+ up_read(&obj->oo_ext_idx_sem);
RETURN(rc);
}
* That means we lose it!
*/
if (rc != 0)
- CDEBUG(D_LFSCK, "%s: fail to reinsert the dirent, "
- "dir = %lu/%u, name = %.*s, "DFID": rc = %d\n",
- osd_ino2name(inode),
- dir->i_ino, dir->i_generation, namelen,
- dentry->d_name.name, PFID(fid), rc);
+ CDEBUG(D_LFSCK,
+ "%s: fail to reinsert the dirent, dir = %lu/%u, name = %.*s, "DFID": rc = %d\n",
+ osd_ino2name(inode), dir->i_ino, dir->i_generation,
+ namelen, dentry->d_name.name, PFID(fid), rc);
RETURN(rc);
}
if (o->od_mnt != NULL) {
shrink_dcache_sb(osd_sb(o));
osd_sync(env, &o->od_dt_dev);
+ wait_event(o->od_commit_cb_done,
+ !atomic_read(&o->od_commit_cb_in_flight));
mntput(o->od_mnt);
o->od_mnt = NULL;
osd_procfs_fini(o);
if (o->od_oi_table != NULL)
osd_oi_fini(osd_oti_get(env), o);
+ if (o->od_extent_bytes_percpu)
+ free_percpu(o->od_extent_bytes_percpu);
osd_obj_map_fini(o);
osd_umount(env, o);
spin_lock_init(&o->od_lock);
o->od_index_backup_policy = LIBP_NONE;
o->od_t10_type = 0;
+ init_waitqueue_head(&o->od_commit_cb_done);
o->od_read_cache = 1;
o->od_writethrough_cache = 1;
o->od_readcache_max_iosize = OSD_READCACHE_MAX_IO_MB << 20;
o->od_writethrough_max_iosize = OSD_WRITECACHE_MAX_IO_MB << 20;
o->od_auto_scrub_interval = AS_DEFAULT;
+ /* default fallocate to unwritten extents: LU-14326/LU-14333 */
+ o->od_fallocate_zero_blocks = 0;
cplen = strlcpy(o->od_svname, lustre_cfg_string(cfg, 4),
sizeof(o->od_svname));
GOTO(out_procfs, rc);
}
+ o->od_extent_bytes_percpu = alloc_percpu(unsigned int);
+ if (!o->od_extent_bytes_percpu) {
+ rc = -ENOMEM;
+ GOTO(out_procfs, rc);
+ }
+
RETURN(0);
out_procfs: