Messages in this thread | | | Date | Wed, 11 Oct 2006 15:45:01 -0700 | From | Andrew Morton <> | Subject | Re: [PATCH] PNP: handle sysfs errors |
| |
On Wed, 11 Oct 2006 17:51:09 -0400 Jeff Garzik <jeff@garzik.org> wrote:
> + int rc = device_create_file(&dev->dev,&dev_attr_options); > + if (rc) goto err; > + rc = device_create_file(&dev->dev,&dev_attr_resources); > + if (rc) goto err_opt; > + rc = device_create_file(&dev->dev,&dev_attr_id); > + if (rc) goto err_res; > + > return 0; > + > +err_res: > + device_remove_file(&dev->dev,&dev_attr_resources); > +err_opt: > + device_remove_file(&dev->dev,&dev_attr_options); > +err: > + return rc;
That's a common pattern, isn't it?
I wonder if we could create some sort of automatic-unwinding engine:
int pnp_interface_attach_device(struct pnp_dev *dev) { struct unwind_engine *u = NULL; int err;
u = UNWINDABLE(u, err, device_create_file(&dev->dev,&dev_attr_options), device_remove_file, &dev->dev, &dev_attr_options); u = UNWINDABLE(u, err, device_create_file(&dev->dev,&dev_attr_id) device_remove_file, &dev->dev, &dev_attr_options); u = UNWINDABLE(u, err, device_create_file(&dev->dev,&dev_attr_id), device_remove_file, &dev->dev, &dev_attr_id); err = unwind(err, u); return err; }
and, umm,
#define UNWINDABLE(u, err, expr, undo_fn, arg1, arg2) if (err == 0) { err = (expr); if (err == 0) u = add_unwind(u, undo_fn, arg1, arg2); } u;
int unwind(int err, struct unwind_engine *u) { if (err == 0) return 0; for (all entries in u in opposite order) { u->fn(u->arg0, u>arg1); kfree(u); } return err; }
I dunno - probably too crappy to live, but it'd encourage/help people to dtrt. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |