Because ofd_get_info(KEY_FIEMAP) might be called from
ptlrpc_server_handle_req_in(see the stack below),
where env might not be initialized correctly(see LBUG below),
so it refill refill in ofd_get_info.
LutreError: 19182:0:(ofd_internal.h:518:ofd_info_init()) LBUG
Pid: 19182, comm: ll_ost_io00_001
Call Trace:
[<
ffffffffa044e895>] libcfs_debug_dumpstack+0x55/0x80 [libcfs]
[<
ffffffffa044ee97>] lbug_with_loc+0x47/0xb0 [libcfs]
[<
ffffffffa0e03e62>] ofd_info_init+0x92/0x130 [ofd]
[<
ffffffffa0e05835>] ofd_get_info+0x2e5/0xa90 [ofd]
[<
ffffffff812805cd>] ? pointer+0x8d/0x830
[<
ffffffffa029f7e5>] ? lprocfs_counter_add+0x125/0x182 [lvfs]
[<
ffffffffa078528a>] nrs_orr_range_fill_physical+0x18a/0x540
[ptlrpc]
[<
ffffffffa0762dd6>] ? __req_capsule_get+0x166/0x700 [ptlrpc]
[<
ffffffffa073e630>] ? lustre_swab_ost_body+0x0/0x10 [ptlrpc]
[<
ffffffffa07871d7>] nrs_orr_res_get+0x817/0xb80 [ptlrpc]
[<
ffffffffa077d306>] nrs_resource_get+0x56/0x110 [ptlrpc]
[<
ffffffffa077dccb>] nrs_resource_get_safe+0x8b/0x100 [ptlrpc]
[<
ffffffffa0780248>] ptlrpc_nrs_req_initialize+0x38/0x90 [ptlrpc]
[<
ffffffffa074cff0>] ptlrpc_main+0x1170/0x16f0 [ptlrpc]
[<
ffffffffa074be80>] ? ptlrpc_main+0x0/0x16f0 [ptlrpc]
[<
ffffffff8100c0ca>] child_rip+0xa/0x20
[<
ffffffffa074be80>] ? ptlrpc_main+0x0/0x16f0 [ptlrpc]
[<
ffffffffa074be80>] ? ptlrpc_main+0x0/0x16f0 [ptlrpc]
[<
ffffffff8100c0c0>] ? child_rip+0x0/0x20
Signed-off-by: wang di <di.wang@intel.com>
Change-Id: Iee4b68fe331a895c61e6ccd0a14d6c60f5f9215c
Reviewed-on: http://review.whamcloud.com/6204
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Nikitas Angelinas <nikitas_angelinas@xyratex.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
struct lov_stripe_md *lsm)
{
struct ofd_device *ofd;
struct lov_stripe_md *lsm)
{
struct ofd_device *ofd;
+ /* Because ofd_get_info might be called from
+ * handle_request_in as well(see LU-3239), where env might
+ * not be initilaized correctly, and le_ses might be in
+ * an un-initialized state, so only refill le_ctx here */
+ rc = lu_env_refill((struct lu_env *)env);
+ if (rc != 0)
+ RETURN(rc);
+
ofd = ofd_exp(exp);
if (KEY_IS(KEY_BLOCKSIZE)) {
__u32 *blocksize = val;
if (blocksize) {
if (*vallen < sizeof(*blocksize))
ofd = ofd_exp(exp);
if (KEY_IS(KEY_BLOCKSIZE)) {
__u32 *blocksize = val;
if (blocksize) {
if (*vallen < sizeof(*blocksize))
+ GOTO(out, rc = -EOVERFLOW);
*blocksize = 1 << ofd->ofd_dt_conf.ddp_block_shift;
}
*vallen = sizeof(*blocksize);
*blocksize = 1 << ofd->ofd_dt_conf.ddp_block_shift;
}
*vallen = sizeof(*blocksize);
__u32 *blocksize_bits = val;
if (blocksize_bits) {
if (*vallen < sizeof(*blocksize_bits))
__u32 *blocksize_bits = val;
if (blocksize_bits) {
if (*vallen < sizeof(*blocksize_bits))
+ GOTO(out, rc = -EOVERFLOW);
*blocksize_bits = ofd->ofd_dt_conf.ddp_block_shift;
}
*vallen = sizeof(*blocksize_bits);
*blocksize_bits = ofd->ofd_dt_conf.ddp_block_shift;
}
*vallen = sizeof(*blocksize_bits);
if (val == NULL) {
*vallen = sizeof(obd_id);
if (val == NULL) {
*vallen = sizeof(obd_id);
}
ofd_info_init(env, exp);
oseq = ofd_seq_load(env, ofd,
}
ofd_info_init(env, exp);
oseq = ofd_seq_load(env, ofd,
if (last_id) {
if (*vallen < sizeof(*last_id)) {
ofd_seq_put(env, oseq);
if (last_id) {
if (*vallen < sizeof(*last_id)) {
ofd_seq_put(env, oseq);
+ GOTO(out, rc = -EOVERFLOW);
}
*last_id = ofd_seq_last_oid(oseq);
}
}
*last_id = ofd_seq_last_oid(oseq);
}
if (val == NULL) {
*vallen = fiemap_count_to_size(
fm_key->fiemap.fm_extent_count);
if (val == NULL) {
*vallen = fiemap_count_to_size(
fm_key->fiemap.fm_extent_count);
}
info = ofd_info_init(env, exp);
rc = ostid_to_fid(&info->fti_fid, &fm_key->oa.o_oi, 0);
if (rc != 0)
}
info = ofd_info_init(env, exp);
rc = ostid_to_fid(&info->fti_fid, &fm_key->oa.o_oi, 0);
if (rc != 0)
CDEBUG(D_INODE, "get FIEMAP of object "DFID"\n",
PFID(&info->fti_fid));
CDEBUG(D_INODE, "get FIEMAP of object "DFID"\n",
PFID(&info->fti_fid));
*((__u32 *) val) = ofd->ofd_sync_lock_cancel;
*vallen = sizeof(__u32);
} else if (KEY_IS(KEY_LAST_FID)) {
*((__u32 *) val) = ofd->ofd_sync_lock_cancel;
*vallen = sizeof(__u32);
} else if (KEY_IS(KEY_LAST_FID)) {
struct ofd_device *ofd = ofd_exp(exp);
struct ofd_seq *oseq;
struct lu_fid *fid = val;
struct ofd_device *ofd = ofd_exp(exp);
struct ofd_seq *oseq;
struct lu_fid *fid = val;
if (fid == NULL) {
*vallen = sizeof(struct lu_fid);
if (fid == NULL) {
*vallen = sizeof(struct lu_fid);
}
if (*vallen < sizeof(*fid))
}
if (*vallen < sizeof(*fid))
+ GOTO(out, rc = -EOVERFLOW);
- rc = lu_env_init(&env, LCT_DT_THREAD);
- if (rc != 0)
- RETURN(rc);
- ofd_info_init(&env, exp);
+ ofd_info_init(env, exp);
- oseq = ofd_seq_load(&env, ofd, ostid_seq((struct ost_id *)fid));
+ oseq = ofd_seq_load(env, ofd,
+ ostid_seq((struct ost_id *)fid));
- GOTO(out_fini, rc = PTR_ERR(oseq));
+ GOTO(out, rc = PTR_ERR(oseq));
rc = ostid_to_fid(fid, &oseq->os_oi,
ofd->ofd_lut.lut_lsd.lsd_osd_index);
rc = ostid_to_fid(fid, &oseq->os_oi,
ofd->ofd_lut.lut_lsd.lsd_osd_index);
PFID(fid));
*vallen = sizeof(*fid);
out_put:
PFID(fid));
*vallen = sizeof(*fid);
out_put:
- ofd_seq_put(&env, oseq);
-out_fini:
- lu_env_fini(&env);
+ ofd_seq_put(env, oseq);
} else {
CERROR("Not supported key %s\n", (char*)key);
rc = -EOPNOTSUPP;
}
} else {
CERROR("Not supported key %s\n", (char*)key);
rc = -EOPNOTSUPP;
}
/* Process all incoming reqs before handling any */
if (ptlrpc_server_request_incoming(svcpt)) {
lu_context_enter(&env->le_ctx);
/* Process all incoming reqs before handling any */
if (ptlrpc_server_request_incoming(svcpt)) {
lu_context_enter(&env->le_ctx);
ptlrpc_server_handle_req_in(svcpt, thread);
lu_context_exit(&env->le_ctx);
ptlrpc_server_handle_req_in(svcpt, thread);
lu_context_exit(&env->le_ctx);