Skip to contentSkip to conversation

allow the HBA to reserve target and device private areas

PATCH In review James Bottomley 2 participants 3 messages May 24, 2005 – May 25, 2005 SCSI

lore
Share & tools
lore
#0 lore raw

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 */
#1 lore raw
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.

#2 lore raw
Quoted 5 lines · Christoph Hellwig

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