On Wed, 2006-03-08 at 18:32 -0800, chandra seetharaman wrote:
> >
> > A solution would probably involve making rcfs or configfs hold
> > refcounts for every object that's accessible through the filesystem,
> > and not drop them until the object is no longer accessible.
>
> hmm.. My understanding was that configfs holds a reference to the item
> for each invocation (under the item) and the release function of the
> group (which leads to removal of class) is called only when the last
> reference is dropped (not when a rmdir is invoked). Will look at it
> closely.
>
I was right in my understanding that configfs protects the item. But the
usage in rcfs is slightly wrong :)...
Try the attached patch and let me know how it goes.
Ideally, we do not need taskclass_release_group(), but there seems to
some problem, so i added it. i need to locate it (as of now it looks
like it is in configfs, but it might very well be my usage).
fs/rcfs/rcfs.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
Index: linux-2.6.15/fs/rcfs/rcfs.c
===================================================================
--- linux-2.6.15.orig/fs/rcfs/rcfs.c
+++ linux-2.6.15/fs/rcfs/rcfs.c
@@ -34,8 +34,10 @@ static struct config_group *taskclass_ma
const char *);
static void taskclass_release_group(struct config_group *,
struct config_item *);
+static void taskclass_release_item(struct config_item *);
static struct configfs_item_operations taskclass_item_ops = {
+ .release = taskclass_release_item,
.show_attribute = rcfs_attr_show,
.store_attribute = rcfs_attr_store,
};
@@ -200,21 +202,25 @@ noclass:
}
static void
-taskclass_release_group(struct config_group *group, struct config_item *item)
+taskclass_release_item(struct config_item *item)
{
- /* Parameter "item" is the victim and "group" is its parent */
struct rcfs_class *class = rcfs_class_item(item);
- struct rcfs_class *parent = rcfs_class_group(group);
- BUG_ON(!parent || !class->core);
+ BUG_ON(!class->core);
ckrm_free_class(class->core);
kfree(class->name);
kfree(class);
- config_item_put(item);
return;
}
+static void
+taskclass_release_group(struct config_group *group, struct config_item *item)
+{
+ config_item_put(item);
+ config_item_put(&group->cg_item);
+}
+
static int
rcfs_init_attr_arrays(void)
{
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
ckrm-tech mailing list
https://lists.sourceforge.net/lists/listinfo/ckrm-tech