/**
* update data moved information during a request
*/
-static int mdt_cdt_update_work(struct cdt_req_progress *crp,
- struct hsm_extent *extent)
+static int hsm_update_work(struct cdt_req_progress *crp,
+ const struct hsm_extent *extent)
{
int rc, osz, nsz;
struct interval_node **new_vv;
struct cdt_agent_req *car;
ENTRY;
- OBD_ALLOC_PTR(car);
+ OBD_SLAB_ALLOC_PTR(car, mdt_hsm_car_kmem);
if (car == NULL)
RETURN(ERR_PTR(-ENOMEM));
- cfs_atomic_set(&car->car_refcount, 0);
+ cfs_atomic_set(&car->car_refcount, 1);
car->car_compound_id = compound_id;
car->car_archive_id = archive_id;
car->car_flags = flags;
car->car_uuid = *uuid;
OBD_ALLOC(car->car_hai, hai->hai_len);
if (car->car_hai == NULL) {
- OBD_FREE_PTR(car);
+ OBD_SLAB_FREE_PTR(car, mdt_hsm_car_kmem);
RETURN(ERR_PTR(-ENOMEM));
}
memcpy(car->car_hai, hai, hai->hai_len);
{
mdt_cdt_free_request_tree(&car->car_progress);
OBD_FREE(car->car_hai, car->car_hai->hai_len);
- OBD_FREE_PTR(car);
+ OBD_SLAB_FREE_PTR(car, mdt_hsm_car_kmem);
}
/**
*/
void mdt_cdt_put_request(struct cdt_agent_req *car)
{
+ LASSERT(cfs_atomic_read(&car->car_refcount) > 0);
if (cfs_atomic_dec_and_test(&car->car_refcount))
mdt_cdt_free_request(car);
}
__u64 cookie,
const struct lu_fid *fid)
{
- cfs_list_t *pos;
- struct cdt_agent_req *car;
+ struct cdt_agent_req *car;
+ struct cdt_agent_req *found = NULL;
ENTRY;
- if (cfs_list_empty(&cdt->cdt_requests))
- goto notfound;
-
- cfs_list_for_each(pos, &cdt->cdt_requests) {
- car = cfs_list_entry(pos, struct cdt_agent_req,
- car_request_list);
+ cfs_list_for_each_entry(car, &cdt->cdt_requests, car_request_list) {
if ((car->car_hai->hai_cookie == cookie) ||
((fid != NULL) && lu_fid_eq(fid, &car->car_hai->hai_fid))) {
mdt_cdt_get_request(car);
- RETURN(car);
+ found = car;
+ break;
}
}
-notfound:
- RETURN(ERR_PTR(-ENOENT));
+ RETURN(found);
}
/**
LASSERT(new_car->car_hai->hai_action != HSMA_CANCEL);
down_write(&cdt->cdt_request_lock);
-
car = cdt_find_request_nolock(cdt, new_car->car_hai->hai_cookie, NULL);
- if (!IS_ERR(car)) {
+ if (car != NULL) {
mdt_cdt_put_request(car);
up_write(&cdt->cdt_request_lock);
RETURN(-EEXIST);
}
- mdt_cdt_get_request(new_car);
cfs_list_add_tail(&new_car->car_request_list, &cdt->cdt_requests);
up_write(&cdt->cdt_request_lock);
mdt_hsm_agent_update_statistics(cdt, 0, 0, 1, &new_car->car_uuid);
- down(&cdt->cdt_counter_lock);
- cdt->cdt_request_count++;
- up(&cdt->cdt_counter_lock);
+ atomic_inc(&cdt->cdt_request_count);
RETURN(0);
}
* \retval request pointer
*/
struct cdt_agent_req *mdt_cdt_find_request(struct coordinator *cdt,
- __u64 cookie,
+ const __u64 cookie,
const struct lu_fid *fid)
{
struct cdt_agent_req *car;
ENTRY;
down_read(&cdt->cdt_request_lock);
-
car = cdt_find_request_nolock(cdt, cookie, fid);
-
up_read(&cdt->cdt_request_lock);
RETURN(car);
*/
int mdt_cdt_remove_request(struct coordinator *cdt, __u64 cookie)
{
- struct cdt_agent_req *car;
+ struct cdt_agent_req *car;
ENTRY;
down_write(&cdt->cdt_request_lock);
-
car = cdt_find_request_nolock(cdt, cookie, NULL);
- if (!IS_ERR(car)) {
+ if (car != NULL) {
cfs_list_del(&car->car_request_list);
- mdt_cdt_put_request(car);
up_write(&cdt->cdt_request_lock);
- down(&cdt->cdt_counter_lock);
- cdt->cdt_request_count--;
- up(&cdt->cdt_counter_lock);
+ /* reference from cdt_requests list */
+ mdt_cdt_put_request(car);
+
+ /* reference from cdt_find_request_nolock() */
+ mdt_cdt_put_request(car);
+
+ LASSERT(atomic_read(&cdt->cdt_request_count) > 0);
+ atomic_dec(&cdt->cdt_request_count);
RETURN(0);
}
* \retval -ve failure
*/
struct cdt_agent_req *mdt_cdt_update_request(struct coordinator *cdt,
- struct hsm_progress_kernel *pgs)
+ const struct hsm_progress_kernel *pgs)
{
struct cdt_agent_req *car;
int rc;
ENTRY;
car = mdt_cdt_find_request(cdt, pgs->hpk_cookie, NULL);
- if (IS_ERR(car))
- RETURN(car);
+ if (car == NULL)
+ RETURN(ERR_PTR(-ENOENT));
car->car_req_update = cfs_time_current_sec();
/* update progress done by copy tool */
if (pgs->hpk_errval == 0 && pgs->hpk_extent.length != 0) {
- rc = mdt_cdt_update_work(&car->car_progress, &pgs->hpk_extent);
+ rc = hsm_update_work(&car->car_progress, &pgs->hpk_extent);
if (rc) {
mdt_cdt_put_request(car);
RETURN(ERR_PTR(rc));