* [PATCHES 0/9] osd patches for 2.6.33 merge window - resend
@ 2009-11-16 18:37 Boaz Harrosh
2009-11-16 18:39 ` [PATCH 1/9] libosd: osd_dev_is_ver1 - Minor API cleanup Boaz Harrosh
` (10 more replies)
0 siblings, 11 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:37 UTC (permalink / raw)
To: James Bottomley, open-osd, linux-scsi
James hi.
It's getting near the next merge window and none of the osd patches made it
into scsi-misc yet. I would not like to miss it like last time.
All these are exactly as posted in the mailing list, latest version:
[PATCH 1/9] libosd: osd_dev_is_ver1 - Minor API cleanup
[PATCH 2/9] libosd: osd_sense: OSD_CFO_PERMISSIONS
[PATCH 3/9] osduld: Ref-counting bug fix
[PATCH 4/9] osduld: Use device->release instead of internal kref
[PATCH 5/9] libosd: osd_dev_info: Unique Identification of an OSD device
[PATCH 6/9] libosd: bug in osd_req_decode_sense_full()
[PATCH 7/9] libosd: Bugfix of error handling in attributes-list decoding
[PATCH 8/9] libosd: Error handling revamped
[PATCH 9/9] osd_protocol.h: Add missing #include
Thanks
Boaz
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 1/9] libosd: osd_dev_is_ver1 - Minor API cleanup
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
@ 2009-11-16 18:39 ` Boaz Harrosh
2009-11-16 18:41 ` [PATCH 2/9] libosd: osd_sense: OSD_CFO_PERMISSIONS Boaz Harrosh
` (9 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:39 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
define a new osd_dev_is_ver1 that operates on devices
and the old osd_req_is_ver1 uses that new API.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
include/scsi/osd_initiator.h | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/include/scsi/osd_initiator.h b/include/scsi/osd_initiator.h
index 02bd9f7..f787d24 100644
--- a/include/scsi/osd_initiator.h
+++ b/include/scsi/osd_initiator.h
@@ -84,6 +84,15 @@ static inline void osd_dev_set_ver(struct osd_dev *od, enum osd_std_version v)
#endif
}
+static inline bool osd_dev_is_ver1(struct osd_dev *od)
+{
+#ifdef OSD_VER1_SUPPORT
+ return od->version == OSD_VER1;
+#else
+ return false;
+#endif
+}
+
struct osd_request;
typedef void (osd_req_done_fn)(struct osd_request *or, void *private);
@@ -120,14 +129,9 @@ struct osd_request {
int async_error;
};
-/* OSD Version control */
static inline bool osd_req_is_ver1(struct osd_request *or)
{
-#ifdef OSD_VER1_SUPPORT
- return or->osd_dev->version == OSD_VER1;
-#else
- return false;
-#endif
+ return osd_dev_is_ver1(or->osd_dev);
}
/*
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 2/9] libosd: osd_sense: OSD_CFO_PERMISSIONS
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
2009-11-16 18:39 ` [PATCH 1/9] libosd: osd_dev_is_ver1 - Minor API cleanup Boaz Harrosh
@ 2009-11-16 18:41 ` Boaz Harrosh
2009-11-16 18:44 ` [PATCH 3/9] osduld: Ref-counting bug fix Boaz Harrosh
` (8 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:41 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
Add one more important cdb_field_offset that can be returned with
scsi_invalid_field_in_cdb. It is the offset of the permissions_bit_mask
field in the capabilities structure.
Interestingly, the offset is the same for V1/V2
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
include/scsi/osd_sense.h | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/include/scsi/osd_sense.h b/include/scsi/osd_sense.h
index ff9b33c..91db543 100644
--- a/include/scsi/osd_sense.h
+++ b/include/scsi/osd_sense.h
@@ -255,6 +255,9 @@ enum osdv2_cdb_field_offset {
OSD_CFO_STARTING_BYTE = OSD_CDB_OFFSET(v2.start_address),
OSD_CFO_PARTITION_ID = OSD_CDB_OFFSET(partition),
OSD_CFO_OBJECT_ID = OSD_CDB_OFFSET(object),
+ OSD_CFO_PERMISSIONS = sizeof(struct osd_cdb_head) +
+ offsetof(struct osd_capability_head,
+ permissions_bit_mask),
};
#endif /* ndef __OSD_SENSE_H__ */
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 3/9] osduld: Ref-counting bug fix
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
2009-11-16 18:39 ` [PATCH 1/9] libosd: osd_dev_is_ver1 - Minor API cleanup Boaz Harrosh
2009-11-16 18:41 ` [PATCH 2/9] libosd: osd_sense: OSD_CFO_PERMISSIONS Boaz Harrosh
@ 2009-11-16 18:44 ` Boaz Harrosh
2009-11-16 18:45 ` [PATCH 4/9] osduld: Use device->release instead of internal kref Boaz Harrosh
` (7 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:44 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
If scsi has released the device (logout), and exofs has last
reference on the osduld_device it will be freed by
osd_uld_release() within the call to fput(). But this will
oops in cdev_release() which is called after the fops->release.
(cdev is embedded within osduld_device). __uld_get/put pair
makes sure we have a cdev for the duration of fput()
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
drivers/scsi/osd/osd_uld.c | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c
index 0bdef33..1ea6447 100644
--- a/drivers/scsi/osd/osd_uld.c
+++ b/drivers/scsi/osd/osd_uld.c
@@ -224,7 +224,15 @@ void osduld_put_device(struct osd_dev *od)
BUG_ON(od->scsi_device != oud->od.scsi_device);
+ /* If scsi has released the device (logout), and exofs has last
+ * reference on oud it will be freed by above osd_uld_release
+ * within fput below. But this will oops in cdev_release which
+ * is called after the fops->release. __uld_get/put pair makes
+ * sure we have a cdev for the duration of fput
+ */
+ __uld_get(oud);
fput(od->file);
+ __uld_put(oud);
kfree(od);
}
}
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 4/9] osduld: Use device->release instead of internal kref
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (2 preceding siblings ...)
2009-11-16 18:44 ` [PATCH 3/9] osduld: Ref-counting bug fix Boaz Harrosh
@ 2009-11-16 18:45 ` Boaz Harrosh
2009-11-16 19:52 ` James Bottomley
2009-11-16 18:45 ` [PATCH 5/9] libosd: osd_dev_info: Unique Identification of an OSD device Boaz Harrosh
` (6 subsequent siblings)
10 siblings, 1 reply; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:45 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
The true logic of this patch will be clear in the next patch where we
use the class_find_device() API. When doing so the use of an internal
kref leaves us a narrow window where a find is started while the actual
object can go away. Using the device's kobj reference solves this
problem because now the same kref is used for both operations. (Remove
and find)
Core changes
* Embed a struct device in uld_ structure and use device_register
instead of devie_create. Set __remove to be the device release
function.
* __uld_get/put is just get_/put_device. Now every thing is accounted
for on the device object. Internal kref is removed.
* At __remove() we can safely de-allocate the uld_ structure. (The
function has moved to avoid forward declaration)
Some cleanups
* Use class register/unregister is cleaner for this driver now.
* cdev ref-counting games are no longer necessary
I have incremented the device version string in case of new bugs.
Note: Previous bugfix of taking the reference around fput() still
applies.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
drivers/scsi/osd/osd_uld.c | 162 ++++++++++++++++++++----------------------
include/scsi/osd_initiator.h | 1 -
2 files changed, 77 insertions(+), 86 deletions(-)
diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c
index 1ea6447..9dd5948 100644
--- a/drivers/scsi/osd/osd_uld.c
+++ b/drivers/scsi/osd/osd_uld.c
@@ -71,8 +71,7 @@
#define SCSI_OSD_MAX_MINOR 64
static const char osd_name[] = "osd";
-static const char *osd_version_string = "open-osd 0.1.0";
-const char osd_symlink[] = "scsi_osd";
+static const char *osd_version_string = "open-osd 0.2.0";
MODULE_AUTHOR("Boaz Harrosh <bharrosh@panasas.com>");
MODULE_DESCRIPTION("open-osd Upper-Layer-Driver osd.ko");
@@ -82,15 +81,24 @@ MODULE_ALIAS_SCSI_DEVICE(TYPE_OSD);
struct osd_uld_device {
int minor;
- struct kref kref;
+ struct device class_dev;
struct cdev cdev;
struct osd_dev od;
struct gendisk *disk;
- struct device *class_member;
};
-static void __uld_get(struct osd_uld_device *oud);
-static void __uld_put(struct osd_uld_device *oud);
+struct osd_dev_handle {
+ struct osd_dev od;
+ struct file *file;
+ struct osd_uld_device *oud;
+} ;
+
+static DEFINE_IDA(osd_minor_ida);
+
+static struct class osd_uld_class = {
+ .owner = THIS_MODULE,
+ .name = "scsi_osd",
+};
/*
* Char Device operations
@@ -101,7 +109,7 @@ static int osd_uld_open(struct inode *inode, struct file *file)
struct osd_uld_device *oud = container_of(inode->i_cdev,
struct osd_uld_device, cdev);
- __uld_get(oud);
+ get_device(&oud->class_dev);
/* cache osd_uld_device on file handle */
file->private_data = oud;
OSD_DEBUG("osd_uld_open %p\n", oud);
@@ -114,7 +122,7 @@ static int osd_uld_release(struct inode *inode, struct file *file)
OSD_DEBUG("osd_uld_release %p\n", file->private_data);
file->private_data = NULL;
- __uld_put(oud);
+ put_device(&oud->class_dev);
return 0;
}
@@ -177,7 +185,7 @@ static const struct file_operations osd_fops = {
struct osd_dev *osduld_path_lookup(const char *name)
{
struct osd_uld_device *oud;
- struct osd_dev *od;
+ struct osd_dev_handle *odh;
struct file *file;
int error;
@@ -186,8 +194,8 @@ struct osd_dev *osduld_path_lookup(const char *name)
return ERR_PTR(-EINVAL);
}
- od = kzalloc(sizeof(*od), GFP_KERNEL);
- if (!od)
+ odh = kzalloc(sizeof(*odh), GFP_KERNEL);
+ if (unlikely(!odh))
return ERR_PTR(-ENOMEM);
file = filp_open(name, O_RDWR, 0);
@@ -203,37 +211,39 @@ struct osd_dev *osduld_path_lookup(const char *name)
oud = file->private_data;
- *od = oud->od;
- od->file = file;
+ odh->od = oud->od;
+ odh->file = file;
+ odh->oud = oud;
- return od;
+ return &odh->od;
close_file:
fput(file);
free_od:
- kfree(od);
+ kfree(odh);
return ERR_PTR(error);
}
EXPORT_SYMBOL(osduld_path_lookup);
void osduld_put_device(struct osd_dev *od)
{
-
if (od && !IS_ERR(od)) {
- struct osd_uld_device *oud = od->file->private_data;
+ struct osd_dev_handle *odh =
+ container_of(od, struct osd_dev_handle, od);
+ struct osd_uld_device *oud = odh->oud;
BUG_ON(od->scsi_device != oud->od.scsi_device);
/* If scsi has released the device (logout), and exofs has last
* reference on oud it will be freed by above osd_uld_release
* within fput below. But this will oops in cdev_release which
- * is called after the fops->release. __uld_get/put pair makes
+ * is called after the fops->release. A get_/put_ pair makes
* sure we have a cdev for the duration of fput
*/
- __uld_get(oud);
- fput(od->file);
- __uld_put(oud);
- kfree(od);
+ get_device(&oud->class_dev);
+ fput(odh->file);
+ put_device(&oud->class_dev);
+ kfree(odh);
}
}
EXPORT_SYMBOL(osduld_put_device);
@@ -264,8 +274,26 @@ static int __detect_osd(struct osd_uld_device *oud)
return 0;
}
-static struct class *osd_sysfs_class;
-static DEFINE_IDA(osd_minor_ida);
+static void __remove(struct device *dev)
+{
+ struct osd_uld_device *oud = dev_get_drvdata(dev);
+ struct scsi_device *scsi_device = oud->od.scsi_device;
+
+ if (oud->cdev.owner)
+ cdev_del(&oud->cdev);
+
+ osd_dev_fini(&oud->od);
+ scsi_device_put(scsi_device);
+
+ OSD_INFO("osd_remove %s\n",
+ oud->disk ? oud->disk->disk_name : NULL);
+
+ if (oud->disk)
+ put_disk(oud->disk);
+ ida_remove(&osd_minor_ida, oud->minor);
+
+ kfree(oud);
+}
static int osd_probe(struct device *dev)
{
@@ -297,7 +325,6 @@ static int osd_probe(struct device *dev)
if (NULL == oud)
goto err_retract_minor;
- kref_init(&oud->kref);
dev_set_drvdata(dev, oud);
oud->minor = minor;
@@ -335,18 +362,26 @@ static int osd_probe(struct device *dev)
OSD_ERR("cdev_add failed\n");
goto err_put_disk;
}
- kobject_get(&oud->cdev.kobj); /* 2nd ref see osd_remove() */
-
- /* class_member */
- oud->class_member = device_create(osd_sysfs_class, dev,
- MKDEV(SCSI_OSD_MAJOR, oud->minor), "%s", disk->disk_name);
- if (IS_ERR(oud->class_member)) {
- OSD_ERR("class_device_create failed\n");
- error = PTR_ERR(oud->class_member);
+
+ /* class device member */
+ oud->class_dev.devt = oud->cdev.dev;
+ oud->class_dev.class = &osd_uld_class;
+ oud->class_dev.parent = dev;
+ oud->class_dev.release = __remove;
+ dev_set_drvdata(&oud->class_dev, oud);
+ error = dev_set_name(&oud->class_dev, disk->disk_name);
+ if (error) {
+ OSD_ERR("dev_set_name failed => %d\n", error);
+ goto err_put_cdev;
+ }
+
+ error = device_register(&oud->class_dev);
+ if (error) {
+ OSD_ERR("device_register failed => %d\n", error);
goto err_put_cdev;
}
- dev_set_drvdata(oud->class_member, oud);
+ get_device(&oud->class_dev);
OSD_INFO("osd_probe %s\n", disk->disk_name);
return 0;
@@ -375,54 +410,12 @@ static int osd_remove(struct device *dev)
scsi_device);
}
- if (oud->class_member)
- device_destroy(osd_sysfs_class,
- MKDEV(SCSI_OSD_MAJOR, oud->minor));
-
- /* We have 2 references to the cdev. One is released here
- * and also takes down the /dev/osdX mapping. The second
- * Will be released in __remove() after all users have released
- * the osd_uld_device.
- */
- if (oud->cdev.owner)
- cdev_del(&oud->cdev);
+ device_unregister(&oud->class_dev);
- __uld_put(oud);
+ put_device(&oud->class_dev);
return 0;
}
-static void __remove(struct kref *kref)
-{
- struct osd_uld_device *oud = container_of(kref,
- struct osd_uld_device, kref);
- struct scsi_device *scsi_device = oud->od.scsi_device;
-
- /* now let delete the char_dev */
- kobject_put(&oud->cdev.kobj);
-
- osd_dev_fini(&oud->od);
- scsi_device_put(scsi_device);
-
- OSD_INFO("osd_remove %s\n",
- oud->disk ? oud->disk->disk_name : NULL);
-
- if (oud->disk)
- put_disk(oud->disk);
-
- ida_remove(&osd_minor_ida, oud->minor);
- kfree(oud);
-}
-
-static void __uld_get(struct osd_uld_device *oud)
-{
- kref_get(&oud->kref);
-}
-
-static void __uld_put(struct osd_uld_device *oud)
-{
- kref_put(&oud->kref, __remove);
-}
-
/*
* Global driver and scsi registration
*/
@@ -440,11 +433,10 @@ static int __init osd_uld_init(void)
{
int err;
- osd_sysfs_class = class_create(THIS_MODULE, osd_symlink);
- if (IS_ERR(osd_sysfs_class)) {
- OSD_ERR("Unable to register sysfs class => %ld\n",
- PTR_ERR(osd_sysfs_class));
- return PTR_ERR(osd_sysfs_class);
+ err = class_register(&osd_uld_class);
+ if (err) {
+ OSD_ERR("Unable to register sysfs class => %d\n", err);
+ return err;
}
err = register_chrdev_region(MKDEV(SCSI_OSD_MAJOR, 0),
@@ -467,7 +459,7 @@ static int __init osd_uld_init(void)
err_out_chrdev:
unregister_chrdev_region(MKDEV(SCSI_OSD_MAJOR, 0), SCSI_OSD_MAX_MINOR);
err_out:
- class_destroy(osd_sysfs_class);
+ class_unregister(&osd_uld_class);
return err;
}
@@ -475,7 +467,7 @@ static void __exit osd_uld_exit(void)
{
scsi_unregister_driver(&osd_driver.gendrv);
unregister_chrdev_region(MKDEV(SCSI_OSD_MAJOR, 0), SCSI_OSD_MAX_MINOR);
- class_destroy(osd_sysfs_class);
+ class_unregister(&osd_uld_class);
OSD_INFO("UNLOADED %s\n", osd_version_string);
}
diff --git a/include/scsi/osd_initiator.h b/include/scsi/osd_initiator.h
index f787d24..589e5f0 100644
--- a/include/scsi/osd_initiator.h
+++ b/include/scsi/osd_initiator.h
@@ -48,7 +48,6 @@ enum osd_std_version {
*/
struct osd_dev {
struct scsi_device *scsi_device;
- struct file *file;
unsigned def_timeout;
#ifdef OSD_VER1_SUPPORT
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 5/9] libosd: osd_dev_info: Unique Identification of an OSD device
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (3 preceding siblings ...)
2009-11-16 18:45 ` [PATCH 4/9] osduld: Use device->release instead of internal kref Boaz Harrosh
@ 2009-11-16 18:45 ` Boaz Harrosh
2009-11-16 18:47 ` [PATCH 6/9] libosd: bug in osd_req_decode_sense_full() Boaz Harrosh
` (5 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:45 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
Define an osd_dev_info structure that Uniquely identifies an OSD
device lun on the network. The identification is built from unique
target attributes and is the same for all network/SAN machines.
osduld_info_lookup() - NEW
New API that will lookup an osd_dev by its osd_dev_info.
This is used by pNFS-objects for cross network global device
identification. And by exofs multy-device support, the device
info is specified in the on-disk exofs device table.
osduld_device_info() - NEW
Given an osd_dev handle returns its associated osd_dev_info.
The ULD fetches this information at startup and hangs it on
each OSD device. (This is a fast operation that can be called
at any condition)
osduld_device_same() - NEW
With a given osd_dev at one hand and an osd_dev_info
at another, we would like to know if they are the same
device.
Two osd_dev handles can be checked by:
osduld_device_same(od1, osduld_device_info(od2));
osd_auto_detect_ver() - REVISED
Now returns an osd_dev_info structure. Is only called once
by ULD as before. See added comments for how to use.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
drivers/scsi/osd/osd_initiator.c | 26 ++++++++--
drivers/scsi/osd/osd_uld.c | 99 ++++++++++++++++++++++++++++++++++++-
include/scsi/osd_initiator.h | 38 +++++++++++++--
3 files changed, 150 insertions(+), 13 deletions(-)
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
index 7a117c1..60b7ca1 100644
--- a/drivers/scsi/osd/osd_initiator.c
+++ b/drivers/scsi/osd/osd_initiator.c
@@ -73,7 +73,8 @@ static const char *_osd_ver_desc(struct osd_request *or)
#define ATTR_DEF_RI(id, len) ATTR_DEF(OSD_APAGE_ROOT_INFORMATION, id, len)
-static int _osd_print_system_info(struct osd_dev *od, void *caps)
+static int _osd_get_print_system_info(struct osd_dev *od,
+ void *caps, struct osd_dev_info *odi)
{
struct osd_request *or;
struct osd_attr get_attrs[] = {
@@ -137,8 +138,12 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps)
OSD_INFO("PRODUCT_SERIAL_NUMBER [%s]\n",
(char *)pFirst);
- pFirst = get_attrs[a].val_ptr;
- OSD_INFO("OSD_NAME [%s]\n", (char *)pFirst);
+ odi->osdname_len = get_attrs[a].len;
+ /* Avoid NULL for memcmp optimization 0-length is good enough */
+ odi->osdname = kzalloc(odi->osdname_len + 1, GFP_KERNEL);
+ if (odi->osdname_len)
+ memcpy(odi->osdname, get_attrs[a].val_ptr, odi->osdname_len);
+ OSD_INFO("OSD_NAME [%s]\n", odi->osdname);
a++;
pFirst = get_attrs[a++].val_ptr;
@@ -171,6 +176,14 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps)
sid_dump, sizeof(sid_dump), true);
OSD_INFO("OSD_SYSTEM_ID(%d)\n"
" [%s]\n", len, sid_dump);
+
+ if (unlikely(len > sizeof(odi->systemid))) {
+ OSD_ERR("OSD Target error: OSD_SYSTEM_ID too long(%d). "
+ "device idetification might not work\n", len);
+ len = sizeof(odi->systemid);
+ }
+ odi->systemid_len = len;
+ memcpy(odi->systemid, get_attrs[a].val_ptr, len);
a++;
}
out:
@@ -178,16 +191,17 @@ out:
return ret;
}
-int osd_auto_detect_ver(struct osd_dev *od, void *caps)
+int osd_auto_detect_ver(struct osd_dev *od,
+ void *caps, struct osd_dev_info *odi)
{
int ret;
/* Auto-detect the osd version */
- ret = _osd_print_system_info(od, caps);
+ ret = _osd_get_print_system_info(od, caps, odi);
if (ret) {
osd_dev_set_ver(od, OSD_VER1);
OSD_DEBUG("converting to OSD1\n");
- ret = _osd_print_system_info(od, caps);
+ ret = _osd_get_print_system_info(od, caps, odi);
}
return ret;
diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c
index 9dd5948..0484bae 100644
--- a/drivers/scsi/osd/osd_uld.c
+++ b/drivers/scsi/osd/osd_uld.c
@@ -84,6 +84,7 @@ struct osd_uld_device {
struct device class_dev;
struct cdev cdev;
struct osd_dev od;
+ struct osd_dev_info odi;
struct gendisk *disk;
};
@@ -225,6 +226,71 @@ free_od:
}
EXPORT_SYMBOL(osduld_path_lookup);
+static inline bool _the_same_or_null(const u8 *a1, unsigned a1_len,
+ const u8 *a2, unsigned a2_len)
+{
+ if (!a2_len) /* User string is Empty means don't care */
+ return true;
+
+ if (a1_len != a2_len)
+ return false;
+
+ return 0 == memcmp(a1, a2, a1_len);
+}
+
+struct find_oud_t {
+ const struct osd_dev_info *odi;
+ struct device *dev;
+ struct osd_uld_device *oud;
+} ;
+
+int _mach_odi(struct device *dev, void *find_data)
+{
+ struct osd_uld_device *oud = dev_get_drvdata(dev);
+ struct find_oud_t *fot = find_data;
+ const struct osd_dev_info *odi = fot->odi;
+
+ if (_the_same_or_null(oud->odi.systemid, oud->odi.systemid_len,
+ odi->systemid, odi->systemid_len) &&
+ _the_same_or_null(oud->odi.osdname, oud->odi.osdname_len,
+ odi->osdname, odi->osdname_len)) {
+ OSD_DEBUG("found device sysid_len=%d osdname=%d\n",
+ odi->systemid_len, odi->osdname_len);
+ fot->oud = oud;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/* osduld_info_lookup - Loop through all devices, return the requested osd_dev.
+ *
+ * if @odi->systemid_len and/or @odi->osdname_len are zero, they act as a don't
+ * care. .e.g if they're both zero /dev/osd0 is returned.
+ */
+struct osd_dev *osduld_info_lookup(const struct osd_dev_info *odi)
+{
+ struct find_oud_t find = {.odi = odi};
+
+ find.dev = class_find_device(&osd_uld_class, NULL, &find, _mach_odi);
+ if (likely(find.dev)) {
+ struct osd_dev_handle *odh = kzalloc(sizeof(*odh), GFP_KERNEL);
+
+ if (unlikely(!odh)) {
+ put_device(find.dev);
+ return ERR_PTR(-ENOMEM);
+ }
+
+ odh->od = find.oud->od;
+ odh->oud = find.oud;
+
+ return &odh->od;
+ }
+
+ return ERR_PTR(-ENODEV);
+}
+EXPORT_SYMBOL(osduld_info_lookup);
+
void osduld_put_device(struct osd_dev *od)
{
if (od && !IS_ERR(od)) {
@@ -240,14 +306,39 @@ void osduld_put_device(struct osd_dev *od)
* is called after the fops->release. A get_/put_ pair makes
* sure we have a cdev for the duration of fput
*/
- get_device(&oud->class_dev);
- fput(odh->file);
+ if (odh->file) {
+ get_device(&oud->class_dev);
+ fput(odh->file);
+ }
put_device(&oud->class_dev);
kfree(odh);
}
}
EXPORT_SYMBOL(osduld_put_device);
+const struct osd_dev_info *osduld_device_info(struct osd_dev *od)
+{
+ struct osd_dev_handle *odh =
+ container_of(od, struct osd_dev_handle, od);
+ return &odh->oud->odi;
+}
+EXPORT_SYMBOL(osduld_device_info);
+
+bool osduld_device_same(struct osd_dev *od, const struct osd_dev_info *odi)
+{
+ struct osd_dev_handle *odh =
+ container_of(od, struct osd_dev_handle, od);
+ struct osd_uld_device *oud = odh->oud;
+
+ return (oud->odi.systemid_len == odi->systemid_len) &&
+ _the_same_or_null(oud->odi.systemid, oud->odi.systemid_len,
+ odi->systemid, odi->systemid_len) &&
+ (oud->odi.osdname_len == odi->osdname_len) &&
+ _the_same_or_null(oud->odi.osdname, oud->odi.osdname_len,
+ odi->osdname, odi->osdname_len);
+}
+EXPORT_SYMBOL(osduld_device_same);
+
/*
* Scsi Device operations
*/
@@ -268,7 +359,7 @@ static int __detect_osd(struct osd_uld_device *oud)
OSD_ERR("warning: scsi_test_unit_ready failed\n");
osd_sec_init_nosec_doall_caps(caps, &osd_root_object, false, true);
- if (osd_auto_detect_ver(&oud->od, caps))
+ if (osd_auto_detect_ver(&oud->od, caps, &oud->odi))
return -ENODEV;
return 0;
@@ -279,6 +370,8 @@ static void __remove(struct device *dev)
struct osd_uld_device *oud = dev_get_drvdata(dev);
struct scsi_device *scsi_device = oud->od.scsi_device;
+ kfree(oud->odi.osdname);
+
if (oud->cdev.owner)
cdev_del(&oud->cdev);
diff --git a/include/scsi/osd_initiator.h b/include/scsi/osd_initiator.h
index 589e5f0..3ec346e 100644
--- a/include/scsi/osd_initiator.h
+++ b/include/scsi/osd_initiator.h
@@ -55,10 +55,24 @@ struct osd_dev {
#endif
};
-/* Retrieve/return osd_dev(s) for use by Kernel clients */
-struct osd_dev *osduld_path_lookup(const char *dev_name); /*Use IS_ERR/ERR_PTR*/
+/* Unique Identification of an OSD device */
+struct osd_dev_info {
+ unsigned systemid_len;
+ u8 systemid[OSD_SYSTEMID_LEN];
+ unsigned osdname_len;
+ u8 *osdname;
+};
+
+/* Retrieve/return osd_dev(s) for use by Kernel clients
+ * Use IS_ERR/ERR_PTR on returned "osd_dev *".
+ */
+struct osd_dev *osduld_path_lookup(const char *dev_name);
+struct osd_dev *osduld_info_lookup(const struct osd_dev_info *odi);
void osduld_put_device(struct osd_dev *od);
+const struct osd_dev_info *osduld_device_info(struct osd_dev *od);
+bool osduld_device_same(struct osd_dev *od, const struct osd_dev_info *odi);
+
/* Add/remove test ioctls from external modules */
typedef int (do_test_fn)(struct osd_dev *od, unsigned cmd, unsigned long arg);
int osduld_register_test(unsigned ioctl, do_test_fn *do_test);
@@ -68,8 +82,24 @@ void osduld_unregister_test(unsigned ioctl);
void osd_dev_init(struct osd_dev *od, struct scsi_device *scsi_device);
void osd_dev_fini(struct osd_dev *od);
-/* some hi level device operations */
-int osd_auto_detect_ver(struct osd_dev *od, void *caps); /* GFP_KERNEL */
+/**
+ * osd_auto_detect_ver - Detect the OSD version, return Unique Identification
+ *
+ * @od: OSD target lun handle
+ * @caps: Capabilities authorizing OSD root read attributes access
+ * @odi: Retrieved information uniquely identifying the osd target lun
+ * Note: odi->osdname must be kfreed by caller.
+ *
+ * Auto detects the OSD version of the OSD target and sets the @od
+ * accordingly. Meanwhile also returns the "system id" and "osd name" root
+ * attributes which uniquely identify the OSD target. This member is usually
+ * called by the ULD. ULD users should call osduld_device_info().
+ * This rutine allocates osd requests and memory at GFP_KERNEL level and might
+ * sleep.
+ */
+int osd_auto_detect_ver(struct osd_dev *od,
+ void *caps, struct osd_dev_info *odi);
+
static inline struct request_queue *osd_request_queue(struct osd_dev *od)
{
return od->scsi_device->request_queue;
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 6/9] libosd: bug in osd_req_decode_sense_full()
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (4 preceding siblings ...)
2009-11-16 18:45 ` [PATCH 5/9] libosd: osd_dev_info: Unique Identification of an OSD device Boaz Harrosh
@ 2009-11-16 18:47 ` Boaz Harrosh
2009-11-16 18:47 ` [PATCH 7/9] libosd: Bugfix of error handling in attributes-list decoding Boaz Harrosh
` (4 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:47 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
The (never tested) osd_sense_attribute_identification case
has never worked. The loop was never advanced on.
Fix it to work as intended.
On 10/30/2009 04:39 PM, Roel Kluin wrote:
I found this by code analysis, searching for while
loops that test a local variable, but do not modify
the variable.
Reported-by: Roel Kluin <roel.kluin@gmail.com>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
drivers/scsi/osd/osd_initiator.c | 9 +++++----
1 files changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
index 60b7ca1..5e90d19 100644
--- a/drivers/scsi/osd/osd_initiator.c
+++ b/drivers/scsi/osd/osd_initiator.c
@@ -1583,15 +1583,14 @@ int osd_req_decode_sense_full(struct osd_request *or,
{
struct osd_sense_attributes_data_descriptor
*osadd = cur_descriptor;
- int len = min(cur_len, sense_len);
- int i = 0;
+ unsigned len = min(cur_len, sense_len);
struct osd_sense_attr *pattr = osadd->sense_attrs;
- while (len < 0) {
+ while (len >= sizeof(*pattr)) {
u32 attr_page = be32_to_cpu(pattr->attr_page);
u32 attr_id = be32_to_cpu(pattr->attr_id);
- if (i++ == 0) {
+ if (!osi->attr.attr_page) {
osi->attr.attr_page = attr_page;
osi->attr.attr_id = attr_id;
}
@@ -1602,6 +1601,8 @@ int osd_req_decode_sense_full(struct osd_request *or,
bad_attr_list++;
max_attr--;
}
+
+ len -= sizeof(*pattr);
OSD_SENSE_PRINT2(
"osd_sense_attribute_identification"
"attr_page=0x%x attr_id=0x%x\n",
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 7/9] libosd: Bugfix of error handling in attributes-list decoding
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (5 preceding siblings ...)
2009-11-16 18:47 ` [PATCH 6/9] libosd: bug in osd_req_decode_sense_full() Boaz Harrosh
@ 2009-11-16 18:47 ` Boaz Harrosh
2009-11-16 18:48 ` [PATCH 8/9] libosd: Error handling revamped Boaz Harrosh
` (3 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:47 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
When an error was detected in an attribute list do to
a target bug. We would print an error but spin endlessly
regardless. Fix it.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
drivers/scsi/osd/osd_initiator.c | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
index 5e90d19..ba25b1e 100644
--- a/drivers/scsi/osd/osd_initiator.c
+++ b/drivers/scsi/osd/osd_initiator.c
@@ -1167,6 +1167,7 @@ int osd_req_decode_get_attr_list(struct osd_request *or,
"c=%d r=%d n=%d\n",
cur_bytes, returned_bytes, n);
oa->val_ptr = NULL;
+ cur_bytes = returned_bytes; /* break the caller loop */
break;
}
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 8/9] libosd: Error handling revamped
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (6 preceding siblings ...)
2009-11-16 18:47 ` [PATCH 7/9] libosd: Bugfix of error handling in attributes-list decoding Boaz Harrosh
@ 2009-11-16 18:48 ` Boaz Harrosh
2009-11-16 18:49 ` [PATCH 9/9] osd_protocol.h: Add missing #include Boaz Harrosh
` (2 subsequent siblings)
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:48 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd
Administer some love to the osd_req_decode_sense function
* Fix a bad bug with osd_req_decode_sense(). If there was no scsi
residual, .i.e the request never reached the target, then all the
osd_sense_info members where garbage.
* Add grossly missing in/out_resid to osd_sense_info and fill them in
properly.
* Define an osd_err_priority enum which divides the possible errors into
7 categories in ascending severity. Each category is also assigned a
Linux return code translation.
Analyze the different osd/scsi/block returned errors and set the
proper osd_err_priority and Linux return code accordingly.
* extra check a few situations so not to get stuck with inconsistent
error view. Example an empty residual with an error code, and other
places ...
Lots of libosd's osd_req_decode_sense clients had this logic in some
form or another. Consolidate all these into one place that should
actually know about osd returns. Thous translating it to a more
abstract error.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
drivers/scsi/osd/osd_initiator.c | 85 +++++++++++++++++++++++++++++++++-----
include/scsi/osd_initiator.h | 26 +++++++++++-
2 files changed, 99 insertions(+), 12 deletions(-)
diff --git a/drivers/scsi/osd/osd_initiator.c b/drivers/scsi/osd/osd_initiator.c
index ba25b1e..950202a 100644
--- a/drivers/scsi/osd/osd_initiator.c
+++ b/drivers/scsi/osd/osd_initiator.c
@@ -475,7 +475,8 @@ EXPORT_SYMBOL(osd_end_request);
int osd_execute_request(struct osd_request *or)
{
- return blk_execute_rq(or->request->q, NULL, or->request, 0);
+ return or->async_error =
+ blk_execute_rq(or->request->q, NULL, or->request, 0);
}
EXPORT_SYMBOL(osd_execute_request);
@@ -485,8 +486,12 @@ static void osd_request_async_done(struct request *req, int error)
or->async_error = error;
- if (error)
- OSD_DEBUG("osd_request_async_done error recieved %d\n", error);
+ if (unlikely(error)) {
+ OSD_DEBUG("osd_request_async_done error recieved %d "
+ "errors 0x%x\n", error, req->errors);
+ if (!req->errors) /* don't miss out on this one */
+ req->errors = error;
+ }
if (or->async_done)
or->async_done(or, or->async_private);
@@ -1451,6 +1456,15 @@ int osd_finalize_request(struct osd_request *or,
}
EXPORT_SYMBOL(osd_finalize_request);
+static bool _is_osd_security_code(int code)
+{
+ return (code == osd_security_audit_value_frozen) ||
+ (code == osd_security_working_key_frozen) ||
+ (code == osd_nonce_not_unique) ||
+ (code == osd_nonce_timestamp_out_of_range) ||
+ (code == osd_invalid_dataout_buffer_integrity_check_value);
+}
+
#define OSD_SENSE_PRINT1(fmt, a...) \
do { \
if (__cur_sense_need_output) \
@@ -1473,9 +1487,16 @@ int osd_req_decode_sense_full(struct osd_request *or,
#else
bool __cur_sense_need_output = !silent;
#endif
+ int ret;
- if (!or->request->errors)
+ if (likely(!or->request->errors)) {
+ osi->out_resid = 0;
+ osi->in_resid = 0;
return 0;
+ }
+
+ osi = osi ? : &local_osi;
+ memset(osi, 0, sizeof(*osi));
ssdb = or->request->sense;
sense_len = or->request->sense_len;
@@ -1483,17 +1504,15 @@ int osd_req_decode_sense_full(struct osd_request *or,
OSD_ERR("Block-layer returned error(0x%x) but "
"sense_len(%u) || key(%d) is empty\n",
or->request->errors, sense_len, ssdb->sense_key);
- return -EIO;
+ goto analyze;
}
if ((ssdb->response_code != 0x72) && (ssdb->response_code != 0x73)) {
OSD_ERR("Unrecognized scsi sense: rcode=%x length=%d\n",
ssdb->response_code, sense_len);
- return -EIO;
+ goto analyze;
}
- osi = osi ? : &local_osi;
- memset(osi, 0, sizeof(*osi));
osi->key = ssdb->sense_key;
osi->additional_code = be16_to_cpu(ssdb->additional_sense_code);
original_sense_len = ssdb->additional_sense_length + 8;
@@ -1503,9 +1522,10 @@ int osd_req_decode_sense_full(struct osd_request *or,
__cur_sense_need_output = (osi->key > scsi_sk_recovered_error);
#endif
OSD_SENSE_PRINT1("Main Sense information key=0x%x length(%d, %d) "
- "additional_code=0x%x\n",
+ "additional_code=0x%x async_error=%d errors=0x%x\n",
osi->key, original_sense_len, sense_len,
- osi->additional_code);
+ osi->additional_code, or->async_error,
+ or->request->errors);
if (original_sense_len < sense_len)
sense_len = original_sense_len;
@@ -1637,7 +1657,50 @@ int osd_req_decode_sense_full(struct osd_request *or,
cur_descriptor += cur_len;
}
- return (osi->key > scsi_sk_recovered_error) ? -EIO : 0;
+analyze:
+ if (!osi->key) {
+ /* scsi sense is Empty, the request was never issued to target
+ * linux return code might tell us what happened.
+ */
+ if (or->async_error == -ENOMEM)
+ osi->osd_err_pri = OSD_ERR_PRI_RESOURCE;
+ else
+ osi->osd_err_pri = OSD_ERR_PRI_UNREACHABLE;
+ ret = or->async_error;
+ } else if (osi->key <= scsi_sk_recovered_error) {
+ osi->osd_err_pri = 0;
+ ret = 0;
+ } else if (osi->additional_code == scsi_invalid_field_in_cdb) {
+ if (osi->cdb_field_offset == OSD_CFO_STARTING_BYTE) {
+ osi->osd_err_pri = OSD_ERR_PRI_CLEAR_PAGES;
+ ret = -EFAULT; /* caller should recover from this */
+ } else if (osi->cdb_field_offset == OSD_CFO_OBJECT_ID) {
+ osi->osd_err_pri = OSD_ERR_PRI_NOT_FOUND;
+ ret = -ENOENT;
+ } else if (osi->cdb_field_offset == OSD_CFO_PERMISSIONS) {
+ osi->osd_err_pri = OSD_ERR_PRI_NO_ACCESS;
+ ret = -EACCES;
+ } else {
+ osi->osd_err_pri = OSD_ERR_PRI_BAD_CRED;
+ ret = -EINVAL;
+ }
+ } else if (osi->additional_code == osd_quota_error) {
+ osi->osd_err_pri = OSD_ERR_PRI_NO_SPACE;
+ ret = -ENOSPC;
+ } else if (_is_osd_security_code(osi->additional_code)) {
+ osi->osd_err_pri = OSD_ERR_PRI_BAD_CRED;
+ ret = -EINVAL;
+ } else {
+ osi->osd_err_pri = OSD_ERR_PRI_EIO;
+ ret = -EIO;
+ }
+
+ if (or->out.req)
+ osi->out_resid = or->out.req->resid_len ?: or->out.total_bytes;
+ if (or->in.req)
+ osi->in_resid = or->in.req->resid_len ?: or->in.total_bytes;
+
+ return ret;
}
EXPORT_SYMBOL(osd_req_decode_sense_full);
diff --git a/include/scsi/osd_initiator.h b/include/scsi/osd_initiator.h
index 3ec346e..39d6d10 100644
--- a/include/scsi/osd_initiator.h
+++ b/include/scsi/osd_initiator.h
@@ -267,7 +267,7 @@ int osd_execute_request_async(struct osd_request *or,
* @bad_attr_list - List of failing attributes (optional)
* @max_attr - Size of @bad_attr_list.
*
- * After execution, sense + return code can be analyzed using this function. The
+ * After execution, osd_request results are analyzed using this function. The
* return code is the final disposition on the error. So it is possible that a
* CHECK_CONDITION was returned from target but this will return NO_ERROR, for
* example on recovered errors. All parameters are optional if caller does
@@ -276,7 +276,31 @@ int osd_execute_request_async(struct osd_request *or,
* of the SCSI_OSD_DPRINT_SENSE Kconfig value. Set @silent if you know the
* command would routinely fail, to not spam the dmsg file.
*/
+
+/**
+ * osd_err_priority - osd categorized return codes in ascending severity.
+ *
+ * The categories are borrowed from the pnfs_osd_errno enum.
+ * See comments for translated Linux codes returned by osd_req_decode_sense.
+ */
+enum osd_err_priority {
+ OSD_ERR_PRI_NO_ERROR = 0,
+ /* Recoverable, caller should clear_highpage() all pages */
+ OSD_ERR_PRI_CLEAR_PAGES = 1, /* -EFAULT */
+ OSD_ERR_PRI_RESOURCE = 2, /* -ENOMEM */
+ OSD_ERR_PRI_BAD_CRED = 3, /* -EINVAL */
+ OSD_ERR_PRI_NO_ACCESS = 4, /* -EACCES */
+ OSD_ERR_PRI_UNREACHABLE = 5, /* any other */
+ OSD_ERR_PRI_NOT_FOUND = 6, /* -ENOENT */
+ OSD_ERR_PRI_NO_SPACE = 7, /* -ENOSPC */
+ OSD_ERR_PRI_EIO = 8, /* -EIO */
+};
+
struct osd_sense_info {
+ u64 out_resid; /* Zero on success otherwise out residual */
+ u64 in_resid; /* Zero on success otherwise in residual */
+ enum osd_err_priority osd_err_pri;
+
int key; /* one of enum scsi_sense_keys */
int additional_code ; /* enum osd_additional_sense_codes */
union { /* Sense specific information */
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [PATCH 9/9] osd_protocol.h: Add missing #include
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (7 preceding siblings ...)
2009-11-16 18:48 ` [PATCH 8/9] libosd: Error handling revamped Boaz Harrosh
@ 2009-11-16 18:49 ` Boaz Harrosh
2009-11-16 18:57 ` Martin Michlmayr
2009-11-17 13:50 ` [PATCH 10/10] osduld: No need to use dev_set_drvdata on embedded devices Boaz Harrosh
2009-11-23 16:34 ` [osd-dev] [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
10 siblings, 1 reply; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 18:49 UTC (permalink / raw)
To: James Bottomley, linux-scsi, open-osd; +Cc: Martin Michlmayr
From: Martin Michlmayr <tbm@cyrius.com>
include/scsi/osd_protocol.h uses ALIGN() without an #include
<linux/kernel.h>, leading to:
| include/scsi/osd_protocol.h:362: error: implicit declaration of function 'ALIGN'
Signed-off-by: Martin Michlmayr <tbm@cyrius.com>
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
include/scsi/osd_protocol.h | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h
index 2cc8e8b..6856612 100644
--- a/include/scsi/osd_protocol.h
+++ b/include/scsi/osd_protocol.h
@@ -17,6 +17,7 @@
#define __OSD_PROTOCOL_H__
#include <linux/types.h>
+#include <linux/kernel.h>
#include <asm/unaligned.h>
#include <scsi/scsi.h>
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 9/9] osd_protocol.h: Add missing #include
2009-11-16 18:49 ` [PATCH 9/9] osd_protocol.h: Add missing #include Boaz Harrosh
@ 2009-11-16 18:57 ` Martin Michlmayr
2009-11-16 19:01 ` Boaz Harrosh
0 siblings, 1 reply; 18+ messages in thread
From: Martin Michlmayr @ 2009-11-16 18:57 UTC (permalink / raw)
To: Boaz Harrosh; +Cc: James Bottomley, linux-scsi, open-osd
* Boaz Harrosh <bharrosh@panasas.com> [2009-11-16 20:49]:
> From: Martin Michlmayr <tbm@cyrius.com>
>
> include/scsi/osd_protocol.h uses ALIGN() without an #include
> <linux/kernel.h>, leading to:
> | include/scsi/osd_protocol.h:362: error: implicit declaration of function 'ALIGN'
Note that this patch also has to go into 2.6.32, where OSD currently
builds to build (at least on ARM).
--
Martin Michlmayr
http://www.cyrius.com/
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 9/9] osd_protocol.h: Add missing #include
2009-11-16 18:57 ` Martin Michlmayr
@ 2009-11-16 19:01 ` Boaz Harrosh
2009-11-16 19:09 ` Martin Michlmayr
2009-11-16 20:01 ` James Bottomley
0 siblings, 2 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-16 19:01 UTC (permalink / raw)
To: Martin Michlmayr; +Cc: James Bottomley, linux-scsi, open-osd
On 11/16/2009 08:57 PM, Martin Michlmayr wrote:
> * Boaz Harrosh <bharrosh@panasas.com> [2009-11-16 20:49]:
>> From: Martin Michlmayr <tbm@cyrius.com>
>>
>> include/scsi/osd_protocol.h uses ALIGN() without an #include
>> <linux/kernel.h>, leading to:
>> | include/scsi/osd_protocol.h:362: error: implicit declaration of function 'ALIGN'
>
> Note that this patch also has to go into 2.6.32, where OSD currently
> builds to build (at least on ARM).
OK in that case we need to CC: stable@kernel.org, inside the patch
James could you add it to the patch? Should I re-post?
Thanks
Boaz
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 9/9] osd_protocol.h: Add missing #include
2009-11-16 19:01 ` Boaz Harrosh
@ 2009-11-16 19:09 ` Martin Michlmayr
2009-11-16 20:01 ` James Bottomley
1 sibling, 0 replies; 18+ messages in thread
From: Martin Michlmayr @ 2009-11-16 19:09 UTC (permalink / raw)
To: Boaz Harrosh; +Cc: James Bottomley, linux-scsi, open-osd
> > Note that this patch also has to go into 2.6.32, where OSD currently
> > builds to build (at least on ARM).
>
> OK in that case we need to CC: stable@kernel.org, inside the patch
Why? 2.6.32 is not out yet, so James can simply include this patch in
his tree for Linus and ask him to pull.
--
Martin Michlmayr
http://www.cyrius.com/
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 4/9] osduld: Use device->release instead of internal kref
2009-11-16 18:45 ` [PATCH 4/9] osduld: Use device->release instead of internal kref Boaz Harrosh
@ 2009-11-16 19:52 ` James Bottomley
0 siblings, 0 replies; 18+ messages in thread
From: James Bottomley @ 2009-11-16 19:52 UTC (permalink / raw)
To: Boaz Harrosh; +Cc: linux-scsi, open-osd
On Mon, 2009-11-16 at 20:45 +0200, Boaz Harrosh wrote:
> + dev_set_drvdata(&oud->class_dev, oud);
This is incredibly minor, but since the device is now embedded in oud,
you can simply cast out to get the containing structure:
oud = container_of(dev, struct osd_uld_device, class_dev);
It's not worth redoing the patch set over, but it is worth remembering
for the future.
James
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 9/9] osd_protocol.h: Add missing #include
2009-11-16 19:01 ` Boaz Harrosh
2009-11-16 19:09 ` Martin Michlmayr
@ 2009-11-16 20:01 ` James Bottomley
2009-11-17 7:54 ` Boaz Harrosh
1 sibling, 1 reply; 18+ messages in thread
From: James Bottomley @ 2009-11-16 20:01 UTC (permalink / raw)
To: Boaz Harrosh; +Cc: Martin Michlmayr, linux-scsi, open-osd
On Mon, 2009-11-16 at 21:01 +0200, Boaz Harrosh wrote:
> On 11/16/2009 08:57 PM, Martin Michlmayr wrote:
> > * Boaz Harrosh <bharrosh@panasas.com> [2009-11-16 20:49]:
> >> From: Martin Michlmayr <tbm@cyrius.com>
> >>
> >> include/scsi/osd_protocol.h uses ALIGN() without an #include
> >> <linux/kernel.h>, leading to:
> >> | include/scsi/osd_protocol.h:362: error: implicit declaration of function 'ALIGN'
> >
> > Note that this patch also has to go into 2.6.32, where OSD currently
> > builds to build (at least on ARM).
>
> OK in that case we need to CC: stable@kernel.org, inside the patch
>
> James could you add it to the patch? Should I re-post?
I can add it.
James
^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 9/9] osd_protocol.h: Add missing #include
2009-11-16 20:01 ` James Bottomley
@ 2009-11-17 7:54 ` Boaz Harrosh
0 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-17 7:54 UTC (permalink / raw)
To: James Bottomley; +Cc: Martin Michlmayr, linux-scsi, open-osd
On 11/16/2009 10:01 PM, James Bottomley wrote:
> On Mon, 2009-11-16 at 21:01 +0200, Boaz Harrosh wrote:
>> On 11/16/2009 08:57 PM, Martin Michlmayr wrote:
>>> * Boaz Harrosh <bharrosh@panasas.com> [2009-11-16 20:49]:
>>>> From: Martin Michlmayr <tbm@cyrius.com>
>>>>
>>>> include/scsi/osd_protocol.h uses ALIGN() without an #include
>>>> <linux/kernel.h>, leading to:
>>>> | include/scsi/osd_protocol.h:362: error: implicit declaration of function 'ALIGN'
>>>
>>> Note that this patch also has to go into 2.6.32, where OSD currently
>>> builds to build (at least on ARM).
>>
>> OK in that case we need to CC: stable@kernel.org, inside the patch
>>
>> James could you add it to the patch? Should I re-post?
Sorry, yes you are right.
>
> I can add it.
>
Thanks
> James
>
>
Boaz
^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 10/10] osduld: No need to use dev_set_drvdata on embedded devices
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (8 preceding siblings ...)
2009-11-16 18:49 ` [PATCH 9/9] osd_protocol.h: Add missing #include Boaz Harrosh
@ 2009-11-17 13:50 ` Boaz Harrosh
2009-11-23 16:34 ` [osd-dev] [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-17 13:50 UTC (permalink / raw)
To: James Bottomley, open-osd, linux-scsi
This is a micro optimization patch on cold path code.
Use container_of() on embedded device instead of using
dev_set_drvdata. Also makes code structure more clear.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
---
drivers/scsi/osd/osd_uld.c | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c
index 0484bae..0a90702 100644
--- a/drivers/scsi/osd/osd_uld.c
+++ b/drivers/scsi/osd/osd_uld.c
@@ -246,7 +246,8 @@ struct find_oud_t {
int _mach_odi(struct device *dev, void *find_data)
{
- struct osd_uld_device *oud = dev_get_drvdata(dev);
+ struct osd_uld_device *oud = container_of(dev, struct osd_uld_device,
+ class_dev);
struct find_oud_t *fot = find_data;
const struct osd_dev_info *odi = fot->odi;
@@ -367,7 +368,8 @@ static int __detect_osd(struct osd_uld_device *oud)
static void __remove(struct device *dev)
{
- struct osd_uld_device *oud = dev_get_drvdata(dev);
+ struct osd_uld_device *oud = container_of(dev, struct osd_uld_device,
+ class_dev);
struct scsi_device *scsi_device = oud->od.scsi_device;
kfree(oud->odi.osdname);
@@ -461,7 +463,6 @@ static int osd_probe(struct device *dev)
oud->class_dev.class = &osd_uld_class;
oud->class_dev.parent = dev;
oud->class_dev.release = __remove;
- dev_set_drvdata(&oud->class_dev, oud);
error = dev_set_name(&oud->class_dev, disk->disk_name);
if (error) {
OSD_ERR("dev_set_name failed => %d\n", error);
--
1.6.5.2
^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [osd-dev] [PATCHES 0/9] osd patches for 2.6.33 merge window - resend
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
` (9 preceding siblings ...)
2009-11-17 13:50 ` [PATCH 10/10] osduld: No need to use dev_set_drvdata on embedded devices Boaz Harrosh
@ 2009-11-23 16:34 ` Boaz Harrosh
10 siblings, 0 replies; 18+ messages in thread
From: Boaz Harrosh @ 2009-11-23 16:34 UTC (permalink / raw)
To: James Bottomley, open-osd, linux-scsi
On 11/16/2009 08:37 PM, Boaz Harrosh wrote:
> James hi.
>
> It's getting near the next merge window and none of the osd patches made it
> into scsi-misc yet. I would not like to miss it like last time.
>
James what is the disposition on these patches?
Linus said he's going to release soon.
> All these are exactly as posted in the mailing list, latest version:
>
> [PATCH 1/9] libosd: osd_dev_is_ver1 - Minor API cleanup
> [PATCH 2/9] libosd: osd_sense: OSD_CFO_PERMISSIONS
> [PATCH 3/9] osduld: Ref-counting bug fix
> [PATCH 4/9] osduld: Use device->release instead of internal kref
> [PATCH 5/9] libosd: osd_dev_info: Unique Identification of an OSD device
> [PATCH 6/9] libosd: bug in osd_req_decode_sense_full()
> [PATCH 7/9] libosd: Bugfix of error handling in attributes-list decoding
> [PATCH 8/9] libosd: Error handling revamped
> [PATCH 9/9] osd_protocol.h: Add missing #include
plus this one:
[PATCH 10/10] osduld: No need to use dev_set_drvdata on embedded devices
>
> Thanks
> Boaz
Boaz
^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2009-11-23 16:34 UTC | newest]
Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-11-16 18:37 [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
2009-11-16 18:39 ` [PATCH 1/9] libosd: osd_dev_is_ver1 - Minor API cleanup Boaz Harrosh
2009-11-16 18:41 ` [PATCH 2/9] libosd: osd_sense: OSD_CFO_PERMISSIONS Boaz Harrosh
2009-11-16 18:44 ` [PATCH 3/9] osduld: Ref-counting bug fix Boaz Harrosh
2009-11-16 18:45 ` [PATCH 4/9] osduld: Use device->release instead of internal kref Boaz Harrosh
2009-11-16 19:52 ` James Bottomley
2009-11-16 18:45 ` [PATCH 5/9] libosd: osd_dev_info: Unique Identification of an OSD device Boaz Harrosh
2009-11-16 18:47 ` [PATCH 6/9] libosd: bug in osd_req_decode_sense_full() Boaz Harrosh
2009-11-16 18:47 ` [PATCH 7/9] libosd: Bugfix of error handling in attributes-list decoding Boaz Harrosh
2009-11-16 18:48 ` [PATCH 8/9] libosd: Error handling revamped Boaz Harrosh
2009-11-16 18:49 ` [PATCH 9/9] osd_protocol.h: Add missing #include Boaz Harrosh
2009-11-16 18:57 ` Martin Michlmayr
2009-11-16 19:01 ` Boaz Harrosh
2009-11-16 19:09 ` Martin Michlmayr
2009-11-16 20:01 ` James Bottomley
2009-11-17 7:54 ` Boaz Harrosh
2009-11-17 13:50 ` [PATCH 10/10] osduld: No need to use dev_set_drvdata on embedded devices Boaz Harrosh
2009-11-23 16:34 ` [osd-dev] [PATCHES 0/9] osd patches for 2.6.33 merge window - resend Boaz Harrosh
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox