allow the HBA to reserve target and device private areas
PATCH 1/1 allow the HBA to reserve target and device private areas
This patch basically allows any HBA attached to the SPI transport class to declare an extra area which the mid-layer will allocate as part of its device and target allocations.
James
include/scsi/scsi_transport.h +36 -0
@@ -21,6 +21,7 @@#define SCSI_TRANSPORT_H #include <linux/transport_class.h> +#include <scsi/scsi_host.h> struct scsi_transport_template {/* the attribute containers */
@@ -32,8 +33,11 @@ struct scsi_transport_template {* space of this size will be left at the end of the * scsi_* structure */ int device_size; +int device_private_offset;int target_size; +int target_private_offset;int host_size; +/* no private offset for the host; there's an alternative mechanism */ /* * True if the transport wants to use a host-based work-queue
@@ -45,4 +49,36 @@ struct scsi_transport_template {dev_to_shost ((tc)->dev) +/* Private area maintenance. The driver requested allocations come +* directly after the transport class allocations (if any). The idea +* is that you *must* call these only once. The code assumes that the + * initial values are the ones the transport specific code requires */ +static inline void +scsi_transport_reserve_target (struct scsi_transport_template * t,int space) +{ + t->target_private_offset =ALIGN (t->target_size,sizeof (void *)); + t->target_size = t->target_private_offset + space; +} +static inline void +scsi_transport_reserve_device (struct scsi_transport_template * t,int space) +{ + t->device_private_offset =ALIGN (t->device_size,sizeof (void *)); + t->device_size = t->device_private_offset + space; +} +static inline void * +scsi_transport_target_data (struct scsi_target *starget) +{ +struct Scsi_Host *shost =dev_to_shost (&starget->dev); +return (u8 *)starget->starget_data + + shost->transportt->target_private_offset; + +} +static inline void * +scsi_transport_device_data (struct scsi_device *sdev) +{ +struct Scsi_Host *shost = sdev->host; +return (u8 *)sdev->sdev_data + + shost->transportt->device_private_offset; +} +#endif /* SCSI_TRANSPORT_H */
Quoted 6 lines · James Bottomley
include/scsi/scsi_transport.h +6
-0+/* Private area maintenance. The driver requested allocations come +* directly after the transport class allocations (if any). The idea +* is that you *must* call these only once. The code assumes that the +* initial values are the ones the transport specific code requires */ +static inline void +scsi_transport_reserve_target (struct scsi_transport_template * t,int space)
include/scsi/scsi_transport.h struct scsi_transport_template { · line 67
Quoted 10 lines
include/scsi/scsi_transport.h +10
-0+{ + t->target_private_offset =ALIGN (t->target_size,sizeof (void *)); + t->target_size = t->target_private_offset + space; +} +static inline void +scsi_transport_reserve_device (struct scsi_transport_template * t,int space) +{ + t->device_private_offset =ALIGN (t->device_size,sizeof (void *)); + t->device_size = t->device_private_offset + space; +}
Do we really need separate functions for this? It would be so much nicer to just have target_priv_size and device_priv_size members in the foo_function_template. Yes, it would mean having this in all different transport templates, but in general having this as compile-time initializer seems a lot nicer.
Quoted 5 lines · Christoph Hellwig
Do we really need separate functions for this? It would be so much nicer to just have
target_priv_sizeanddevice_priv_sizemembers in thefoo_function_template. Yes, it would mean having this in all different transport templates, but in general having this as compile-time initializer seems a lot nicer.
Well, they're not functions, they're inlines. You at least have to have an accessor function because the reserved area occurs after the transport attributes and is aligned on the pointer size.
However, my first implementation was per transport class. You don't actually need the x_private_offset at all because you know the size of the transport attributes. I didn't like it because of all the duplication, but I'm willing to go back to it if there's strong feeling either way.
James