X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosp%2Fosp_object.c;h=06048929ef5ec15aab0d087e1dff427b655a247b;hb=2f7bc31bf6e65f2898f345f96fc648250b59634e;hp=ae35a718f720d96f64acfb7a1663f2f0b3d541e4;hpb=1e2cd1c7025080879a27f9ad9a3896fd3e0e8753;p=fs%2Flustre-release.git diff --git a/lustre/osp/osp_object.c b/lustre/osp/osp_object.c index ae35a71..0604892 100644 --- a/lustre/osp/osp_object.c +++ b/lustre/osp/osp_object.c @@ -769,42 +769,36 @@ static int osp_xattr_get_interpterer(const struct lu_env *env, void *data, int index, int rc) { struct osp_xattr_entry *oxe = data; - struct lu_buf *rbuf = &osp_env_info(env)->osi_lb2; - if (!rc) { + spin_lock(&obj->opo_lock); + if (rc >= 0) { + struct lu_buf *rbuf = &osp_env_info(env)->osi_lb2; size_t len = sizeof(*oxe) + oxe->oxe_namelen + 1; rc = object_update_result_data_get(reply, rbuf, index); - spin_lock(&obj->opo_lock); - if (rc < 0 || rbuf->lb_len == 0 || - rbuf->lb_len > (oxe->oxe_buflen - len)) { - if (unlikely(rc == -ENODATA)) { - oxe->oxe_exist = 0; - oxe->oxe_ready = 1; - } else { - oxe->oxe_ready = 0; - } - spin_unlock(&obj->opo_lock); - /* Put the reference obtained in the - * osp_declare_xattr_get(). */ - osp_oac_xattr_put(oxe); + if (rc == -ENOENT || rc == -ENODATA || rc == 0) { + oxe->oxe_exist = 0; + oxe->oxe_ready = 1; + goto unlock; + } - return rc < 0 ? rc : -ERANGE; + if (unlikely(rc < 0) || + rbuf->lb_len > (oxe->oxe_buflen - len)) { + oxe->oxe_ready = 0; + goto unlock; } __osp_oac_xattr_assignment(obj, oxe, rbuf); - spin_unlock(&obj->opo_lock); } else if (rc == -ENOENT || rc == -ENODATA) { - spin_lock(&obj->opo_lock); oxe->oxe_exist = 0; oxe->oxe_ready = 1; - spin_unlock(&obj->opo_lock); } else { - spin_lock(&obj->opo_lock); oxe->oxe_ready = 0; - spin_unlock(&obj->opo_lock); } +unlock: + spin_unlock(&obj->opo_lock); + /* Put the reference obtained in the osp_declare_xattr_get(). */ osp_oac_xattr_put(oxe); @@ -835,8 +829,8 @@ static int osp_declare_xattr_get(const struct lu_env *env, struct dt_object *dt, struct osp_object *obj = dt2osp_obj(dt); struct osp_device *osp = lu2osp_dev(dt->do_lu.lo_dev); struct osp_xattr_entry *oxe; - __u16 namelen; int rc = 0; + __u16 len; LASSERT(buf != NULL); LASSERT(name != NULL); @@ -848,10 +842,10 @@ static int osp_declare_xattr_get(const struct lu_env *env, struct dt_object *dt, if (oxe == NULL) return -ENOMEM; - namelen = strlen(name); + len = strlen(name) + 1; mutex_lock(&osp->opd_async_requests_mutex); rc = osp_insert_async_request(env, OUT_XATTR_GET, obj, 1, - &namelen, (const void **)&name, + &len, (const void **)&name, oxe, buf->lb_len, osp_xattr_get_interpterer); if (rc != 0) {