From 30b0b011dfd53faf8f903401fa0539a8d625b0e5 Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Mon, 10 Nov 2014 12:11:50 -0600 Subject: [PATCH] LU-5565 osd-ldiskfs: handle non-existing objects In the DT API method implementations in lustre/osd/osd_ldiskfs.c replace assertions that the object exists (or does not exist) with appropriate error returns. Signed-off-by: John L. Hammond Change-Id: If346861eb352efaf0b90a8e7778e8fbb3cf16bf0 Reviewed-on: http://review.whamcloud.com/12608 Reviewed-by: Fan Yong Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger --- lustre/osd-ldiskfs/osd_handler.c | 73 ++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 0d27665..db71792 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -1730,7 +1730,9 @@ static int osd_attr_get(const struct lu_env *env, { struct osd_object *obj = osd_dt_obj(dt); - LASSERT(dt_object_exists(dt)); + if (!dt_object_exists(dt)) + return -ENOENT; + LASSERT(!dt_object_remote(dt)); LINVRNT(osd_invariant(obj)); @@ -1973,8 +1975,10 @@ static int osd_attr_set(const struct lu_env *env, struct inode *inode; int rc; + if (!dt_object_exists(dt)) + return -ENOENT; + LASSERT(handle != NULL); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(osd_invariant(obj)); @@ -2416,8 +2420,10 @@ static int osd_object_create(const struct lu_env *env, struct dt_object *dt, int result; ENTRY; + if (dt_object_exists(dt)) + return -EEXIST; + LINVRNT(osd_invariant(obj)); - LASSERT(!dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(osd_write_locked(env, obj)); LASSERT(th != NULL); @@ -2745,8 +2751,10 @@ static int osd_object_ea_create(const struct lu_env *env, struct dt_object *dt, ENTRY; + if (dt_object_exists(dt)) + RETURN(-EEXIST); + LASSERT(osd_invariant(obj)); - LASSERT(!dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(osd_write_locked(env, obj)); LASSERT(th != NULL); @@ -2804,8 +2812,10 @@ static int osd_object_ref_add(const struct lu_env *env, struct osd_thandle *oh; int rc = 0; + if (!dt_object_exists(dt)) + return -ENOENT; + LINVRNT(osd_invariant(obj)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(osd_write_locked(env, obj)); LASSERT(th != NULL); @@ -2851,7 +2861,6 @@ static int osd_declare_object_ref_del(const struct lu_env *env, { struct osd_thandle *oh; - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(handle != NULL); @@ -2875,8 +2884,10 @@ static int osd_object_ref_del(const struct lu_env *env, struct dt_object *dt, struct osd_device *osd = osd_dev(dt->do_lu.lo_dev); struct osd_thandle *oh; + if (!dt_object_exists(dt)) + return -ENOENT; + LINVRNT(osd_invariant(obj)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(osd_write_locked(env, obj)); LASSERT(th != NULL); @@ -2952,7 +2963,9 @@ static int osd_xattr_get(const struct lu_env *env, struct dt_object *dt, return sizeof(dt_obj_version_t); } - LASSERT(dt_object_exists(dt)); + if (!dt_object_exists(dt)) + return -ENOENT; + LASSERT(!dt_object_remote(dt)); LASSERT(inode->i_op != NULL); LASSERT(inode->i_op->getxattr != NULL); @@ -3094,7 +3107,9 @@ static int osd_xattr_list(const struct lu_env *env, struct dt_object *dt, struct osd_thread_info *info = osd_oti_get(env); struct dentry *dentry = &info->oti_obj_dentry; - LASSERT(dt_object_exists(dt)); + if (!dt_object_exists(dt)) + return -ENOENT; + LASSERT(!dt_object_remote(dt)); LASSERT(inode->i_op != NULL); LASSERT(inode->i_op->listxattr != NULL); @@ -3114,7 +3129,6 @@ static int osd_declare_xattr_del(const struct lu_env *env, struct osd_thandle *oh; struct super_block *sb = osd_sb(osd_dev(dt->do_lu.lo_dev)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(handle != NULL); @@ -3145,7 +3159,9 @@ static int osd_xattr_del(const struct lu_env *env, struct dt_object *dt, struct dentry *dentry = &info->oti_obj_dentry; int rc; - LASSERT(dt_object_exists(dt)); + if (!dt_object_exists(dt)) + return -ENOENT; + LASSERT(!dt_object_remote(dt)); LASSERT(inode->i_op != NULL); LASSERT(inode->i_op->removexattr != NULL); @@ -3181,7 +3197,9 @@ static struct obd_capa *osd_capa_get(const struct lu_env *env, if (!osd->od_fl_capa) RETURN(ERR_PTR(-ENOENT)); - LASSERT(dt_object_exists(dt)); + if (!dt_object_exists(dt)) + RETURN(ERR_PTR(-ENOENT)); + LASSERT(!dt_object_remote(dt)); LINVRNT(osd_invariant(obj)); @@ -3535,8 +3553,10 @@ static int osd_index_iam_delete(const struct lu_env *env, struct dt_object *dt, int rc; ENTRY; + if (!dt_object_exists(dt)) + RETURN(-ENOENT); + LINVRNT(osd_invariant(obj)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(bag->ic_object == obj->oo_inode); LASSERT(handle != NULL); @@ -3576,7 +3596,6 @@ static int osd_index_declare_ea_delete(const struct lu_env *env, int rc; ENTRY; - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(handle != NULL); @@ -3656,8 +3675,10 @@ static int osd_index_ea_delete(const struct lu_env *env, struct dt_object *dt, int rc; ENTRY; + if (!dt_object_exists(dt)) + RETURN(-ENOENT); + LINVRNT(osd_invariant(obj)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(handle != NULL); @@ -3810,8 +3831,10 @@ static int osd_index_iam_lookup(const struct lu_env *env, struct dt_object *dt, int rc; ENTRY; + if (!dt_object_exists(dt)) + RETURN(-ENOENT); + LASSERT(osd_invariant(obj)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(bag->ic_object == obj->oo_inode); @@ -3894,15 +3917,19 @@ static int osd_index_iam_insert(const struct lu_env *env, struct dt_object *dt, struct osd_object *obj = osd_dt_obj(dt); struct iam_path_descr *ipd; struct osd_thandle *oh; - struct iam_container *bag = &obj->oo_dir->od_container; + struct iam_container *bag; struct osd_thread_info *oti = osd_oti_get(env); struct iam_rec *iam_rec; int rc; ENTRY; + if (!dt_object_exists(dt)) + RETURN(-ENOENT); + LINVRNT(osd_invariant(obj)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); + + bag = &obj->oo_dir->od_container; LASSERT(bag->ic_object == obj->oo_inode); LASSERT(th != NULL); @@ -4519,8 +4546,10 @@ static int osd_index_ea_insert(const struct lu_env *env, struct dt_object *dt, int rc; ENTRY; + if (!dt_object_exists(dt)) + RETURN(-ENOENT); + LASSERT(osd_invariant(obj)); - LASSERT(dt_object_exists(dt)); LASSERT(!dt_object_remote(dt)); LASSERT(th != NULL); @@ -4605,7 +4634,8 @@ static struct dt_it *osd_it_iam_init(const struct lu_env *env, struct iam_path_descr *ipd; struct iam_container *bag = &obj->oo_dir->od_container; - LASSERT(lu_object_exists(lo)); + if (!dt_object_exists(dt)) + return ERR_PTR(-ENOENT); if (osd_object_auth(env, dt, capa, CAPA_OPC_BODY_READ)) return ERR_PTR(-EACCES); @@ -4902,7 +4932,8 @@ static struct dt_it *osd_it_ea_init(const struct lu_env *env, struct dentry *obj_dentry = &info->oti_it_dentry; ENTRY; - LASSERT(lu_object_exists(lo)); + if (!dt_object_exists(dt)) + RETURN(ERR_PTR(-ENOENT)); if (info->oti_it_inline) { OBD_ALLOC_PTR(it); -- 1.8.3.1