struct list_head *tmp;
struct ptlrpc_reply_state *oldrep;
struct ptlrpc_service *svc;
+ struct llog_create_locks *lcl;
unsigned long flags;
char str[PTL_NALFMT_SIZE];
int i;
oldrep->rs_modes[i]);
oldrep->rs_nlocks = 0;
+ lcl = oldrep->rs_llog_locks;
+ oldrep->rs_llog_locks = NULL;
+ if (lcl != NULL)
+ ptlrpc_save_llog_lock(req, lcl);
+
DEBUG_REQ(D_HA, req, "stole locks for");
ptlrpc_schedule_difficult_reply (oldrep);
struct lustre_handle child_reuse_lockh = {0};
#endif
struct lustre_handle * slave_lockh = NULL;
+ struct llog_create_locks *lcl = NULL;
char fidname[LL_FID_NAMELEN];
void *handle = NULL;
int rc = 0, log_unlink = 0, cleanup_phase = 0;
MDS_CHECK_RESENT(req, mds_reconstruct_generic(req));
+ if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
+ DEBUG_REQ(D_HA, req, "unlink replay\n");
+ memcpy(lustre_msg_buf(req->rq_repmsg, offset + 2, 0),
+ lustre_msg_buf(req->rq_reqmsg, 2, 0),
+ req->rq_repmsg->buflens[offset + 2]);
+ }
+
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_UNLINK))
GOTO(cleanup, rc = -ENOENT);
lustre_msg_buf(req->rq_repmsg, offset + 1, 0),
req->rq_repmsg->buflens[offset + 1],
lustre_msg_buf(req->rq_repmsg, offset + 2, 0),
- req->rq_repmsg->buflens[offset + 2]) > 0)
+ req->rq_repmsg->buflens[offset + 2], &lcl) > 0)
body->valid |= OBD_MD_FLCOOKIE;
break;
}
if (!rc)
(void)obd_set_info(mds->mds_osc_exp, strlen("unlinked"),
"unlinked", 0, NULL);
+ if (lcl != NULL)
+ ptlrpc_save_llog_lock(req, lcl);
case 3: /* child ino-reuse lock */
#if 0
if (rc && body != NULL) {
struct mds_obd *mds = mds_req2mds(req);
struct lustre_handle dlm_handles[7] = {{0},{0},{0},{0},{0},{0},{0}};
struct mds_body *body = NULL;
- int rc = 0, lock_count = 3;
+ struct llog_create_locks *lcl = NULL;
+ int rc = 0, log_unlink = 0, lock_count = 3;
int cleanup_phase = 0;
void *handle = NULL;
ENTRY;
MDS_CHECK_RESENT(req, mds_reconstruct_generic(req));
+ if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
+ DEBUG_REQ(D_HA, req, "rename replay\n");
+ memcpy(lustre_msg_buf(req->rq_repmsg, 2, 0),
+ lustre_msg_buf(req->rq_reqmsg, 3, 0),
+ req->rq_repmsg->buflens[2]);
+ }
+
if (rec->ur_namelen == 1) {
rc = mds_reint_rename_create_name(rec, offset, req);
RETURN(rc);
body->valid |= (OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
OBD_MD_FLATIME | OBD_MD_FLMTIME);
} else {
- /* XXX need log unlink? */
+ log_unlink = 1;
}
}
rc = vfs_rename(de_srcdir->d_inode, de_old, de_tgtdir->d_inode, de_new);
unlock_kernel();
+ if (!rc && log_unlink) {
+ if (mds_log_op_unlink(obd, de_tgtdir->d_inode,
+ lustre_msg_buf(req->rq_repmsg, 1, 0),
+ req->rq_repmsg->buflens[1],
+ lustre_msg_buf(req->rq_repmsg, 2, 0),
+ req->rq_repmsg->buflens[2], &lcl) > 0) {
+ body->valid |= OBD_MD_FLCOOKIE;
+ }
+ }
+
GOTO(cleanup, rc);
cleanup:
rc = mds_finish_transno(mds, de_tgtdir ? de_tgtdir->d_inode : NULL,
if (dlm_handles[6].cookie != 0)
ldlm_lock_decref(&(dlm_handles[6]), LCK_PW);
#endif
+ if (lcl != NULL)
+ ptlrpc_save_llog_lock(req, lcl);
+
if (rc) {
if (lock_count == 4)
ldlm_lock_decref(&(dlm_handles[3]), LCK_EX);