* [PATCH] allow the HBA to reserve target and device private areas
@ 2005-05-24 21:57 James Bottomley
2005-05-25 7:13 ` Christoph Hellwig
0 siblings, 1 reply; 3+ messages in thread
From: James Bottomley @ 2005-05-24 21:57 UTC (permalink / raw)
To: SCSI Mailing List
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
--- a/include/scsi/scsi_transport.h
+++ b/include/scsi/scsi_transport.h
@@ -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 */
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] allow the HBA to reserve target and device private areas
2005-05-24 21:57 [PATCH] allow the HBA to reserve target and device private areas James Bottomley
@ 2005-05-25 7:13 ` Christoph Hellwig
2005-05-25 12:17 ` James Bottomley
0 siblings, 1 reply; 3+ messages in thread
From: Christoph Hellwig @ 2005-05-25 7:13 UTC (permalink / raw)
To: James Bottomley; +Cc: SCSI Mailing List
On Tue, May 24, 2005 at 04:57:31PM -0500, James Bottomley wrote:
> +/* 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;
> +}
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.
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] allow the HBA to reserve target and device private areas
2005-05-25 7:13 ` Christoph Hellwig
@ 2005-05-25 12:17 ` James Bottomley
0 siblings, 0 replies; 3+ messages in thread
From: James Bottomley @ 2005-05-25 12:17 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: SCSI Mailing List
On Wed, 2005-05-25 at 08:13 +0100, Christoph Hellwig wrote:
> 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.
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
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2005-05-25 12:17 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-05-24 21:57 [PATCH] allow the HBA to reserve target and device private areas James Bottomley
2005-05-25 7:13 ` Christoph Hellwig
2005-05-25 12:17 ` James Bottomley
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox