From 71b521c3a253365e68a819c21f448b868f3aed66 Mon Sep 17 00:00:00 2001 From: yury Date: Mon, 22 Nov 2004 12:19:26 +0000 Subject: [PATCH] - fixes about mdc_op_data on stack allocations. --- lustre/mds/handler.c | 4 +-- lustre/mds/mds_lmv.c | 43 ++++++++++++++++++++--------- lustre/mds/mds_reint.c | 74 ++++++++++++++++++++++++++++++++------------------ 3 files changed, 80 insertions(+), 41 deletions(-) diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index 0c6b449..4db5653 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -2069,9 +2069,9 @@ static char str[PTL_NALFMT_SIZE]; int mds_handle(struct ptlrpc_request *req) { int should_process, fail = OBD_FAIL_MDS_ALL_REPLY_NET; - int rc = 0; - struct mds_obd *mds = NULL; /* quell gcc overwarning */ struct obd_device *obd = NULL; + struct mds_obd *mds = NULL; /* quell gcc overwarning */ + int rc = 0; ENTRY; OBD_FAIL_RETURN(OBD_FAIL_MDS_ALL_REQUEST_NET | OBD_FAIL_ONCE, 0); diff --git a/lustre/mds/mds_lmv.c b/lustre/mds/mds_lmv.c index 64d7cca..066ca63 100644 --- a/lustre/mds/mds_lmv.c +++ b/lustre/mds/mds_lmv.c @@ -899,7 +899,7 @@ int mds_lock_slave_objs(struct obd_device *obd, struct dentry *dentry, struct lustre_handle **rlockh) { struct mds_obd *mds = &obd->u.mds; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; struct lookup_intent it; struct mea *mea = NULL; int mea_size, rc; @@ -942,28 +942,38 @@ int mds_lock_slave_objs(struct obd_device *obd, struct dentry *dentry, GOTO(cleanup, rc = -ENOMEM); memset(*rlockh, 0, handle_size); - memset(&op_data, 0, sizeof(op_data)); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) { + OBD_FREE(*rlockh, handle_size); + RETURN(-ENOMEM); + } + memset(op_data, 0, sizeof(*op_data)); - op_data.mea1 = mea; + op_data->mea1 = mea; it.it_op = IT_UNLINK; rc = md_enqueue(mds->mds_lmv_exp, LDLM_IBITS, &it, LCK_EX, - &op_data, *rlockh, NULL, 0, ldlm_completion_ast, + op_data, *rlockh, NULL, 0, ldlm_completion_ast, mds_blocking_ast, NULL); + OBD_FREE(op_data, sizeof(*op_data)); + EXIT; cleanup: OBD_FREE(mea, mea_size); - RETURN(rc); + return rc; } void mds_unlock_slave_objs(struct obd_device *obd, struct dentry *dentry, - struct lustre_handle *lockh) + struct lustre_handle *lockh) { struct mds_obd *mds = &obd->u.mds; struct mea *mea = NULL; int mea_size, rc, i; + ENTRY; - if (lockh == NULL) + if (lockh == NULL) { + EXIT; return; + } LASSERT(mds->mds_lmv_obd != NULL); LASSERT(S_ISDIR(dentry->d_inode->i_mode)); @@ -971,6 +981,7 @@ void mds_unlock_slave_objs(struct obd_device *obd, struct dentry *dentry, rc = mds_get_lmv_attr(obd, dentry->d_inode, &mea, &mea_size); if (rc) { CERROR("locks are leaked\n"); + EXIT; return; } LASSERT(mea_size != 0); @@ -988,13 +999,14 @@ void mds_unlock_slave_objs(struct obd_device *obd, struct dentry *dentry, OBD_FREE(lockh, sizeof(struct lustre_handle) * mea->mea_count); OBD_FREE(mea, mea_size); + EXIT; } int mds_unlink_slave_objs(struct obd_device *obd, struct dentry *dentry) { struct mds_obd *mds = &obd->u.mds; struct ptlrpc_request *req = NULL; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; struct mea *mea = NULL; int mea_size, rc; ENTRY; @@ -1018,12 +1030,17 @@ int mds_unlink_slave_objs(struct obd_device *obd, struct dentry *dentry) GOTO(cleanup, rc = 0); CDEBUG(D_OTHER, "%s: unlink slaves for %lu/%lu\n", obd->obd_name, - (unsigned long) dentry->d_inode->i_ino, - (unsigned long) dentry->d_inode->i_generation); + (unsigned long)dentry->d_inode->i_ino, + (unsigned long)dentry->d_inode->i_generation); - memset(&op_data, 0, sizeof(op_data)); - op_data.mea1 = mea; - rc = md_unlink(mds->mds_lmv_exp, &op_data, &req); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + + memset(op_data, 0, sizeof(*op_data)); + op_data->mea1 = mea; + rc = md_unlink(mds->mds_lmv_exp, op_data, &req); + OBD_FREE(op_data, sizeof(*op_data)); LASSERT(req == NULL); EXIT; cleanup: diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c index a2a4b73..14ff438 100644 --- a/lustre/mds/mds_reint.c +++ b/lustre/mds/mds_reint.c @@ -1810,29 +1810,34 @@ static int mds_reint_unlink_remote(struct mds_update_record *rec, struct mds_obd *mds = mds_req2mds(req); struct ptlrpc_request *request = NULL; int rc = 0, cleanup_phase = 0; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; void *handle; ENTRY; LASSERT(offset == 1 || offset == 3); /* time to drop i_nlink on remote MDS */ - memset(&op_data, 0, sizeof(op_data)); - mds_pack_dentry2id(obd, &op_data.id1, dchild, 1); - op_data.create_mode = rec->ur_mode; + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + + memset(op_data, 0, sizeof(*op_data)); + mds_pack_dentry2id(obd, &op_data->id1, dchild, 1); + op_data->create_mode = rec->ur_mode; DEBUG_REQ(D_INODE, req, "unlink %*s (remote inode "DLID4")", - rec->ur_namelen - 1, rec->ur_name, OLID4(&op_data.id1)); + rec->ur_namelen - 1, rec->ur_name, OLID4(&op_data->id1)); if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) { DEBUG_REQ(D_HA, req, "unlink %*s (remote inode "DLID4")", - rec->ur_namelen - 1, rec->ur_name, OLID4(&op_data.id1)); + rec->ur_namelen - 1, rec->ur_name, OLID4(&op_data->id1)); } if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) - op_data.create_mode |= MDS_MODE_REPLAY; + op_data->create_mode |= MDS_MODE_REPLAY; - rc = md_unlink(mds->mds_lmv_exp, &op_data, &request); + rc = md_unlink(mds->mds_lmv_exp, op_data, &request); + OBD_FREE(op_data, sizeof(*op_data)); cleanup_phase = 2; if (request) { @@ -2255,7 +2260,7 @@ static int mds_reint_link_to_remote(struct mds_update_record *rec, struct dentry *de_tgt_dir = NULL; struct mds_obd *mds = mds_req2mds(req); int rc = 0, cleanup_phase = 0; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; struct ptlrpc_request *request = NULL; int update_mode; ENTRY; @@ -2273,10 +2278,15 @@ static int mds_reint_link_to_remote(struct mds_update_record *rec, GOTO(cleanup, rc = PTR_ERR(de_tgt_dir)); cleanup_phase = 1; - op_data.id1 = *(rec->ur_id1); - op_data.namelen = 0; - op_data.name = NULL; - rc = md_link(mds->mds_lmv_exp, &op_data, &request); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + GOTO(cleanup, rc = -ENOMEM); + + op_data->id1 = *(rec->ur_id1); + op_data->namelen = 0; + op_data->name = NULL; + rc = md_link(mds->mds_lmv_exp, op_data, &request); + OBD_FREE(op_data, sizeof(*op_data)); if (rc) GOTO(cleanup, rc); @@ -2796,7 +2806,7 @@ static int mds_check_for_rename(struct obd_device *obd, struct mds_obd *mds = &obd->u.mds; struct lustre_handle *rlockh; struct ptlrpc_request *req; - struct mdc_op_data op_data; + struct mdc_op_data *op_data; struct lookup_intent it; int handle_size, rc = 0; ENTRY; @@ -2816,13 +2826,19 @@ static int mds_check_for_rename(struct obd_device *obd, RETURN(-ENOMEM); memset(rlockh, 0, handle_size); - memset(&op_data, 0, sizeof(op_data)); - mds_pack_dentry2id(obd, &op_data.id1, dentry, 1); + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) { + OBD_FREE(rlockh, handle_size); + RETURN(-ENOMEM); + } + memset(op_data, 0, sizeof(*op_data)); + mds_pack_dentry2id(obd, &op_data->id1, dentry, 1); it.it_op = IT_UNLINK; rc = md_enqueue(mds->mds_lmv_exp, LDLM_IBITS, &it, LCK_EX, - &op_data, rlockh, NULL, 0, ldlm_completion_ast, + op_data, rlockh, NULL, 0, ldlm_completion_ast, mds_blocking_ast, NULL); + OBD_FREE(op_data, sizeof(*op_data)); if (rc) RETURN(rc); @@ -3027,13 +3043,17 @@ static int mds_reint_rename_to_remote(struct mds_update_record *rec, int offset, struct mds_obd *mds = mds_req2mds(req); struct lustre_handle parent_lockh[2] = {{0}, {0}}; struct lustre_handle child_lockh = {0}; - struct mdc_op_data opdata; + struct mdc_op_data *op_data; int update_mode, rc = 0; ENTRY; CDEBUG(D_OTHER, "%s: move name %s onto another mds #%lu\n", obd->obd_name, rec->ur_name, (unsigned long)id_group(rec->ur_id2)); - memset(&opdata, 0, sizeof(opdata)); + + OBD_ALLOC(op_data, sizeof(*op_data)); + if (op_data == NULL) + RETURN(-ENOMEM); + memset(op_data, 0, sizeof(*op_data)); child_lockh.cookie = 0; rc = mds_get_parent_child_locked(obd, mds, rec->ur_id1, parent_lockh, @@ -3055,9 +3075,10 @@ static int mds_reint_rename_to_remote(struct mds_update_record *rec, int offset, if (de_old->d_flags & DCACHE_CROSS_REF) { LASSERT(de_old->d_inode == NULL); CDEBUG(D_OTHER, "request to move remote name\n"); - mds_pack_dentry2id(obd, &opdata.id1, de_old, 1); + mds_pack_dentry2id(obd, &op_data->id1, de_old, 1); } else if (de_old->d_inode == NULL) { /* oh, source doesn't exist */ + OBD_FREE(op_data, sizeof(*op_data)); GOTO(cleanup, rc = -ENOENT); } else { struct lustre_id sid; @@ -3065,9 +3086,9 @@ static int mds_reint_rename_to_remote(struct mds_update_record *rec, int offset, LASSERT(inode != NULL); CDEBUG(D_OTHER, "request to move local name\n"); - id_ino(&opdata.id1) = inode->i_ino; - id_group(&opdata.id1) = mds->mds_num; - id_gen(&opdata.id1) = inode->i_generation; + id_ino(&op_data->id1) = inode->i_ino; + id_group(&op_data->id1) = mds->mds_num; + id_gen(&op_data->id1) = inode->i_generation; down(&inode->i_sem); rc = mds_read_inode_sid(obd, inode, &sid); @@ -3079,12 +3100,13 @@ static int mds_reint_rename_to_remote(struct mds_update_record *rec, int offset, GOTO(cleanup, rc); } - id_fid(&opdata.id1) = id_fid(&sid); + id_fid(&op_data->id1) = id_fid(&sid); } - opdata.id2 = *rec->ur_id2; - rc = md_rename(mds->mds_lmv_exp, &opdata, NULL, 0, + op_data->id2 = *rec->ur_id2; + rc = md_rename(mds->mds_lmv_exp, op_data, NULL, 0, rec->ur_tgt, rec->ur_tgtlen - 1, &req2); + OBD_FREE(op_data, sizeof(*op_data)); if (rc) GOTO(cleanup, rc); -- 1.8.3.1