Date: Sat, 10 Aug 2013 12:12:26 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254178 - projects/camlock/sys/cam Message-ID: <201308101212.r7ACCQ4j074471@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Sat Aug 10 12:12:26 2013 New Revision: 254178 URL: http://svnweb.freebsd.org/changeset/base/254178 Log: Add xpt_clone_path() and xpt_copy_path() utility functions. Modified: projects/camlock/sys/cam/cam_xpt.c projects/camlock/sys/cam/cam_xpt.h Modified: projects/camlock/sys/cam/cam_xpt.c ============================================================================== --- projects/camlock/sys/cam/cam_xpt.c Sat Aug 10 07:39:15 2013 (r254177) +++ projects/camlock/sys/cam/cam_xpt.c Sat Aug 10 12:12:26 2013 (r254178) @@ -228,11 +228,13 @@ static void xpt_run_allocq(struct cam_p static void xpt_run_devq(struct cam_devq *devq); static timeout_t xpt_release_devq_timeout; static void xpt_release_simq_timeout(void *arg) __unused; +static void xpt_acquire_bus(struct cam_eb *bus); static void xpt_release_bus(struct cam_eb *bus); static int xpt_release_devq_device(struct cam_ed *dev, u_int count, int run_queue); static struct cam_et* xpt_alloc_target(struct cam_eb *bus, target_id_t target_id); +static void xpt_acquire_target(struct cam_et *target); static void xpt_release_target(struct cam_et *target); static struct cam_eb* xpt_find_bus(path_id_t path_id); @@ -3407,6 +3409,32 @@ xpt_compile_path(struct cam_path *new_pa return (status); } +cam_status +xpt_clone_path(struct cam_path **new_path_ptr, struct cam_path *path) +{ + struct cam_path *new_path; + + new_path = (struct cam_path *)malloc(sizeof(*path), M_CAMPATH, M_NOWAIT); + if (new_path == NULL) + return(CAM_RESRC_UNAVAIL); + xpt_copy_path(new_path, path); + *new_path_ptr = new_path; + return (CAM_REQ_CMP); +} + +void +xpt_copy_path(struct cam_path *new_path, struct cam_path *path) +{ + + *new_path = *path; + if (path->bus != NULL) + xpt_acquire_bus(path->bus); + if (path->target != NULL) + xpt_acquire_target(path->target); + if (path->device != NULL) + xpt_acquire_device(path->device); +} + void xpt_release_path(struct cam_path *path) { @@ -4326,6 +4354,15 @@ cam_periph_getccb(struct cam_periph *per } static void +xpt_acquire_bus(struct cam_eb *bus) +{ + + xpt_lock_buses(); + bus->refcount++; + xpt_unlock_buses(); +} + +static void xpt_release_bus(struct cam_eb *bus) { @@ -4384,6 +4421,16 @@ xpt_alloc_target(struct cam_eb *bus, tar } static void +xpt_acquire_target(struct cam_et *target) +{ + struct cam_eb *bus = target->bus; + + mtx_lock(&bus->eb_mtx); + target->refcount++; + mtx_unlock(&bus->eb_mtx); +} + +static void xpt_release_target(struct cam_et *target) { struct cam_eb *bus = target->bus; Modified: projects/camlock/sys/cam/cam_xpt.h ============================================================================== --- projects/camlock/sys/cam/cam_xpt.h Sat Aug 10 07:39:15 2013 (r254177) +++ projects/camlock/sys/cam/cam_xpt.h Sat Aug 10 12:12:26 2013 (r254178) @@ -110,6 +110,10 @@ cam_status xpt_compile_path(struct cam_ path_id_t path_id, target_id_t target_id, lun_id_t lun_id); +cam_status xpt_clone_path(struct cam_path **new_path, + struct cam_path *path); +void xpt_copy_path(struct cam_path *new_path, + struct cam_path *path); void xpt_release_path(struct cam_path *path);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308101212.r7ACCQ4j074471>