#define CHECK_MOUNT_EPOCH(i) \
do { \
- if (ll_i2info(i)->lli_mount_epoch != ll_i2sbi(i)->ll_mount_epoch) \
+ if (ll_i2info(i)->lli_mount_epoch != ll_i2sbi(i)->ll_mount_epoch) { \
+ make_bad_inode(i); \
RETURN(-EIO); \
+ } \
} while(0)
static inline struct ll_sb_info *ll_s2sbi(struct super_block *sb)
int tgtlen = 0;
int err, lock_mode;
- if ((it->it_op & (IT_CREAT | IT_MKDIR | IT_SETATTR | IT_MKNOD)))
+ /* CREAT needs to be tested before open (both could be set) */
+ if ((it->it_op & (IT_CREAT | IT_MKDIR | IT_SETATTR | IT_MKNOD))) {
lock_mode = LCK_PW;
- else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_UNLINK |
- IT_RMDIR | IT_RENAME | IT_RENAME2 | IT_READLINK|
- IT_LINK | IT_LINK2))
+ } else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_UNLINK |
+ IT_RMDIR | IT_RENAME | IT_RENAME2 | IT_READLINK|
+ IT_LINK | IT_LINK2 | IT_LOOKUP)) {
+ /* XXXphil PW for LINK2/RENAME2? */
lock_mode = LCK_PR;
- else if (it->it_op & IT_SYMLINK) {
+ } else if (it->it_op & IT_SYMLINK) {
lock_mode = LCK_PW;
tgt = it->it_data;
tgtlen = strlen(tgt);
it->it_data = NULL;
- } else if (it->it_op & IT_LOOKUP)
- lock_mode = LCK_PR;
- else {
+ } else {
LBUG();
RETURN(-EINVAL);
}
ENTRY;
/* CHECK_MOUNT_EPOCH(dir); */
- if (ll_i2info(dir)->lli_mount_epoch != ll_i2sbi(dir)->ll_mount_epoch)
+ if (ll_i2info(dir)->lli_mount_epoch != ll_i2sbi(dir)->ll_mount_epoch) {
+ make_bad_inode(dir);
RETURN(ERR_PTR(-EIO));
+ }
if (it == NULL) {
it = &lookup_it;
/* pack the intended request */
mds_link_pack(req, 2, old_de->d_inode, dir,
- de->d_name.name, de->d_name.len);
+ de->d_name.name, de->d_name.len);
req->rq_replen = lustre_msg_size(3, repsize);
} else if (it->it_op == IT_UNLINK || it->it_op == IT_RMDIR) {
size[2] = sizeof(struct mds_rec_unlink);
/* If open is replayed, we need to fix up the fh. */
req->rq_replay_cb = mdc_replay_open;
- memcpy(&req->rq_replay_cb_handle, fh, sizeof(req->rq_replay_cb_handle));
+ memcpy(&req->rq_replay_cb_handle, fh, sizeof(fh));
EXIT;
out:
/* request->rq_repmsg is set only when the reply comes in, in
* client_packet_callback() */
- if (request->rq_reply_md.start)
+ if (request->rq_reply_md.start) {
OBD_FREE(request->rq_reply_md.start,
request->rq_replen);
-
+ /* If we're resending, rq_repmsg needs to be NULLed out
+ * again so that ptlrpc_check_reply doesn't trip early.
+ */
+ request->rq_repmsg = NULL;
+ }
OBD_ALLOC(repbuf, request->rq_replen);
if (!repbuf) {
LBUG();
request->rq_import->imp_client->cli_reply_portal);
}
+ /* Clear any flags that may be present from previous sends,
+ * except for REPLAY. */
+ request->rq_flags &= PTL_RPC_FL_REPLAY;
rc = ptl_send_buf(request, request->rq_connection,
request->rq_import->imp_client->cli_request_portal);
RETURN(rc);
}
if (n < 0 || n >= m->bufcount) {
- CERROR("referencing bad sub buffer (want %d, count is %d)!\n",
- n, m->bufcount);
+ CERROR("referencing bad sub buffer in %p (want %d, count %d)!\n",
+ m, n, m->bufcount);
LBUG();
return NULL;
}
if (m->buflens[n] == 0) {
- CERROR("zero-length buffer requested for buffer %d\n", n);
+ CERROR("zero-length buffer requested for buffer %d in %p\n", n,
+ m);
return NULL;
}
cli->cl_target_uuid, conn->c_remote_uuid,
imp->imp_handle.addr, imp->imp_handle.cookie,
old_hdl.addr, old_hdl.cookie);
- ptlrpc_free_req(request);
+ ptlrpc_req_finished(request);
}
conn->c_level = LUSTRE_CONN_RECOVD;