If MDT device has been checked with fsck, some mdd objects
could be removed, so that recovery replay could act on non-existing
objects.
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: If3a3b72ee70ab2513978ed968c9598ddde11c085
Reviewed-on: http://review.whamcloud.com/1928
Reviewed-by: Fan Yong <yong.fan@whamcloud.com>
Reviewed-by: Mikhail Pershin <tappro@whamcloud.com>
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
cfs_atomic_read(&cli->cl_resends) > resend : 1;
}
cfs_atomic_read(&cli->cl_resends) > resend : 1;
}
+/**
+ * Return device name for this device
+ *
+ * XXX: lu_device is declared before obd_device, while a pointer pointing
+ * back to obd_device in lu_device, so this helper function defines here
+ * instead of in lu_object.h
+ */
+static inline const char *lu_dev_name(const struct lu_device *lu_dev)
+{
+ return lu_dev->ld_obd->obd_name;
+}
+
struct mdt_object *root;
struct lustre_capa *capa;
struct mdt_object *root;
struct lustre_capa *capa;
- root = mdt_object_find(info->mti_env, mdt, &repbody->fid1);
+ root = mdt_object_find(info->mti_env, mdt, &repbody->fid1,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(root))
RETURN(PTR_ERR(root));
if (IS_ERR(root))
RETURN(PTR_ERR(root));
*step 3: find the child object by fid & lock it.
* regardless if it is local or remote.
*/
*step 3: find the child object by fid & lock it.
* regardless if it is local or remote.
*/
- child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid);
+ child = mdt_object_find(info->mti_env, info->mti_mdt, child_fid,
+ MDT_OBJ_MUST_EXIST);
if (unlikely(IS_ERR(child)))
GOTO(out_parent, rc = PTR_ERR(child));
if (unlikely(IS_ERR(child)))
GOTO(out_parent, rc = PTR_ERR(child));
mdt_lock_handle_init(lhc);
mdt_lock_reg_init(lhc, LCK_PR);
mdt_lock_handle_init(lhc);
mdt_lock_reg_init(lhc, LCK_PR);
- if (mdt_object_exists(child) == 0) {
- LU_OBJECT_DEBUG(D_WARNING, info->mti_env,
- &child->mot_obj.mo_lu,
- "Object doesn't exist!\n");
- GOTO(out_child, rc = -ENOENT);
- }
-
if (!(child_bits & MDS_INODELOCK_UPDATE)) {
struct md_attr *ma = &info->mti_attr;
if (!(child_bits & MDS_INODELOCK_UPDATE)) {
struct md_attr *ma = &info->mti_attr;
struct mdt_object *mdt_object_find(const struct lu_env *env,
struct mdt_device *d,
struct mdt_object *mdt_object_find(const struct lu_env *env,
struct mdt_device *d,
- const struct lu_fid *f)
+ const struct lu_fid *f,
+ enum mdt_obj_exist check_exist)
{
struct lu_object *o;
struct mdt_object *m;
{
struct lu_object *o;
struct mdt_object *m;
CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f));
o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL);
if (unlikely(IS_ERR(o)))
CDEBUG(D_INFO, "Find object for "DFID"\n", PFID(f));
o = lu_object_find(env, &d->mdt_md_dev.md_lu_dev, f, NULL);
if (unlikely(IS_ERR(o)))
- m = (struct mdt_object *)o;
+ RETURN((struct mdt_object *)o);
+
+ if (check_exist == MDT_OBJ_MUST_EXIST && mdt_object_exists(m) == 0) {
+ mdt_object_put(env, m);
+ CERROR("%s: object "DFID" not found: rc = -2\n",
+ mdt_obj_dev_name(m), PFID(f));
+ RETURN(ERR_PTR(-ENOENT));
+ }
struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *info,
const struct lu_fid *f,
struct mdt_lock_handle *lh,
struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *info,
const struct lu_fid *f,
struct mdt_lock_handle *lh,
+ __u64 ibits,
+ enum mdt_obj_exist check_exist)
- o = mdt_object_find(info->mti_env, info->mti_mdt, f);
+ o = mdt_object_find(info->mti_env, info->mti_mdt, f, check_exist);
if (!IS_ERR(o)) {
int rc;
if (!IS_ERR(o)) {
int rc;
mdt_set_capainfo(info, 0, &body->fid1,
req_capsule_client_get(pill, &RMF_CAPA1));
mdt_set_capainfo(info, 0, &body->fid1,
req_capsule_client_get(pill, &RMF_CAPA1));
- obj = mdt_object_find(env, info->mti_mdt, &body->fid1);
+ obj = mdt_object_find(env, info->mti_mdt, &body->fid1,
+ MDT_OBJ_MAY_NOT_EXIST);
if (!IS_ERR(obj)) {
if ((flags & HABEO_CORPUS) &&
if (!IS_ERR(obj)) {
if ((flags & HABEO_CORPUS) &&
- !mdt_object_exists(obj)) {
+ mdt_object_exists(obj) == 0) {
mdt_object_put(env, obj);
/* for capability renew ENOENT will be handled in
* mdt_renew_capa */
mdt_object_put(env, obj);
/* for capability renew ENOENT will be handled in
* mdt_renew_capa */
if (!fid_is_sane(&fp->gf_fid))
RETURN(-EINVAL);
if (!fid_is_sane(&fp->gf_fid))
RETURN(-EINVAL);
- obj = mdt_object_find(env, mdt, &fp->gf_fid);
+ obj = mdt_object_find(env, mdt, &fp->gf_fid, MDT_OBJ_MUST_EXIST);
if (obj == NULL || IS_ERR(obj)) {
if (obj == NULL || IS_ERR(obj)) {
- CDEBUG(D_IOCTL, "no object "DFID": %ld\n",PFID(&fp->gf_fid),
+ CDEBUG(D_IOCTL, "%s: no object "DFID": %ld\n",
+ mdt2obd_dev(mdt)->obd_name, PFID(&fp->gf_fid),
+ RETURN(obj == NULL ? -EINVAL : PTR_ERR(obj));
- rc = lu_object_exists(&obj->mot_obj.mo_lu);
- if (rc <= 0) {
- if (rc == -1)
- rc = -EREMOTE;
- else
- rc = -ENOENT;
+ if (lu_object_exists(&obj->mot_obj.mo_lu) < 0) {
+ rc = -EREMOTE;
mdt_object_put(env, obj);
CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n",
PFID(&fp->gf_fid), rc);
mdt_object_put(env, obj);
CDEBUG(D_IOCTL, "nonlocal object "DFID": %d\n",
PFID(&fp->gf_fid), rc);
lh = &mti->mti_lh[MDT_LH_PARENT];
mdt_lock_reg_init(lh, LCK_CR);
lh = &mti->mti_lh[MDT_LH_PARENT];
mdt_lock_reg_init(lh, LCK_CR);
- obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE);
- if (IS_ERR(obj))
+ obj = mdt_object_find_lock(mti, fid, lh, MDS_INODELOCK_UPDATE,
+ MDT_OBJ_MUST_EXIST);
+ if (IS_ERR(obj)) {
+ if (PTR_ERR(obj) == -ENOENT)
+ *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION;
rc = mdt_object_exists(obj);
if (rc < 0) {
rc = mdt_object_exists(obj);
if (rc < 0) {
* fid, this is error to find remote object here
*/
CERROR("nonlocal object "DFID"\n", PFID(fid));
* fid, this is error to find remote object here
*/
CERROR("nonlocal object "DFID"\n", PFID(fid));
- } else if (rc == 0) {
- *(__u64 *)data->ioc_inlbuf2 = ENOENT_VERSION;
- rc = -ENOENT;
- } else {
version = dt_version_get(mti->mti_env, mdt_obj2dt(obj));
*(__u64 *)data->ioc_inlbuf2 = version;
rc = 0;
}
mdt_object_unlock_put(mti, obj, lh, 1);
version = dt_version_get(mti->mti_env, mdt_obj2dt(obj));
*(__u64 *)data->ioc_inlbuf2 = version;
rc = 0;
}
mdt_object_unlock_put(mti, obj, lh, 1);
MDT_TXN_LAST_RCVD_WRITE_OP,
};
MDT_TXN_LAST_RCVD_WRITE_OP,
};
+enum mdt_obj_exist{
+ MDT_OBJ_MUST_EXIST,
+ MDT_OBJ_MAY_NOT_EXIST,
+};
+
static inline const struct md_device_operations *
mdt_child_ops(struct mdt_device * m)
{
static inline const struct md_device_operations *
mdt_child_ops(struct mdt_device * m)
{
+static inline const char *mdt_obj_dev_name(const struct mdt_object *obj)
+{
+ return lu_dev_name(obj->mot_obj.mo_lu.lo_dev);
+}
+
int mdt_get_disposition(struct ldlm_reply *rep, int flag);
void mdt_set_disposition(struct mdt_thread_info *info,
struct ldlm_reply *rep, int flag);
int mdt_get_disposition(struct ldlm_reply *rep, int flag);
void mdt_set_disposition(struct mdt_thread_info *info,
struct ldlm_reply *rep, int flag);
struct mdt_object *mdt_object_find(const struct lu_env *,
struct mdt_device *,
struct mdt_object *mdt_object_find(const struct lu_env *,
struct mdt_device *,
- const struct lu_fid *);
+ const struct lu_fid *,
+ enum mdt_obj_exist check_exist);
struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *,
const struct lu_fid *,
struct mdt_lock_handle *,
struct mdt_object *mdt_object_find_lock(struct mdt_thread_info *,
const struct lu_fid *,
struct mdt_lock_handle *,
+ __u64 ibits,
+ enum mdt_obj_exist check_exist);
void mdt_object_unlock_put(struct mdt_thread_info *,
struct mdt_object *,
struct mdt_lock_handle *,
void mdt_object_unlock_put(struct mdt_thread_info *,
struct mdt_object *,
struct mdt_lock_handle *,
* We failed after creation, but we do not know in which step
* we failed. So try to check the child object.
*/
* We failed after creation, but we do not know in which step
* we failed. So try to check the child object.
*/
- parent = mdt_object_find(env, mdt, rr->rr_fid1);
+ parent = mdt_object_find(env, mdt, rr->rr_fid1,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(parent)) {
rc = PTR_ERR(parent);
LCONSOLE_WARN("Parent "DFID" lookup error %d."
if (IS_ERR(parent)) {
rc = PTR_ERR(parent);
LCONSOLE_WARN("Parent "DFID" lookup error %d."
mdt_export_evict(exp);
RETURN_EXIT;
}
mdt_export_evict(exp);
RETURN_EXIT;
}
- child = mdt_object_find(env, mdt, rr->rr_fid2);
+ child = mdt_object_find(env, mdt, rr->rr_fid2,
+ MDT_OBJ_MAY_NOT_EXIST);
if (IS_ERR(child)) {
rc = PTR_ERR(child);
LCONSOLE_WARN("Child "DFID" lookup error %d."
if (IS_ERR(child)) {
rc = PTR_ERR(child);
LCONSOLE_WARN("Child "DFID" lookup error %d."
- o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2);
+ o = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid2,
+ MDT_OBJ_MUST_EXIST);
- RETURN(rc = PTR_ERR(o));
rc = mdt_object_exists(o);
if (rc > 0) {
rc = mdt_object_exists(o);
if (rc > 0) {
rc = mo_attr_get(env, mdt_object_child(o), ma);
if (rc == 0)
rc = mdt_finish_open(info, NULL, o, flags, 0, rep);
rc = mo_attr_get(env, mdt_object_child(o), ma);
if (rc == 0)
rc = mdt_finish_open(info, NULL, o, flags, 0, rep);
- } else if (rc == 0) {
- rc = -ENOENT;
- } else {
/* the child object was created on remote server */
struct mdt_body *repbody;
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
/* the child object was created on remote server */
struct mdt_body *repbody;
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
}
static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
}
static int mdt_open_anon_by_fid(struct mdt_thread_info *info,
- struct ldlm_reply *rep,
+ struct ldlm_reply *rep,
struct mdt_lock_handle *lhc)
{
const struct lu_env *env = info->mti_env;
struct mdt_lock_handle *lhc)
{
const struct lu_env *env = info->mti_env;
if (md_should_create(flags)) {
if (!lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) {
if (md_should_create(flags)) {
if (!lu_fid_eq(rr->rr_fid1, rr->rr_fid2)) {
- parent = mdt_object_find(env, mdt, rr->rr_fid1);
+ parent = mdt_object_find(env, mdt, rr->rr_fid1,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(parent)) {
CDEBUG(D_INODE, "Fail to find parent "DFID
" for anonymous created %ld, try to"
if (IS_ERR(parent)) {
CDEBUG(D_INODE, "Fail to find parent "DFID
" for anonymous created %ld, try to"
ma->ma_need |= MA_PFID;
}
ma->ma_need |= MA_PFID;
}
- o = mdt_object_find(env, mdt, rr->rr_fid2);
- if (IS_ERR(o))
- RETURN(rc = PTR_ERR(o));
+ o = mdt_object_find(env, mdt, rr->rr_fid2, MDT_OBJ_MUST_EXIST);
+ if (IS_ERR(o)) {
+ if (PTR_ERR(o) == -ENOENT)
+ mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD |
+ DISP_LOOKUP_NEG));
+ GOTO(out_parent, rc = PTR_ERR(o));
+ }
rc = mdt_object_exists(o);
rc = mdt_object_exists(o);
- if (rc == 0) {
- mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD |
- DISP_LOOKUP_NEG));
- GOTO(out, rc = -ENOENT);
- } else if (rc < 0) {
CERROR("NFS remote open shouldn't happen.\n");
CERROR("NFS remote open shouldn't happen.\n");
}
mdt_set_disposition(info, rep, (DISP_IT_EXECD |
DISP_LOOKUP_EXECD |
}
mdt_set_disposition(info, rep, (DISP_IT_EXECD |
DISP_LOOKUP_EXECD |
MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN,
MDT_CROSS_LOCK);
if (rc)
MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN,
MDT_CROSS_LOCK);
if (rc)
rc = mo_attr_get(env, mdt_object_child(o), ma);
if (rc)
rc = mo_attr_get(env, mdt_object_child(o), ma);
if (rc)
if (ma->ma_valid & MA_PFID) {
if (ma->ma_valid & MA_PFID) {
- parent = mdt_object_find(env, mdt, &ma->ma_pfid);
+ parent = mdt_object_find(env, mdt, &ma->ma_pfid,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(parent)) {
CDEBUG(D_INODE, "Fail to find parent "DFID
" for anonymous created %ld, try to"
if (IS_ERR(parent)) {
CDEBUG(D_INODE, "Fail to find parent "DFID
" for anonymous created %ld, try to"
if (!(flags & MDS_OPEN_LOCK) || rc)
mdt_object_unlock(info, o, lhc, 1);
if (!(flags & MDS_OPEN_LOCK) || rc)
mdt_object_unlock(info, o, lhc, 1);
+ GOTO(out_child, rc);
+out_child:
if (parent != NULL)
mdt_object_put(env, parent);
return rc;
if (parent != NULL)
mdt_object_put(env, parent);
return rc;
- o = mdt_object_find(info->mti_env, info->mti_mdt, fid);
+ o = mdt_object_find(info->mti_env, info->mti_mdt, fid,
+ MDT_OBJ_MAY_NOT_EXIST);
if (IS_ERR(o))
RETURN(rc = PTR_ERR(o));
if (IS_ERR(o))
RETURN(rc = PTR_ERR(o));
ma->ma_attr.la_mode, msg_flags);
if (req_is_replay(req) ||
ma->ma_attr.la_mode, msg_flags);
if (req_is_replay(req) ||
- (req->rq_export->exp_libclient && create_flags&MDS_OPEN_HAS_EA)) {
+ (req->rq_export->exp_libclient && create_flags & MDS_OPEN_HAS_EA)) {
/* This is a replay request or from liblustre with ea. */
result = mdt_open_by_fid(info, ldlm_rep);
/* This is a replay request or from liblustre with ea. */
result = mdt_open_by_fid(info, ldlm_rep);
LCK_PW : LCK_PR, rr->rr_name, rr->rr_namelen);
parent = mdt_object_find_lock(info, rr->rr_fid1, lh,
LCK_PW : LCK_PR, rr->rr_name, rr->rr_namelen);
parent = mdt_object_find_lock(info, rr->rr_fid1, lh,
+ MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST);
if (IS_ERR(parent))
GOTO(out, result = PTR_ERR(parent));
if (IS_ERR(parent))
GOTO(out, result = PTR_ERR(parent));
mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
}
mdt_set_disposition(info, ldlm_rep, DISP_LOOKUP_POS);
}
- child = mdt_object_find(info->mti_env, mdt, child_fid);
+ child = mdt_object_find(info->mti_env, mdt, child_fid,
+ MDT_OBJ_MAY_NOT_EXIST);
if (IS_ERR(child))
GOTO(out_parent, result = PTR_ERR(child));
if (IS_ERR(child))
GOTO(out_parent, result = PTR_ERR(child));
}
static int mdt_last_rcvd_read(const struct lu_env *env, struct mdt_device *mdt,
}
static int mdt_last_rcvd_read(const struct lu_env *env, struct mdt_device *mdt,
- struct lsd_client_data *lcd, loff_t *off,
+ struct lsd_client_data *lcd, loff_t *off,
int index)
{
struct mdt_thread_info *mti;
int index)
{
struct mdt_thread_info *mti;
return;
/* if no error, so child was created with requested fid */
return;
/* if no error, so child was created with requested fid */
- child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2);
+ child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(child)) {
rc = PTR_ERR(child);
LCONSOLE_WARN("Child "DFID" lookup error %d."
if (IS_ERR(child)) {
rc = PTR_ERR(child);
LCONSOLE_WARN("Child "DFID" lookup error %d."
return;
body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
return;
body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
- obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1);
+ obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(obj)) {
int rc = PTR_ERR(obj);
LCONSOLE_WARN(""DFID" lookup error %d."
if (IS_ERR(obj)) {
int rc = PTR_ERR(obj);
LCONSOLE_WARN(""DFID" lookup error %d."
info->mti_ver[idx] = ENOENT_VERSION;
if (rc == 0) {
struct mdt_object *child;
info->mti_ver[idx] = ENOENT_VERSION;
if (rc == 0) {
struct mdt_object *child;
- child = mdt_object_find(info->mti_env, info->mti_mdt, fid);
+ child = mdt_object_find(info->mti_env, info->mti_mdt, fid,
+ MDT_OBJ_MAY_NOT_EXIST);
if (likely(!IS_ERR(child))) {
mdt_obj_version_get(info, child, &info->mti_ver[idx]);
mdt_object_put(info->mti_env, child);
if (likely(!IS_ERR(child))) {
mdt_obj_version_get(info, child, &info->mti_ver[idx]);
mdt_object_put(info->mti_env, child);
mdt_lock_pdo_init(lh, LCK_PW, rr->rr_name, rr->rr_namelen);
parent = mdt_object_find_lock(info, rr->rr_fid1, lh,
mdt_lock_pdo_init(lh, LCK_PW, rr->rr_name, rr->rr_namelen);
parent = mdt_object_find_lock(info, rr->rr_fid1, lh,
+ MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST);
if (IS_ERR(parent))
RETURN(PTR_ERR(parent));
if (IS_ERR(parent))
RETURN(PTR_ERR(parent));
/* save version of file name for replay, it must be ENOENT here */
mdt_enoent_version_save(info, 1);
/* save version of file name for replay, it must be ENOENT here */
mdt_enoent_version_save(info, 1);
- child = mdt_object_find(info->mti_env, mdt, rr->rr_fid2);
+ child = mdt_object_find(info->mti_env, mdt, rr->rr_fid2,
+ MDT_OBJ_MAY_NOT_EXIST);
if (likely(!IS_ERR(child))) {
struct md_object *next = mdt_object_child(parent);
if (likely(!IS_ERR(child))) {
struct md_object *next = mdt_object_child(parent);
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
- o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2);
+ o = mdt_object_find(info->mti_env, mdt, info->mti_rr.rr_fid2,
+ MDT_OBJ_MAY_NOT_EXIST);
if (!IS_ERR(o)) {
struct md_object *next = mdt_object_child(o);
if (!IS_ERR(o)) {
struct md_object *next = mdt_object_child(o);
ldlm_request_cancel(req, info->mti_dlm_req, 0);
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
ldlm_request_cancel(req, info->mti_dlm_req, 0);
repbody = req_capsule_server_get(info->mti_pill, &RMF_MDT_BODY);
- mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
+ mo = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(mo))
GOTO(out, rc = PTR_ERR(mo));
if (IS_ERR(mo))
GOTO(out, rc = PTR_ERR(mo));
rr->rr_namelen);
}
mp = mdt_object_find_lock(info, rr->rr_fid1, parent_lh,
rr->rr_namelen);
}
mp = mdt_object_find_lock(info, rr->rr_fid1, parent_lh,
+ MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST);
if (IS_ERR(mp)) {
rc = PTR_ERR(mp);
/* errors are possible here in cross-ref cases, see below */
if (IS_ERR(mp)) {
rc = PTR_ERR(mp);
/* errors are possible here in cross-ref cases, see below */
GOTO(out_unlock_parent, rc);
/* We will lock the child regardless it is local or remote. No harm. */
GOTO(out_unlock_parent, rc);
/* We will lock the child regardless it is local or remote. No harm. */
- mc = mdt_object_find(info->mti_env, info->mti_mdt, child_fid);
+ mc = mdt_object_find(info->mti_env, info->mti_mdt, child_fid,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(mc))
GOTO(out_unlock_parent, rc = PTR_ERR(mc));
child_lh = &info->mti_lh[MDT_LH_CHILD];
if (IS_ERR(mc))
GOTO(out_unlock_parent, rc = PTR_ERR(mc));
child_lh = &info->mti_lh[MDT_LH_CHILD];
lhs = &info->mti_lh[MDT_LH_CHILD];
mdt_lock_reg_init(lhs, LCK_EX);
ms = mdt_object_find_lock(info, rr->rr_fid1, lhs,
lhs = &info->mti_lh[MDT_LH_CHILD];
mdt_lock_reg_init(lhs, LCK_EX);
ms = mdt_object_find_lock(info, rr->rr_fid1, lhs,
+ MDS_INODELOCK_UPDATE,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(ms))
RETURN(PTR_ERR(ms));
if (IS_ERR(ms))
RETURN(PTR_ERR(ms));
mdt_lock_pdo_init(lhp, LCK_PW, rr->rr_name,
rr->rr_namelen);
mp = mdt_object_find_lock(info, rr->rr_fid2, lhp,
mdt_lock_pdo_init(lhp, LCK_PW, rr->rr_name,
rr->rr_namelen);
mp = mdt_object_find_lock(info, rr->rr_fid2, lhp,
+ MDS_INODELOCK_UPDATE, MDT_OBJ_MUST_EXIST);
if (IS_ERR(mp))
RETURN(PTR_ERR(mp));
if (IS_ERR(mp))
RETURN(PTR_ERR(mp));
lhs = &info->mti_lh[MDT_LH_CHILD];
mdt_lock_reg_init(lhs, LCK_EX);
lhs = &info->mti_lh[MDT_LH_CHILD];
mdt_lock_reg_init(lhs, LCK_EX);
- ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1);
+ ms = mdt_object_find(info->mti_env, info->mti_mdt, rr->rr_fid1,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(ms))
GOTO(out_unlock_parent, rc = PTR_ERR(ms));
if (IS_ERR(ms))
GOTO(out_unlock_parent, rc = PTR_ERR(ms));
mdt_lock_pdo_init(lh_tgtdir, LCK_PW, rr->rr_tgt,
rr->rr_tgtlen);
mtgtdir = mdt_object_find_lock(info, rr->rr_fid1, lh_tgtdir,
mdt_lock_pdo_init(lh_tgtdir, LCK_PW, rr->rr_tgt,
rr->rr_tgtlen);
mtgtdir = mdt_object_find_lock(info, rr->rr_fid1, lh_tgtdir,
+ MDS_INODELOCK_UPDATE,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(mtgtdir))
RETURN(PTR_ERR(mtgtdir));
if (IS_ERR(mtgtdir))
RETURN(PTR_ERR(mtgtdir));
mdt_lock_reg_init(lh_tgt, LCK_EX);
mtgt = mdt_object_find_lock(info, tgt_fid, lh_tgt,
mdt_lock_reg_init(lh_tgt, LCK_EX);
mtgt = mdt_object_find_lock(info, tgt_fid, lh_tgt,
+ MDS_INODELOCK_LOOKUP,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(mtgt))
GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt));
if (IS_ERR(mtgt))
GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt));
do {
LASSERT(fid_is_sane(&dst_fid));
do {
LASSERT(fid_is_sane(&dst_fid));
- dst = mdt_object_find(info->mti_env, info->mti_mdt, &dst_fid);
+ dst = mdt_object_find(info->mti_env, info->mti_mdt, &dst_fid,
+ MDT_OBJ_MUST_EXIST);
if (!IS_ERR(dst)) {
rc = mdo_is_subdir(info->mti_env,
mdt_object_child(dst), fid,
if (!IS_ERR(dst)) {
rc = mdo_is_subdir(info->mti_env,
mdt_object_child(dst), fid,
mdt_lock_pdo_init(lh_srcdirp, LCK_PW, rr->rr_name,
rr->rr_namelen);
msrcdir = mdt_object_find_lock(info, rr->rr_fid1, lh_srcdirp,
mdt_lock_pdo_init(lh_srcdirp, LCK_PW, rr->rr_name,
rr->rr_namelen);
msrcdir = mdt_object_find_lock(info, rr->rr_fid1, lh_srcdirp,
+ MDS_INODELOCK_UPDATE,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(msrcdir))
GOTO(out_rename_lock, rc = PTR_ERR(msrcdir));
if (IS_ERR(msrcdir))
GOTO(out_rename_lock, rc = PTR_ERR(msrcdir));
}
} else {
mtgtdir = mdt_object_find(info->mti_env, info->mti_mdt,
}
} else {
mtgtdir = mdt_object_find(info->mti_env, info->mti_mdt,
+ rr->rr_fid2, MDT_OBJ_MUST_EXIST);
if (IS_ERR(mtgtdir))
GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir));
if (IS_ERR(mtgtdir))
GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir));
if (rc)
GOTO(out_put_target, rc);
if (rc)
GOTO(out_put_target, rc);
- rc = mdt_object_exists(mtgtdir);
- if (rc == 0) {
- GOTO(out_put_target, rc = -ESTALE);
- } else if (rc > 0) {
+ if (mdt_object_exists(mtgtdir) > 0) {
/* we lock the target dir if it is local */
rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp,
MDS_INODELOCK_UPDATE,
/* we lock the target dir if it is local */
rc = mdt_object_lock(info, mtgtdir, lh_tgtdirp,
MDS_INODELOCK_UPDATE,
if (lu_fid_eq(old_fid, rr->rr_fid1) || lu_fid_eq(old_fid, rr->rr_fid2))
GOTO(out_unlock_target, rc = -EINVAL);
if (lu_fid_eq(old_fid, rr->rr_fid1) || lu_fid_eq(old_fid, rr->rr_fid2))
GOTO(out_unlock_target, rc = -EINVAL);
- mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid);
+ mold = mdt_object_find(info->mti_env, info->mti_mdt, old_fid,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(mold))
GOTO(out_unlock_target, rc = PTR_ERR(mold));
if (IS_ERR(mold))
GOTO(out_unlock_target, rc = PTR_ERR(mold));
GOTO(out_unlock_old, rc = -EINVAL);
mdt_lock_reg_init(lh_newp, LCK_EX);
GOTO(out_unlock_old, rc = -EINVAL);
mdt_lock_reg_init(lh_newp, LCK_EX);
- mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid);
+ mnew = mdt_object_find(info->mti_env, info->mti_mdt, new_fid,
+ MDT_OBJ_MAY_NOT_EXIST);
if (IS_ERR(mnew))
GOTO(out_unlock_old, rc = PTR_ERR(mnew));
if (IS_ERR(mnew))
GOTO(out_unlock_old, rc = PTR_ERR(mnew));
/* ACLs were sent to clients under LCK_CR locks, so taking LCK_EX
* to cancel them. */
mdt_lock_reg_init(lh, LCK_EX);
/* ACLs were sent to clients under LCK_CR locks, so taking LCK_EX
* to cancel them. */
mdt_lock_reg_init(lh, LCK_EX);
- obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart);
+ obj = mdt_object_find_lock(info, rr->rr_fid1, lh, lockpart,
+ MDT_OBJ_MUST_EXIST);
if (IS_ERR(obj))
GOTO(out, rc = PTR_ERR(obj));
if (IS_ERR(obj))
GOTO(out, rc = PTR_ERR(obj));