> @@ -310,6 +334,13 @@ int ethnl_set_coalesce(struct sk_buff *skb, struct > genl_info *info) > ret = dev->ethtool_ops->set_coalesce(dev, &coalesce); > if (ret < 0) > goto out_ops; > + > + if (ops->set_ext_coalesce) { > + ret = ops->set_ext_coalesce(dev, &ext_coalesce); > + if (ret < 0) > + goto out_ops; > + } > +
The problem here is, if ops->set_ext_coalesce() fails, you need to undo what dev->ethtool_ops->set_coalesce() did. From the users perspective, this should be atomic. It does everything, or it does nothing and returns an error code. And that is not easy given this structure of two op calls. Andrew