err = mdc_enqueue(&sbi->ll_mdc_conn, LDLM_MDSINTENT,
it, LCK_PW, dir, dentry, lockh, 0, NULL, 0,
dir, sizeof(*dir));
- else if (it->it_op & (IT_RENAME| IT_READDIR | IT_GETATTR | IT_OPEN | IT_UNLINK |
- IT_RMDIR | IT_RENAME2))
+ else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_UNLINK |
+ IT_RMDIR | IT_RENAME | IT_RENAME2))
err = mdc_enqueue(&sbi->ll_mdc_conn, LDLM_MDSINTENT,
it, LCK_PR, dir, dentry, lockh, 0, NULL, 0,
dir, sizeof(*dir));
RETURN(ERR_PTR(-ENAMETOOLONG));
err = ll_lock(dir, dentry, it, &lockh);
+ if (err < 0) {
+ /* FIXME: Mike handle EINTR here */
+ LBUG();
+ RETURN(ERR_PTR(err));
+ }
memcpy(it->it_lock_handle, &lockh, sizeof(lockh));
- if ( (it->it_op & (IT_RENAME |IT_CREAT | IT_MKDIR | IT_SYMLINK | IT_MKNOD)) &&
- it->it_disposition && !it->it_status)
+ if ((it->it_op & (IT_CREAT | IT_MKDIR | IT_SYMLINK | IT_MKNOD)) &&
+ it->it_disposition && !it->it_status)
GOTO(negative, NULL);
- if ( (it->it_op & (IT_GETATTR | IT_UNLINK | IT_RMDIR)) &&
- it->it_disposition && it->it_status)
+ if ((it->it_op & (IT_RENAME | IT_GETATTR | IT_UNLINK | IT_RMDIR)) &&
+ it->it_disposition && it->it_status)
GOTO(negative, NULL);
request = (struct ptlrpc_request *)it->it_data;
if (!inode)
GOTO(out_req, -ENOMEM);
- inode->i_mode= S_IFREG;
+ inode->i_mode = S_IFREG;
inode->i_nlink = 1;
GOTO(out_req, 0);
} else if (it->it_op == IT_RMDIR) {
if (!inode)
GOTO(out_req, -ENOMEM);
ll_i2info(inode)->lli_obdo = NULL;
- inode->i_mode= S_IFDIR;
+ inode->i_mode = S_IFDIR;
inode->i_nlink = 1;
GOTO(out_req, 0);
- } else {
+ } else if (it->it_op != IT_RENAME2) {
struct mds_body *body;
offset = 1;
} else
md.obdo = NULL;
- md.body = lustre_msg_buf(request->rq_repmsg, offset);
+ if (!(it->it_op & IT_RENAME2))
+ md.body = lustre_msg_buf(request->rq_repmsg, offset);
inode = iget4(dir->i_sb, ino, ll_find_inode, &md);
struct inode * inode;
struct ll_inode_info *oinfo;
- if (l > LL_INLINESZ)
- return err;
-
inode = ll_create_node(dir, dentry->d_name.name,
dentry->d_name.len, symname, l,
S_IFLNK | S_IRWXUGO, 0, dentry->d_it, NULL);
oinfo = ll_i2info(inode);
- memcpy(oinfo->lli_inline, symname, l);
- inode->i_size = l-1;
+ OBD_ALLOC(oinfo->lli_symlink_name, l + 1);
+ memcpy(oinfo->lli_symlink_name, symname, l + 1);
+ inode->i_size = l;
err = ext2_add_nondir(dentry, inode);
struct ext2_dir_entry_2 * old_de;
int err = -ENOENT;
- if (new_dentry->d_it)
+ if (new_dentry->d_it && new_dentry->d_it->it_disposition)
GOTO(out, err = new_dentry->d_it->it_status);
err = ll_mdc_rename(old_dir, new_dir, old_dentry, new_dentry);
ENTRY;
req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_GETATTR, 1, size, NULL);
+ MDS_GETATTR, 1, size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
size[3] = de->d_name.len + 1;
size[4] = tgtlen + 1;
req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh,
- LDLM_ENQUEUE, 5, size, NULL);
+ &mdc->mdc_connh, LDLM_ENQUEUE, 5, size,
+ NULL);
if (!req)
RETURN(-ENOMEM);
size[1] = sizeof(struct mds_body);
size[2] = sizeof(struct obdo);
req->rq_replen = lustre_msg_size(3, size);
- } else if ( it->it_op == IT_RENAME2 ) {
+ } else if (it->it_op == IT_RENAME2) {
struct dentry *old_de = it->it_data;
size[2] = sizeof(struct mds_rec_rename);
size[3] = old_de->d_name.len + 1;
size[4] = de->d_name.len + 1;
req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 5, size, NULL);
+ &mdc->mdc_connh, LDLM_ENQUEUE, 5, size,
+ NULL);
if (!req)
RETURN(-ENOMEM);
lit->opc = NTOH__u64((__u64)it->it_op);
/* pack the intended request */
- mds_rename_pack(req, 2, old_de->d_inode, dir,
- old_de->d_parent->d_name.name,
- old_de->d_parent->d_name.len,
+ mds_rename_pack(req, 2, old_de->d_parent->d_inode, dir,
+ old_de->d_name.name, old_de->d_name.len,
de->d_name.name, de->d_name.len);
size[0] = sizeof(struct ldlm_reply);
- size[1] = sizeof(struct mds_body);
- req->rq_replen = lustre_msg_size(2, size);
- } else if ( it->it_op == IT_UNLINK ) {
+ req->rq_replen = lustre_msg_size(1, size);
+ } else if (it->it_op == IT_UNLINK) {
size[2] = sizeof(struct mds_rec_unlink);
size[3] = de->d_name.len + 1;
req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
size[0] = sizeof(struct ldlm_reply);
size[1] = sizeof(struct obdo);
req->rq_replen = lustre_msg_size(2, size);
- } else if ( it->it_op == IT_RMDIR ) {
+ } else if (it->it_op == IT_RMDIR) {
size[2] = sizeof(struct mds_rec_unlink);
size[3] = de->d_name.len + 1;
req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 4, size, NULL);
+ &mdc->mdc_connh, LDLM_ENQUEUE, 4, size,
+ NULL);
if (!req)
RETURN(-ENOMEM);
de->d_name.len);
size[0] = sizeof(struct ldlm_reply);
req->rq_replen = lustre_msg_size(1, size);
- } else if ( it->it_op == IT_GETATTR || it->it_op == IT_RENAME ||
- it->it_op == IT_OPEN ) {
+ } else if (it->it_op == IT_GETATTR || it->it_op == IT_RENAME ||
+ it->it_op == IT_OPEN) {
size[2] = sizeof(struct mds_body);
size[3] = de->d_name.len + 1;
size[1] = sizeof(struct mds_body);
size[2] = sizeof(struct obdo);
req->rq_replen = lustre_msg_size(3, size);
- } else if ( it->it_op == IT_SETATTR) {
+ } else if (it->it_op == IT_SETATTR) {
size[2] = sizeof(struct mds_rec_setattr);
size[3] = de->d_name.len + 1;
req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
- &mdc->mdc_connh, LDLM_ENQUEUE, 5, size, NULL);
+ &mdc->mdc_connh, LDLM_ENQUEUE, 5, size,
+ NULL);
if (!req)
RETURN(-ENOMEM);
size[0] = sizeof(struct ldlm_reply);
size[1] = sizeof(struct mds_body);
req->rq_replen = lustre_msg_size(2, size);
- } else if ( it->it_op == IT_READDIR ) {
+ } else if (it->it_op == IT_READDIR) {
req = ptlrpc_prep_req2(mdc->mdc_ldlm_client, mdc->mdc_conn,
&mdc->mdc_connh, LDLM_ENQUEUE, 1, size, NULL);
if (!req)
RETURN(-1);
}
#warning FIXME: the data here needs to be different if a lock was granted for a different inode
- rc = ldlm_cli_enqueue(mdc->mdc_ldlm_client, mdc->mdc_conn,
- NULL, req,
+ rc = ldlm_cli_enqueue(mdc->mdc_ldlm_client, mdc->mdc_conn, NULL, req,
obddev->obd_namespace, NULL, res_id, lock_type,
NULL, 0, lock_mode, &flags,
(void *)mdc_lock_callback, data, datalen, lockh);
}
req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_OPEN, bufcount, size, NULL);
+ MDS_OPEN, bufcount, size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
struct ptlrpc_request *req;
req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_CLOSE, 1, &size, NULL);
+ MDS_CLOSE, 1, &size, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
GOTO(out, rc = -ENOMEM);
req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_READPAGE, 1, &size, NULL);
+ MDS_READPAGE, 1, &size, NULL);
if (!req)
GOTO(out2, rc = -ENOMEM);
ENTRY;
req = ptlrpc_prep_req2(mdc->mdc_client, mdc->mdc_conn, &mdc->mdc_connh,
- MDS_STATFS, 0, NULL, NULL);
+ MDS_STATFS, 0, NULL, NULL);
if (!req)
GOTO(out, rc = -ENOMEM);
req->rq_replen = lustre_msg_size(1, &size);
struct dentry *de_old = NULL;
struct dentry *de_new = NULL;
struct mds_obd *mds = mds_req2mds(req);
- __u64 res_id[3] = {0};
struct lustre_handle tgtlockh, srclockh, oldhandle;
- int lock_mode;
+ int flags, lock_mode, rc = 0, err;
void *handle;
- int flags;
- int rc = 0;
- int err;
+ __u64 res_id[3] = {0};
ENTRY;
de_srcdir = mds_fid2dentry(mds, rec->ur_fid1, NULL);
- if (IS_ERR(de_srcdir)) {
+ if (IS_ERR(de_srcdir))
GOTO(out_rename, rc = -ESTALE);
- }
lock_mode = (req->rq_reqmsg->opc == MDS_REINT) ? LCK_CW : LCK_PW;
res_id[0] = de_srcdir->d_inode->i_ino;
} else
ldlm_lock_dump((void *)(unsigned long)srclockh.addr);
-
de_tgtdir = mds_fid2dentry(mds, rec->ur_fid2, NULL);
- if (IS_ERR(de_tgtdir)) {
+ if (IS_ERR(de_tgtdir))
GOTO(out_rename_srcdir, rc = -ESTALE);
- }
lock_mode = (req->rq_reqmsg->opc == MDS_REINT) ? LCK_CW : LCK_PW;
res_id[0] = de_tgtdir->d_inode->i_ino;
de_old = lookup_one_len(rec->ur_name, de_srcdir, rec->ur_namelen - 1);
if (IS_ERR(de_old)) {
- CERROR("old child lookup error %ld\n", PTR_ERR(de_old));
- GOTO(out_rename_tgtdir, rc = -ESTALE);
+ CERROR("old child lookup error (%*s): %ld\n",
+ rec->ur_namelen - 1, rec->ur_name, PTR_ERR(de_old));
+ GOTO(out_rename_tgtdir, rc = -ENOENT);
}
de_new = lookup_one_len(rec->ur_tgt, de_tgtdir, rec->ur_tgtlen - 1);
if (IS_ERR(de_new)) {
- CERROR("new child lookup error %ld\n", PTR_ERR(de_new));
- GOTO(out_rename_deold, rc = -ESTALE);
+ CERROR("new child lookup error (%*s): %ld\n",
+ rec->ur_tgtlen - 1, rec->ur_tgt, PTR_ERR(de_new));
+ GOTO(out_rename_deold, rc = -ENOENT);
}
OBD_FAIL_WRITE(OBD_FAIL_MDS_REINT_RENAME_WRITE,