.hs_put_locked = lu_obj_hop_put_locked,
};
+void lu_dev_add_linkage(struct lu_site *s, struct lu_device *d)
+{
+ cfs_spin_lock(&s->ls_ld_lock);
+ if (cfs_list_empty(&d->ld_linkage))
+ cfs_list_add(&d->ld_linkage, &s->ls_ld_linkage);
+ cfs_spin_unlock(&s->ls_ld_lock);
+}
+EXPORT_SYMBOL(lu_dev_add_linkage);
+
+void lu_dev_del_linkage(struct lu_site *s, struct lu_device *d)
+{
+ cfs_spin_lock(&s->ls_ld_lock);
+ cfs_list_del_init(&d->ld_linkage);
+ cfs_spin_unlock(&s->ls_ld_lock);
+}
+EXPORT_SYMBOL(lu_dev_del_linkage);
+
/**
* Initialize site \a s, with \a d as the top level device.
*/
CFS_INIT_LIST_HEAD(&s->ls_ld_linkage);
cfs_spin_lock_init(&s->ls_ld_lock);
- cfs_spin_lock(&s->ls_ld_lock);
- cfs_list_add(&top->ld_linkage, &s->ls_ld_linkage);
- cfs_spin_unlock(&s->ls_ld_lock);
+ lu_dev_add_linkage(s, top);
RETURN(0);
}
}
static int echo_set_lmm_size(const struct lu_env *env,
- struct lu_device *ld,
- struct md_attr *ma)
-{
- struct md_device *md = lu2md_dev(ld);
- int lmm_size, cookie_size, rc;
- ENTRY;
-
- md = lu2md_dev(ld);
- rc = md->md_ops->mdo_maxsize_get(env, md,
- &lmm_size, &cookie_size);
- if (rc)
- RETURN(rc);
-
- ma->ma_lmm_size = lmm_size;
- if (lmm_size > 0) {
- OBD_ALLOC(ma->ma_lmm, lmm_size);
- if (ma->ma_lmm == NULL) {
- ma->ma_lmm_size = 0;
- RETURN(-ENOMEM);
- }
- }
-
- ma->ma_cookie_size = cookie_size;
- if (cookie_size > 0) {
- OBD_ALLOC(ma->ma_cookie, cookie_size);
- if (ma->ma_cookie == NULL) {
- ma->ma_cookie_size = 0;
- RETURN(-ENOMEM);
- }
- }
-
- RETURN(0);
+ struct lu_device *ld,
+ struct md_attr *ma, int *lmm_size,
+ int *cookie_size)
+{
+ struct md_device *md = lu2md_dev(ld);
+ int rc;
+ ENTRY;
+
+ md = lu2md_dev(ld);
+ rc = md->md_ops->mdo_maxsize_get(env, md,
+ lmm_size, cookie_size);
+ if (rc)
+ RETURN(rc);
+
+ ma->ma_lmm_size = *lmm_size;
+ if (*lmm_size > 0) {
+ OBD_ALLOC(ma->ma_lmm, *lmm_size);
+ if (ma->ma_lmm == NULL) {
+ ma->ma_lmm_size = 0;
+ RETURN(-ENOMEM);
+ }
+ }
+
+ ma->ma_cookie_size = *cookie_size;
+ if (*cookie_size > 0) {
+ OBD_ALLOC(ma->ma_cookie, *cookie_size);
+ if (ma->ma_cookie == NULL) {
+ ma->ma_cookie_size = 0;
+ RETURN(-ENOMEM);
+ }
+ }
+
+ RETURN(0);
}
static int echo_create_md_object(const struct lu_env *env,
struct md_attr *ma = &info->eti_ma;
struct lu_device *ld = ed->ed_next;
int rc = 0;
+ int lmm_size = 0;
+ int cookie_size = 0;
int i;
parent = lu_object_locate(ec_parent->lo_header, ld->ld_type);
memset(spec, 0, sizeof(*spec));
if (stripe_count != 0) {
spec->sp_cr_flags |= FMODE_WRITE;
- rc = echo_set_lmm_size(env, ld, ma);
+ rc = echo_set_lmm_size(env, ld, ma, &lmm_size, &cookie_size);
if (rc)
GOTO(out_free, rc);
if (stripe_count != -1) {
}
out_free:
- if (ma->ma_lmm_size > 0 && ma->ma_lmm != NULL)
- OBD_FREE(ma->ma_lmm, ma->ma_lmm_size);
- if (ma->ma_cookie_size > 0 && ma->ma_cookie != NULL)
- OBD_FREE(ma->ma_cookie, ma->ma_cookie_size);
+ if (lmm_size > 0 && ma->ma_lmm != NULL)
+ OBD_FREE(ma->ma_lmm, lmm_size);
+ if (cookie_size > 0 && ma->ma_cookie != NULL)
+ OBD_FREE(ma->ma_cookie, cookie_size);
- return rc;
+ return rc;
}
static struct lu_object *echo_md_lookup(const struct lu_env *env,
struct md_attr *ma = &info->eti_ma;
struct lu_device *ld = ed->ed_next;
int rc = 0;
+ int lmm_size = 0;
+ int cookie_size = 0;
int i;
parent = lu_object_locate(ec_parent->lo_header, ld->ld_type);
}
memset(ma, 0, sizeof(*ma));
- rc = echo_set_lmm_size(env, ld, ma);
- if (rc)
- GOTO(out_free, rc);
+ rc = echo_set_lmm_size(env, ld, ma, &lmm_size, &cookie_size);
+ if (rc)
+ GOTO(out_free, rc);
ma->ma_need |= MA_INODE | MA_LOV | MA_PFID | MA_HSM | MA_ACL_DEF;
ma->ma_acl = info->eti_xattr_buf;
}
out_free:
- if (ma->ma_lmm_size > 0 && ma->ma_lmm != NULL)
- OBD_FREE(ma->ma_lmm, ma->ma_lmm_size);
- if (ma->ma_cookie_size > 0 && ma->ma_cookie != NULL)
- OBD_FREE(ma->ma_cookie, ma->ma_cookie_size);
- return rc;
+ if (lmm_size > 0 && ma->ma_lmm != NULL)
+ OBD_FREE(ma->ma_lmm, lmm_size);
+ if (cookie_size > 0 && ma->ma_cookie != NULL)
+ OBD_FREE(ma->ma_cookie, cookie_size);
+ return rc;
}
static int echo_lookup_object(const struct lu_env *env,
struct lu_device *ld = ed->ed_next;
struct lu_object *parent;
int rc = 0;
+ int lmm_size = 0;
+ int cookie_size = 0;
int i;
ENTRY;
ma->ma_need = MA_INODE;
ma->ma_valid = 0;
- rc = echo_set_lmm_size(env, ld, ma);
+ rc = echo_set_lmm_size(env, ld, ma, &lmm_size, &cookie_size);
if (rc)
GOTO(out_free, rc);
if (name != NULL) {
}
out_free:
- if (ma->ma_lmm_size > 0 && ma->ma_lmm != NULL)
- OBD_FREE(ma->ma_lmm, ma->ma_lmm_size);
- if (ma->ma_cookie_size > 0 && ma->ma_cookie != NULL)
- OBD_FREE(ma->ma_cookie, ma->ma_cookie_size);
- RETURN(rc);
+ if (lmm_size > 0 && ma->ma_lmm != NULL)
+ OBD_FREE(ma->ma_lmm, lmm_size);
+ if (cookie_size > 0 && ma->ma_cookie != NULL)
+ OBD_FREE(ma->ma_cookie, cookie_size);
+ RETURN(rc);
}
static struct lu_object *echo_resolve_path(const struct lu_env *env,
RETURN(parent);
}
-#define ECHO_MD_CTX_TAG (LCT_REMEMBER | LCT_NOREF | LCT_MD_THREAD)
-#define ECHO_MD_SES_TAG (LCT_SESSION | LCT_REMEMBER | LCT_NOREF)
-
+#define ECHO_MD_CTX_TAG (LCT_REMEMBER | LCT_MD_THREAD)
+#define ECHO_MD_SES_TAG (LCT_REMEMBER | LCT_SESSION)
static int echo_md_handler(struct echo_device *ed, int command,
char *path, int path_len, int id, int count,
struct obd_ioctl_data *data)