* ConfigFS + Target Mode Engine API discussion [not found] ` <20080910233107.GC23864@mail.oracle.com> @ 2008-09-11 1:42 ` Nicholas A. Bellinger 2008-09-11 2:13 ` Joel Becker 0 siblings, 1 reply; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-11 1:42 UTC (permalink / raw) To: Joel Becker; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Wed, 2008-09-10 at 16:31 -0700, Joel Becker wrote: > On Wed, Sep 10, 2008 at 03:59:07PM -0700, Nicholas A. Bellinger wrote: > > Whoops, forgot to CC you boss. :-) > > FYI, I'll be at both KSummit and Plumbers. > > Joel > Great, I look forward to catching up.. :-) Btw, I started working on the target related configfs this past weekend, and stuck on one particular item wrt the API of a target mode fabric plugin with a configfs enabled target engine under $CONFIGFS/target/$FABRIC I am making a default group under $CONFIGFS/target/core that will be used for the generic target engine for storage object registration and device object tuning related to target mode export, etc. From there, I expect the target fabric modules that are being loaded to call the following API routines at modprobe time from a previously allocated struct configfs_subsystem: extern struct config_group *target_fabric_configfs_init (void) { struct configfs_subsystem *subsys; subsys = &target_core_subsystem[0]; return(&subsys->su_group); } extern struct config_group *target_fabric_configfs_register ( struct config_group *su_cg, char *name, struct config_item_type *fabric_cit) { if (!(fabric_cg = kzalloc(struct config_group, GFP_NORMAL))) { printk(KERN_ERR "Unable to allocate fabric_cg\n"); ERR_PTR(-ENOMEM); } config_group_init_type_name(fabric_cg, name, fabric_cit); } So I am thinking about the following question: What would be the preferred method for calling ct_group_ops->make_group() in order to create the $CONFIGFS/target/$FABRIC struct config_item directly from target_fabric_configfs_register() call? From there, the config group hanging off $CONFIGFS/target/$FABRIC will be fabric dependent and providing their own groups, items, depends, from the passed *fabric_cit. How do I "simulate" a mkdir(2) configfs -> make_group() call coming from the fabric module itself..? This would be assuming that both mkdir(2) and rmdir(2) would be *NOT* be able to be called directly on $CONFIGFS/target/$FABRIC, and only the rmmod $FABRIC_MOD will call target_fabric_configfs_unregister() and -> drop_item() to remove the $FABRIC plugin from $CONFIGFS/target/ The configfs enabled generic target engine will need similar functionality to simulate mkdir(2) -> make_group() and rmdir(2) -> drop_item() in order for autoregistration of storage objects using echo $STORAGE_OBJECT > $CONFIGFS/target/$FABRIC/$FABRIC_ENDPOINT/lun_0 to setup the mapping as I envision. Thanks Joel! --nab ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-11 1:42 ` ConfigFS + Target Mode Engine API discussion Nicholas A. Bellinger @ 2008-09-11 2:13 ` Joel Becker 2008-09-11 4:29 ` Nicholas A. Bellinger 0 siblings, 1 reply; 12+ messages in thread From: Joel Becker @ 2008-09-11 2:13 UTC (permalink / raw) To: Nicholas A. Bellinger; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Wed, Sep 10, 2008 at 06:42:46PM -0700, Nicholas A. Bellinger wrote: > So I am thinking about the following question: What would be the > preferred method for calling ct_group_ops->make_group() in order to > create the $CONFIGFS/target/$FABRIC struct config_item directly from > target_fabric_configfs_register() call? From there, the config group > hanging off $CONFIGFS/target/$FABRIC will be fabric dependent and > providing their own groups, items, depends, from the passed *fabric_cit. > How do I "simulate" a mkdir(2) configfs -> make_group() call coming from > the fabric module itself..? This would be assuming that both mkdir(2) That's precisely what you don't do with configfs. It's a defined "not to be done" thing. So there's no preferred way, there's no way at all. What you want do to is drive this from mkdir(). The make_group() will look up the sub-module it needs and return the appropriate item. Joel -- "The lawgiver, of all beings, most owes the law allegiance. He of all men should behave as though the law compelled him. But it is the universal weakness of mankind that what we are given to administer we presently imagine we own." - H.G. Wells Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-11 2:13 ` Joel Becker @ 2008-09-11 4:29 ` Nicholas A. Bellinger 2008-09-11 6:38 ` Joel Becker 0 siblings, 1 reply; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-11 4:29 UTC (permalink / raw) To: Joel Becker; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Wed, 2008-09-10 at 19:13 -0700, Joel Becker wrote: > On Wed, Sep 10, 2008 at 06:42:46PM -0700, Nicholas A. Bellinger wrote: > > So I am thinking about the following question: What would be the > > preferred method for calling ct_group_ops->make_group() in order to > > create the $CONFIGFS/target/$FABRIC struct config_item directly from > > target_fabric_configfs_register() call? From there, the config group > > hanging off $CONFIGFS/target/$FABRIC will be fabric dependent and > > providing their own groups, items, depends, from the passed *fabric_cit. > > How do I "simulate" a mkdir(2) configfs -> make_group() call coming from > > the fabric module itself..? This would be assuming that both mkdir(2) > > That's precisely what you don't do with configfs. It's a > defined "not to be done" thing. So there's no preferred way, there's no > way at all. > What you want do to is drive this from mkdir(). The > make_group() will look up the sub-module it needs and return the > appropriate item. > Whew, good thing I asked about this case first.. :-) Thanks! --nab > Joel > > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-11 4:29 ` Nicholas A. Bellinger @ 2008-09-11 6:38 ` Joel Becker 2008-09-11 8:58 ` Nicholas A. Bellinger 0 siblings, 1 reply; 12+ messages in thread From: Joel Becker @ 2008-09-11 6:38 UTC (permalink / raw) To: Nicholas A. Bellinger; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Wed, Sep 10, 2008 at 09:29:18PM -0700, Nicholas A. Bellinger wrote: > On Wed, 2008-09-10 at 19:13 -0700, Joel Becker wrote: > > On Wed, Sep 10, 2008 at 06:42:46PM -0700, Nicholas A. Bellinger wrote: > > > So I am thinking about the following question: What would be the > > > preferred method for calling ct_group_ops->make_group() in order to > > > create the $CONFIGFS/target/$FABRIC struct config_item directly from > > > target_fabric_configfs_register() call? From there, the config group > > > hanging off $CONFIGFS/target/$FABRIC will be fabric dependent and > > > providing their own groups, items, depends, from the passed *fabric_cit. > > > How do I "simulate" a mkdir(2) configfs -> make_group() call coming from > > > the fabric module itself..? This would be assuming that both mkdir(2) > > > > That's precisely what you don't do with configfs. It's a > > defined "not to be done" thing. So there's no preferred way, there's no > > way at all. > > What you want do to is drive this from mkdir(). The > > make_group() will look up the sub-module it needs and return the > > appropriate item. > > > > Whew, good thing I asked about this case first.. :-) Can you give me a more complete description of what you're trying to do? that way I can maybe help with some suggestions. Joel -- "Win95 file and print sharing are for relatively friendly nets." - Paul Leach, Microsoft Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-11 6:38 ` Joel Becker @ 2008-09-11 8:58 ` Nicholas A. Bellinger 2008-09-12 16:24 ` Nicholas A. Bellinger 2008-09-12 20:15 ` Joel Becker 0 siblings, 2 replies; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-11 8:58 UTC (permalink / raw) To: Joel Becker; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Wed, 2008-09-10 at 23:38 -0700, Joel Becker wrote: > On Wed, Sep 10, 2008 at 09:29:18PM -0700, Nicholas A. Bellinger wrote: > > On Wed, 2008-09-10 at 19:13 -0700, Joel Becker wrote: > > > On Wed, Sep 10, 2008 at 06:42:46PM -0700, Nicholas A. Bellinger wrote: > > > > So I am thinking about the following question: What would be the > > > > preferred method for calling ct_group_ops->make_group() in order to > > > > create the $CONFIGFS/target/$FABRIC struct config_item directly from > > > > target_fabric_configfs_register() call? From there, the config group > > > > hanging off $CONFIGFS/target/$FABRIC will be fabric dependent and > > > > providing their own groups, items, depends, from the passed *fabric_cit. > > > > How do I "simulate" a mkdir(2) configfs -> make_group() call coming from > > > > the fabric module itself..? This would be assuming that both mkdir(2) > > > > > > That's precisely what you don't do with configfs. It's a > > > defined "not to be done" thing. So there's no preferred way, there's no > > > way at all. > > > What you want do to is drive this from mkdir(). The > > > make_group() will look up the sub-module it needs and return the > > > appropriate item. > > > > > > > Whew, good thing I asked about this case first.. :-) > > Can you give me a more complete description of what you're > trying to do? that way I can maybe help with some suggestions. > Sure, the process to get the things up and running would look like: # Load in the generic target's configfs infrastructure modprobe target_core_configfs *) $CONFIGFS/target is created with configfs_register_subsystem() *) $CONFIGFS/target/core is created as a default group under struct configfs_subsystem->su_group to interact with generic target mode engine's storage objects (eg: SCSI HCTL referenced devices, LVM UUID, MD UUID). ........... # Load LIO-Target using function symbols from target_core_configfs modprobe iscsi_target_mod module_init() from iscsi_target_mod (eg: the fabric module) calls target_fabric_configfs_register() in target_core_configfs.ko, which is a small wrapper for calling sys_mkdir($CONFIGFS/target/$FABRIC) to kick off the struct config_group_operations->make_group() to create a struct config_item for /sys/kernel/config/target/iscsi (or whatever the fabric is called). config_item_get() is also called in target_fabric_configfs_register() and returns the newly allocated struct config_item to iscsi_target_mod.ko code to then create new struct config_groups for iSCSI target fabric specific abstractions and LUN mappings between $CONFIGFS/target/core/$STORAGE_OBJECT and Fabric dependent code. I think the latter would be done with symlinks between $FABRIC <-> Generic Target Core Storage Object. Anyways, knowing that make_group() and drop_item() will *NEVER* be called internally clears up alot for me. I will keep working on this setup and let you know if I run into any more head scratchers. Thanks again Joel! --nab ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-11 8:58 ` Nicholas A. Bellinger @ 2008-09-12 16:24 ` Nicholas A. Bellinger 2008-09-12 16:30 ` Nicholas A. Bellinger 2008-09-12 20:15 ` Joel Becker 1 sibling, 1 reply; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-12 16:24 UTC (permalink / raw) To: linux-iscsi-target-dev; +Cc: Joel Becker, linux-scsi, SCST-Devel, LKML On Thu, 2008-09-11 at 01:58 -0700, Nicholas A. Bellinger wrote: > On Wed, 2008-09-10 at 23:38 -0700, Joel Becker wrote: > > On Wed, Sep 10, 2008 at 09:29:18PM -0700, Nicholas A. Bellinger wrote: > > > On Wed, 2008-09-10 at 19:13 -0700, Joel Becker wrote: > > > > On Wed, Sep 10, 2008 at 06:42:46PM -0700, Nicholas A. Bellinger wrote: > > > > > So I am thinking about the following question: What would be the > > > > > preferred method for calling ct_group_ops->make_group() in order to > > > > > create the $CONFIGFS/target/$FABRIC struct config_item directly from > > > > > target_fabric_configfs_register() call? From there, the config group > > > > > hanging off $CONFIGFS/target/$FABRIC will be fabric dependent and > > > > > providing their own groups, items, depends, from the passed *fabric_cit. > > > > > How do I "simulate" a mkdir(2) configfs -> make_group() call coming from > > > > > the fabric module itself..? This would be assuming that both mkdir(2) > > > > > > > > That's precisely what you don't do with configfs. It's a > > > > defined "not to be done" thing. So there's no preferred way, there's no > > > > way at all. > > > > What you want do to is drive this from mkdir(). The > > > > make_group() will look up the sub-module it needs and return the > > > > appropriate item. > > > > > > > > > > Whew, good thing I asked about this case first.. :-) > > > > Can you give me a more complete description of what you're > > trying to do? that way I can maybe help with some suggestions. > > > > Sure, the process to get the things up and running would look like: > > # Load in the generic target's configfs infrastructure > modprobe target_core_configfs > > *) $CONFIGFS/target is created with configfs_register_subsystem() > > *) $CONFIGFS/target/core is created as a default group under struct > configfs_subsystem->su_group to interact with generic target mode > engine's storage objects (eg: SCSI HCTL referenced devices, LVM UUID, MD > UUID). > > ........... > > # Load LIO-Target using function symbols from target_core_configfs > modprobe iscsi_target_mod > > module_init() from iscsi_target_mod (eg: the fabric module) calls > target_fabric_configfs_register() in target_core_configfs.ko, which is a > small wrapper for calling sys_mkdir($CONFIGFS/target/$FABRIC) to kick > off the struct config_group_operations->make_group() to create a struct > config_item for /sys/kernel/config/target/iscsi (or whatever the fabric > is called). > > config_item_get() is also called in target_fabric_configfs_register() > and returns the newly allocated struct config_item to > iscsi_target_mod.ko code to then create new struct config_groups for > iSCSI target fabric specific abstractions and LUN mappings between > $CONFIGFS/target/core/$STORAGE_OBJECT and Fabric dependent code. I think > the latter would be done with symlinks between $FABRIC <-> Generic > Target Core Storage Object. > > Anyways, knowing that make_group() and drop_item() will *NEVER* be > called internally clears up alot for me. I will keep working on this > setup and let you know if I run into any more head scratchers. > > Thanks again Joel! > Hi Joel, After some more thought and a few hours of effort, I was able to get some code up using the model above between a new target_core_configfs.ko and iscsi_target_mod.ko (LIO-Target): http://git.kernel.org/?p=linux/kernel/git/nab/lio-core-2.6.git;a=commit;h=1a48fb089e1ee1cff5ef02b401d365fdf206cf69 The one symbol that I required out of fs/namei.c for vfs_mkdir() that was not available was lookup_hash(), and the symbol is exported in the commit so that drivers/lio-core/transport_core_configfs.c:do_configfs_rmdir() works as expected. There is another version of do_configfs_rmdir() that uses the exported lookup_one_len(), but that one is not working just quite yet. Perhaps there is value in lookup_hash() being defined as EXPORT_SYMBOL_GPL(). Now that the basic configfs structure between a generic engine <-> fabric is in place, the next steps will be to enable the LIO-Target and LIO-Core IOCTLs into make_group() and drop_item() calls. Have a look and let me know what you think.. I will ping you when the first pieces of LIO-Target functionality are up and running.. :-) --nab ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-12 16:24 ` Nicholas A. Bellinger @ 2008-09-12 16:30 ` Nicholas A. Bellinger 0 siblings, 0 replies; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-12 16:30 UTC (permalink / raw) To: linux-iscsi-target-dev; +Cc: Joel Becker, linux-scsi, SCST-Devel, LKML On Fri, 2008-09-12 at 09:24 -0700, Nicholas A. Bellinger wrote: > On Thu, 2008-09-11 at 01:58 -0700, Nicholas A. Bellinger wrote: > > On Wed, 2008-09-10 at 23:38 -0700, Joel Becker wrote: > > > On Wed, Sep 10, 2008 at 09:29:18PM -0700, Nicholas A. Bellinger wrote: > > > > On Wed, 2008-09-10 at 19:13 -0700, Joel Becker wrote: > > > > > On Wed, Sep 10, 2008 at 06:42:46PM -0700, Nicholas A. Bellinger wrote: > > > > > > So I am thinking about the following question: What would be the > > > > > > preferred method for calling ct_group_ops->make_group() in order to > > > > > > create the $CONFIGFS/target/$FABRIC struct config_item directly from > > > > > > target_fabric_configfs_register() call? From there, the config group > > > > > > hanging off $CONFIGFS/target/$FABRIC will be fabric dependent and > > > > > > providing their own groups, items, depends, from the passed *fabric_cit. > > > > > > How do I "simulate" a mkdir(2) configfs -> make_group() call coming from > > > > > > the fabric module itself..? This would be assuming that both mkdir(2) > > > > > > > > > > That's precisely what you don't do with configfs. It's a > > > > > defined "not to be done" thing. So there's no preferred way, there's no > > > > > way at all. > > > > > What you want do to is drive this from mkdir(). The > > > > > make_group() will look up the sub-module it needs and return the > > > > > appropriate item. > > > > > > > > > > > > > Whew, good thing I asked about this case first.. :-) > > > > > > Can you give me a more complete description of what you're > > > trying to do? that way I can maybe help with some suggestions. > > > > > > > Sure, the process to get the things up and running would look like: > > > > # Load in the generic target's configfs infrastructure > > modprobe target_core_configfs > > > > *) $CONFIGFS/target is created with configfs_register_subsystem() > > > > *) $CONFIGFS/target/core is created as a default group under struct > > configfs_subsystem->su_group to interact with generic target mode > > engine's storage objects (eg: SCSI HCTL referenced devices, LVM UUID, MD > > UUID). > > > > ........... > > > > # Load LIO-Target using function symbols from target_core_configfs > > modprobe iscsi_target_mod > > > > module_init() from iscsi_target_mod (eg: the fabric module) calls > > target_fabric_configfs_register() in target_core_configfs.ko, which is a > > small wrapper for calling sys_mkdir($CONFIGFS/target/$FABRIC) to kick > > off the struct config_group_operations->make_group() to create a struct > > config_item for /sys/kernel/config/target/iscsi (or whatever the fabric > > is called). > > > > config_item_get() is also called in target_fabric_configfs_register() > > and returns the newly allocated struct config_item to > > iscsi_target_mod.ko code to then create new struct config_groups for > > iSCSI target fabric specific abstractions and LUN mappings between > > $CONFIGFS/target/core/$STORAGE_OBJECT and Fabric dependent code. I think > > the latter would be done with symlinks between $FABRIC <-> Generic > > Target Core Storage Object. > > > > Anyways, knowing that make_group() and drop_item() will *NEVER* be > > called internally clears up alot for me. I will keep working on this > > setup and let you know if I run into any more head scratchers. > > > > Thanks again Joel! > > > > Hi Joel, > > After some more thought and a few hours of effort, I was able to get > some code up using the model above between a new target_core_configfs.ko > and iscsi_target_mod.ko (LIO-Target): > > http://git.kernel.org/?p=linux/kernel/git/nab/lio-core-2.6.git;a=commit;h=1a48fb089e1ee1cff5ef02b401d365fdf206cf69 > > The one symbol that I required out of fs/namei.c for vfs_mkdir() that This should have been vfs_rmdir().. The commit requires no unexported functions for vfs_mkdir(). --nab > was not available was lookup_hash(), and the symbol is exported in the > commit so that > drivers/lio-core/transport_core_configfs.c:do_configfs_rmdir() works as > expected. There is another version of do_configfs_rmdir() that uses the > exported lookup_one_len(), but that one is not working just quite yet. > Perhaps there is value in lookup_hash() being defined as > EXPORT_SYMBOL_GPL(). > > Now that the basic configfs structure between a generic engine <-> > fabric is in place, the next steps will be to enable the LIO-Target and > LIO-Core IOCTLs into make_group() and drop_item() calls. > > Have a look and let me know what you think.. I will ping you when the > first pieces of LIO-Target functionality are up and running.. > > :-) > > --nab > > > > --~--~---------~--~----~------------~-------~--~----~ > You received this message because you are subscribed to the Google Groups "Linux-iSCSI.org Target Development" group. > To post to this group, send email to linux-iscsi-target-dev@googlegroups.com > To unsubscribe from this group, send email to linux-iscsi-target-dev+unsubscribe@googlegroups.com > For more options, visit this group at http://groups.google.com/group/linux-iscsi-target-dev?hl=en > -~----------~----~----~----~------~----~------~--~--- > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-11 8:58 ` Nicholas A. Bellinger 2008-09-12 16:24 ` Nicholas A. Bellinger @ 2008-09-12 20:15 ` Joel Becker 2008-09-12 22:27 ` Nicholas A. Bellinger 1 sibling, 1 reply; 12+ messages in thread From: Joel Becker @ 2008-09-12 20:15 UTC (permalink / raw) To: Nicholas A. Bellinger; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Thu, Sep 11, 2008 at 01:58:49AM -0700, Nicholas A. Bellinger wrote: > *) $CONFIGFS/target is created with configfs_register_subsystem() > > *) $CONFIGFS/target/core is created as a default group under struct > configfs_subsystem->su_group to interact with generic target mode > engine's storage objects (eg: SCSI HCTL referenced devices, LVM UUID, MD > UUID). > > ........... > > # Load LIO-Target using function symbols from target_core_configfs > modprobe iscsi_target_mod > > module_init() from iscsi_target_mod (eg: the fabric module) calls > target_fabric_configfs_register() in target_core_configfs.ko, which is a > small wrapper for calling sys_mkdir($CONFIGFS/target/$FABRIC) to kick > off the struct config_group_operations->make_group() to create a struct > config_item for /sys/kernel/config/target/iscsi (or whatever the fabric > is called). No, you don't do this. Like I said, configfs clients let userspace create and destroy items. Not kernelspace. Do not call sys_mkdir()/sys_rmdir() from your modules. If you don't do this, you also don't need your lookup_hash() export. Your code should be behaving as if it didn't know the filesystem view existed. I'm trying to understand what you're actually doing. Not the "I want iscsi_target_mod to appear under target/iscsi" part, but why it needs to be there in the first place. how it all connects together. Joel -- "Every new beginning comes from some other beginning's end." Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-12 20:15 ` Joel Becker @ 2008-09-12 22:27 ` Nicholas A. Bellinger 2008-09-13 4:49 ` Joel Becker 0 siblings, 1 reply; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-12 22:27 UTC (permalink / raw) To: Joel Becker; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Fri, 2008-09-12 at 13:15 -0700, Joel Becker wrote: > On Thu, Sep 11, 2008 at 01:58:49AM -0700, Nicholas A. Bellinger wrote: > > *) $CONFIGFS/target is created with configfs_register_subsystem() > > > > *) $CONFIGFS/target/core is created as a default group under struct > > configfs_subsystem->su_group to interact with generic target mode > > engine's storage objects (eg: SCSI HCTL referenced devices, LVM UUID, MD > > UUID). > > > > ........... > > > > # Load LIO-Target using function symbols from target_core_configfs > > modprobe iscsi_target_mod > > > > module_init() from iscsi_target_mod (eg: the fabric module) calls > > target_fabric_configfs_register() in target_core_configfs.ko, which is a > > small wrapper for calling sys_mkdir($CONFIGFS/target/$FABRIC) to kick > > off the struct config_group_operations->make_group() to create a struct > > config_item for /sys/kernel/config/target/iscsi (or whatever the fabric > > is called). > > No, you don't do this. Like I said, configfs clients let > userspace create and destroy items. Not kernelspace. Do not call > sys_mkdir()/sys_rmdir() from your modules. > If you don't do this, you also don't need your lookup_hash() > export. Your code should be behaving as if it didn't know the > filesystem view existed. > I'm trying to understand what you're actually doing. Not the > "I want iscsi_target_mod to appear under target/iscsi" part, but why it > needs to be there in the first place. how it all connects together. > Well, the startup 'fabric registration' is only case where I figured vfs_mkdir($CONFIGFS/target/$FABRIC) being called in order to have the fabric struct config_item appear at modprobe $FABRIC_MOD *BEFORE* the user did anything would be beneficial at all. If vfs_mkdir() was not called from transport_fabric_register_configfs(), it only means user would have call mkdir $CONFIGFS/target/$FABRIC and/or mkdir -p $CONFIGFS/target/$FABRIC/endpoint to kick off one common make_group() for $FABRIC (that lives in target_core_configfs.c) and then make_group() that likes inside of $FABRIC_MOD who's parent is $CONFIGFS/target. In LIO-Target's case, this would be creating a new iSCSI Qualified Name with mkdir $CONFIGFS/target/iscsi/iqn.superturobdiskarry The only real reason I am stuck on this is so that the modprobe $FABRIC does not need to be followed by a user *REQUIRED* mkdir -p $CONFIGFS/target/$FABRIC, before a normal operation like: mkdir $CONFIGFS/target/$FABRIC/endpoint to kick off the expected two make_groups() and the attributes in $CONFIGFS/target/$FABRIC to be possibily tuned *BEFORE* the $FABRIC/$endpoint before the userspace mkdir -p. Which is not a big deal I suppose, as everything will be there after mkdir -p $CONFIGFS/target/iscsi/iqn.superturobdiskarry anyways, but I thought it could be useful. Anyways, once the $FABRIC's struct config_item appears, everything from that point is done in userspace as you (as the configfs author) would expect with configfs structs located in $FABRIC_MOD driven by userspace ops. It is this method of automatic ops at modprobe $FABRIC_MOD for struct config_item's particular struct target_fabric_configfs hanging of the generic target's struct configfs_subsystem where any possible benefit for automation of setup for a configfs enabled Generic Target Engine many lie. Same with the shutdown case for $FABRIC_MOD and calling transport_fabric_deregister_configfs() at rmmod $FABRIC_MID. If vfs_rmdir() was NOT called, the user would be expected to call rmdir $CONFIGFS/target/$FABRIC before rmmod $FABRIC_MOD. It could be thought of as: A special case where vfs_mkdir() or vfs_rmdir() being called in order to create the "multi-module" configfs subsystem containing struct config_item_types() and struct config_*_operations in different kernel modules.. As I don't believe the examples in Documentation/filesystems/configfs or working code in fs/ocfs2/cluster/nodemanager.c have this requirement AFAICT, it could be considered a new use for configfs... :-) I will be working on filling in target-ctl IOCTL parts in iscsi_target_configfs.c, which look like expected configfs (not the special case above) until you get to that other special case mentioned earlier: Wanting to creat a LUN mapping from a storage object from a T10 EVPD Unit Serial to a registered $CONFIGFS/target/$FABRIC/endpoint/lun when the $CONFIGFS/target/core/$T10_EVPD_UNIT_SERIAL does not exist.. Thanks Joel! --nab > Joel > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-12 22:27 ` Nicholas A. Bellinger @ 2008-09-13 4:49 ` Joel Becker 2008-09-13 19:22 ` Nicholas A. Bellinger 0 siblings, 1 reply; 12+ messages in thread From: Joel Becker @ 2008-09-13 4:49 UTC (permalink / raw) To: Nicholas A. Bellinger; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Fri, Sep 12, 2008 at 03:27:57PM -0700, Nicholas A. Bellinger wrote: > On Fri, 2008-09-12 at 13:15 -0700, Joel Becker wrote: > > No, you don't do this. Like I said, configfs clients let > > userspace create and destroy items. Not kernelspace. Do not call > > sys_mkdir()/sys_rmdir() from your modules. > > Well, the startup 'fabric registration' is only case where I figured > vfs_mkdir($CONFIGFS/target/$FABRIC) being called in order to have the > fabric struct config_item appear at modprobe $FABRIC_MOD *BEFORE* the > user did anything would be beneficial at all. If vfs_mkdir() was not > called from transport_fabric_register_configfs(), it only means user > would have call mkdir $CONFIGFS/target/$FABRIC and/or mkdir -p > $CONFIGFS/target/$FABRIC/endpoint to kick off one common make_group() > for $FABRIC (that lives in target_core_configfs.c) and then make_group() > that likes inside of $FABRIC_MOD who's parent is $CONFIGFS/target. In > LIO-Target's case, this would be creating a new iSCSI Qualified Name > with mkdir $CONFIGFS/target/iscsi/iqn.superturobdiskarry I'm still totally unclear as to why $FABRIC has to live under target/. I'm not clear if there can be more than one $FABRIC at a time. etc. That's what I'm trying to understand so I can help you out. Joel -- Life's Little Instruction Book #20 "Be forgiving of yourself and others." Joel Becker Principal Software Developer Oracle E-mail: joel.becker@oracle.com Phone: (650) 506-8127 ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-13 4:49 ` Joel Becker @ 2008-09-13 19:22 ` Nicholas A. Bellinger 2008-09-14 1:56 ` Nicholas A. Bellinger 0 siblings, 1 reply; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-13 19:22 UTC (permalink / raw) To: Joel Becker; +Cc: Linux-iSCSI.org Target Dev, linux-scsi, SCST-Devel On Fri, 2008-09-12 at 21:49 -0700, Joel Becker wrote: > On Fri, Sep 12, 2008 at 03:27:57PM -0700, Nicholas A. Bellinger wrote: > > On Fri, 2008-09-12 at 13:15 -0700, Joel Becker wrote: > > > No, you don't do this. Like I said, configfs clients let > > > userspace create and destroy items. Not kernelspace. Do not call > > > sys_mkdir()/sys_rmdir() from your modules. > > > > Well, the startup 'fabric registration' is only case where I figured > > vfs_mkdir($CONFIGFS/target/$FABRIC) being called in order to have the > > fabric struct config_item appear at modprobe $FABRIC_MOD *BEFORE* the > > user did anything would be beneficial at all. If vfs_mkdir() was not > > called from transport_fabric_register_configfs(), it only means user > > would have call mkdir $CONFIGFS/target/$FABRIC and/or mkdir -p > > $CONFIGFS/target/$FABRIC/endpoint to kick off one common make_group() > > for $FABRIC (that lives in target_core_configfs.c) and then make_group() > > that likes inside of $FABRIC_MOD who's parent is $CONFIGFS/target. In > > LIO-Target's case, this would be creating a new iSCSI Qualified Name > > with mkdir $CONFIGFS/target/iscsi/iqn.superturobdiskarry > > I'm still totally unclear as to why $FABRIC has to live under > target/. Well, I figured that since $FABRIC would be depending upon LUN mappings to target/core/$STORAGE_OBJECT struct config_items , it would make sense sense for $FABRIC to appear under a common target mode engine.. Having $CONFIGFS/target/core for storage objects and $CONFIG/$FABRIC/endpoint/lun_0 and setting up symlinks between the two entities is what I think you have in mind. This setup you mention may have other advantages/disadvantages when it goes to a generic target mode, but I have been focused on getting the initial setup (see below..) up and running, sooo.. :-) Obviously if things can be done easier I am all for it. Also I think for debugging and [PROC,IOCTL] -> ConfigFS conversion purposes, being able to call my do_configfs_[mkdir,rmdir] wrappers when existing legacy target functionality get called to add/remove the ConfigFS entries may have some value as well.. At least to make it easier for kernel level $FABRIC_MOD maintainers to see how generic kernel target mode configfs works... Just wanted to mention that.. > I'm not clear if there can be more than one $FABRIC at a time. Absoulutely. Current each $FABRIC_MOD that registers itself with the common target engine calls the target_fabric_configfs_register() that creates its own struct config_group with fabric dependent configfs ops/abstractions. This could very well be hidden behind the actual non configfs related target engine infrastructure when $FABRIC_MOD does actual fabric registration. Also having common code for $FABRIC_MOD to use to allow those LUN mappings across multiple independent $FABRIC_MODs from target/core/$STORAGE_OBJECT is the main idea, but point taken that $FABRIC does not necessary need to be hanging directly off $CONFIGS/target to function.. Also why I think having $FABRIC under $CONFIGFS/target/ makes sense, I would like to be able to do rm -rf $CONFIGFS/target to shutdown all LUN mappings on all fabrics on all storage objects instead of rm -rf $CONFIGFS/iscsi ; rm -rf $CONFIGFS/sas ; rm -rf $CONFIGFS/pscsi ; rm -rf $CONFIGFS/target.. :-) > etc. That's what I'm trying to understand so I can help you out. > :-) So, as of this morning I have basic iqn.foo/tpgt_1 ConfigFS functionality for LIO-Target.. Here is what it looks like.. <snip> # Create some target:/sys/kernel/config/target/iscsi# mkdir -p iqn.iscsi-hd.renderbox/tpgt_1 target:/sys/kernel/config/target/iscsi# mkdir -p iqn.lio-production/tpgt_1 target:/sys/kernel/config/target/iscsi# mkdir -p iqn.upstreamtargetmodestorage/tpgt_1 target:/sys/kernel/config/target/iscsi# mkdir -p iqn.superturbodiskarray/tpgt_1 target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 target:/sys/kernel/config/target/iscsi# tree . |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.11c045e90b | `-- tpgt_1 |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.acc810f5a2fc | `-- tpgt_1 |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.b341232f3595 | `-- tpgt_1 |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.b5ada4ff123a | `-- tpgt_1 |-- iqn.iscsi-hd.renderbox | `-- tpgt_1 |-- iqn.lio-production | `-- tpgt_1 |-- iqn.superturbodiskarray | `-- tpgt_1 |-- iqn.upstreamtargetmodestorage | `-- tpgt_1 `-- lio_version 16 directories, 1 file # Notice the module count.. target:/sys/kernel/config/target/iscsi# lsmod Module Size Used by iscsi_target_mod 369004 17 target_core_configfs 11416 18 iscsi_target_mod configfs 24216 3 iscsi_target_mod,target_core_configfs # Delete the IQNs and TPGTs created with /sbin/iscsi-name prefix.. target:/sys/kernel/config/target/iscsi# rm -rf iqn.2003-01.org.linux-iscsi.target.i686\:sn.* target:/sys/kernel/config/target/iscsi# tree . |-- iqn.iscsi-hd.renderbox | `-- tpgt_1 |-- iqn.lio-production | `-- tpgt_1 |-- iqn.superturbodiskarray | `-- tpgt_1 |-- iqn.upstreamtargetmodestorage | `-- tpgt_1 `-- lio_version 8 directories, 1 file # And the module counts.. target:/sys/kernel/config/target/iscsi# lsmod Module Size Used by iscsi_target_mod 369004 9 target_core_configfs 11416 10 iscsi_target_mod configfs 24216 3 iscsi_target_mod,target_core_configfs --nab :-) > Joel > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: ConfigFS + Target Mode Engine API discussion 2008-09-13 19:22 ` Nicholas A. Bellinger @ 2008-09-14 1:56 ` Nicholas A. Bellinger 0 siblings, 0 replies; 12+ messages in thread From: Nicholas A. Bellinger @ 2008-09-14 1:56 UTC (permalink / raw) To: linux-iscsi-target-dev; +Cc: Joel Becker, linux-scsi, SCST-Devel, LKML On Sat, 2008-09-13 at 12:22 -0700, Nicholas A. Bellinger wrote: > On Fri, 2008-09-12 at 21:49 -0700, Joel Becker wrote: > > On Fri, Sep 12, 2008 at 03:27:57PM -0700, Nicholas A. Bellinger wrote: > > > On Fri, 2008-09-12 at 13:15 -0700, Joel Becker wrote: > > > > No, you don't do this. Like I said, configfs clients let > > > > userspace create and destroy items. Not kernelspace. Do not call > > > > sys_mkdir()/sys_rmdir() from your modules. > > > > > > Well, the startup 'fabric registration' is only case where I figured > > > vfs_mkdir($CONFIGFS/target/$FABRIC) being called in order to have the > > > fabric struct config_item appear at modprobe $FABRIC_MOD *BEFORE* the > > > user did anything would be beneficial at all. If vfs_mkdir() was not > > > called from transport_fabric_register_configfs(), it only means user > > > would have call mkdir $CONFIGFS/target/$FABRIC and/or mkdir -p > > > $CONFIGFS/target/$FABRIC/endpoint to kick off one common make_group() > > > for $FABRIC (that lives in target_core_configfs.c) and then make_group() > > > that likes inside of $FABRIC_MOD who's parent is $CONFIGFS/target. In > > > LIO-Target's case, this would be creating a new iSCSI Qualified Name > > > with mkdir $CONFIGFS/target/iscsi/iqn.superturobdiskarry > > > > I'm still totally unclear as to why $FABRIC has to live under > > target/. > > Well, I figured that since $FABRIC would be depending upon LUN mappings > to target/core/$STORAGE_OBJECT struct config_items , it would make sense > sense for $FABRIC to appear under a common target mode engine.. > > Having $CONFIGFS/target/core for storage objects and > $CONFIG/$FABRIC/endpoint/lun_0 and setting up symlinks between the two > entities is what I think you have in mind. This setup you mention may > have other advantages/disadvantages when it goes to a generic target > mode, but I have been focused on getting the initial setup (see below..) > up and running, sooo.. :-) Obviously if things can be done easier I am > all for it. Also I think for debugging and [PROC,IOCTL] -> ConfigFS > conversion purposes, being able to call my do_configfs_[mkdir,rmdir] > wrappers when existing legacy target functionality get called to > add/remove the ConfigFS entries may have some value as well.. At least > to make it easier for kernel level $FABRIC_MOD maintainers to see how > generic kernel target mode configfs works... Just wanted to mention > that.. > > > I'm not clear if there can be more than one $FABRIC at a time. > > Absoulutely. Current each $FABRIC_MOD that registers itself with the > common target engine calls the target_fabric_configfs_register() that > creates its own struct config_group with fabric dependent configfs > ops/abstractions. This could very well be hidden behind the actual non > configfs related target engine infrastructure when $FABRIC_MOD does > actual fabric registration. Also having common code for $FABRIC_MOD to > use to allow those LUN mappings across multiple independent $FABRIC_MODs > from target/core/$STORAGE_OBJECT is the main idea, but point taken that > $FABRIC does not necessary need to be hanging directly off > $CONFIGS/target to function.. > > Also why I think having $FABRIC under $CONFIGFS/target/ makes sense, I > would like to be able to do rm -rf $CONFIGFS/target to shutdown all LUN > mappings on all fabrics on all storage objects instead of rm -rf > $CONFIGFS/iscsi ; rm -rf $CONFIGFS/sas ; rm -rf $CONFIGFS/pscsi ; rm -rf > $CONFIGFS/target.. :-) > > > etc. That's what I'm trying to understand so I can help you out. > > > > :-) > > So, as of this morning I have basic iqn.foo/tpgt_1 ConfigFS > functionality for LIO-Target.. Here is what it looks like.. > > <snip> > > # Create some > > target:/sys/kernel/config/target/iscsi# mkdir -p iqn.iscsi-hd.renderbox/tpgt_1 > target:/sys/kernel/config/target/iscsi# mkdir -p iqn.lio-production/tpgt_1 > target:/sys/kernel/config/target/iscsi# mkdir -p iqn.upstreamtargetmodestorage/tpgt_1 > target:/sys/kernel/config/target/iscsi# mkdir -p iqn.superturbodiskarray/tpgt_1 > target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 > target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 > target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 > target:/sys/kernel/config/target/iscsi# mkdir -p `iscsi-name`/tpgt_1 > target:/sys/kernel/config/target/iscsi# tree > . > |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.11c045e90b > | `-- tpgt_1 > |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.acc810f5a2fc > | `-- tpgt_1 > |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.b341232f3595 > | `-- tpgt_1 > |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.b5ada4ff123a > | `-- tpgt_1 > |-- iqn.iscsi-hd.renderbox > | `-- tpgt_1 > |-- iqn.lio-production > | `-- tpgt_1 > |-- iqn.superturbodiskarray > | `-- tpgt_1 > |-- iqn.upstreamtargetmodestorage > | `-- tpgt_1 > `-- lio_version > > 16 directories, 1 file > > # Notice the module count.. > target:/sys/kernel/config/target/iscsi# lsmod > Module Size Used by > iscsi_target_mod 369004 17 > target_core_configfs 11416 18 iscsi_target_mod > configfs 24216 3 iscsi_target_mod,target_core_configfs > > # Delete the IQNs and TPGTs created with /sbin/iscsi-name prefix.. > target:/sys/kernel/config/target/iscsi# rm -rf iqn.2003-01.org.linux-iscsi.target.i686\:sn.* > > target:/sys/kernel/config/target/iscsi# tree > . > |-- iqn.iscsi-hd.renderbox > | `-- tpgt_1 > |-- iqn.lio-production > | `-- tpgt_1 > |-- iqn.superturbodiskarray > | `-- tpgt_1 > |-- iqn.upstreamtargetmodestorage > | `-- tpgt_1 > `-- lio_version > > 8 directories, 1 file > > # And the module counts.. > target:/sys/kernel/config/target/iscsi# lsmod > Module Size Used by > iscsi_target_mod 369004 9 > target_core_configfs 11416 10 iscsi_target_mod > configfs 24216 3 iscsi_target_mod,target_core_configfs > Ok, just commited first working code for ops for targetname, target portal group and Network Portal <-> target portal group logic under $CONFIGFS/target/iscsi/$IQN/ Here is what it looks like: export CONFIGFS=/sys/kernel/config/ export FABRIC=/sys/kernel/config/target/iscsi # Create four iSCSI Target Nodes with Target Portal Group Tag: 1 target:/# mkdir -p $FABRIC/`iscsi-name`/tpgt_1 target:/# mkdir -p $FABRIC/`iscsi-name`/tpgt_1 target:/# mkdir -p $FABRIC/`iscsi-name`/tpgt_1 target:/# mkdir -p $FABRIC/`iscsi-name`/tpgt_1 target:/# cd $CONFIGFS target:/sys/kernel/config# tree . `-- target |-- iscsi | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.4b471a663865 | | `-- tpgt_1 | | |-- lun | | `-- np | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.60a44da1dea | | `-- tpgt_1 | | |-- lun | | `-- np | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.7c988087f45c | | `-- tpgt_1 | | |-- lun | | `-- np | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.ed63ac2a3da7 | | `-- tpgt_1 | | |-- lun | | `-- np | `-- lio_version `-- version 18 directories, 2 files # Create some iSCSI network portals on the first two targetname+tpgt tuples target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.4b471a663865/tpgt_1/np/172.16.201.137:3260 target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.4b471a663865/tpgt_1/np/172.16.201.137:3261 target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.4b471a663865/tpgt_1/np/172.16.201.137:3262 target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.4b471a663865/tpgt_1/np/172.16.201.137:3263 target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.60a44da1dea/tpgt_1/np/172.16.201.137:3260 target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.60a44da1dea/tpgt_1/np/172.16.201.137:3261 target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.60a44da1dea/tpgt_1/np/172.16.201.137:3262 target:/sys/kernel/config# mkdir target/iscsi/iqn.2003-01.org.linux-iscsi.target.i686\:sn.60a44da1dea/tpgt_1/np/172.16.201.137:3263 target:/sys/kernel/config# tree . `-- target |-- iscsi | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.4b471a663865 | | `-- tpgt_1 | | |-- lun | | `-- np | | |-- 172.16.201.137:3260 | | | `-- portal_info | | |-- 172.16.201.137:3261 | | | `-- portal_info | | |-- 172.16.201.137:3262 | | | `-- portal_info | | `-- 172.16.201.137:3263 | | `-- portal_info | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.60a44da1dea | | `-- tpgt_1 | | |-- lun | | `-- np | | |-- 172.16.201.137:3260 | | | `-- portal_info | | |-- 172.16.201.137:3261 | | | `-- portal_info | | |-- 172.16.201.137:3262 | | | `-- portal_info | | `-- 172.16.201.137:3263 | | `-- portal_info | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.7c988087f45c | | `-- tpgt_1 | | |-- lun | | `-- np | |-- iqn.2003-01.org.linux-iscsi.target.i686:sn.ed63ac2a3da7 | | `-- tpgt_1 | | |-- lun | | `-- np | `-- lio_version `-- version 26 directories, 10 files Here is the commit: http://git.kernel.org/?p=linux/kernel/git/nab/lio-core-2.6.git;a=commit;h=4098f1bcbe8406b882c4e265427f54a35f3c8b40 --nab ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2008-09-14 1:56 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1221087547.27831.165.camel@haakon2.linux-iscsi.org>
[not found] ` <20080910233107.GC23864@mail.oracle.com>
2008-09-11 1:42 ` ConfigFS + Target Mode Engine API discussion Nicholas A. Bellinger
2008-09-11 2:13 ` Joel Becker
2008-09-11 4:29 ` Nicholas A. Bellinger
2008-09-11 6:38 ` Joel Becker
2008-09-11 8:58 ` Nicholas A. Bellinger
2008-09-12 16:24 ` Nicholas A. Bellinger
2008-09-12 16:30 ` Nicholas A. Bellinger
2008-09-12 20:15 ` Joel Becker
2008-09-12 22:27 ` Nicholas A. Bellinger
2008-09-13 4:49 ` Joel Becker
2008-09-13 19:22 ` Nicholas A. Bellinger
2008-09-14 1:56 ` Nicholas A. Bellinger
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox