Message ID | 20210720144638.2859828-17-arnd@kernel.org |
---|---|
State | New |
Headers | show |
Series | ndo_ioctl rework | expand |
On 20.07.21 17:46, Arnd Bergmann wrote: > From: Arnd Bergmann <arnd@arndb.de> > > qeth has both standard MII ioctls and custom SIOCDEVPRIVATE ones, > all of which work correctly with compat user space. > > Move the private ones over to the new ndo_siocdevprivate callback. > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- your get_maintainers scripting seems broken, adding the usual suspects. > drivers/s390/net/qeth_core.h | 5 ++++- > drivers/s390/net/qeth_core_main.c | 35 ++++++++++++++++++++++--------- > drivers/s390/net/qeth_l3_main.c | 6 +++--- > 3 files changed, 32 insertions(+), 14 deletions(-) > > diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h > index f4d554ea0c93..89fd7432dbec 100644 > --- a/drivers/s390/net/qeth_core.h > +++ b/drivers/s390/net/qeth_core.h > @@ -790,7 +790,8 @@ struct qeth_discipline { > void (*remove) (struct ccwgroup_device *); > int (*set_online)(struct qeth_card *card, bool carrier_ok); > void (*set_offline)(struct qeth_card *card); > - int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd); > + int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, > + void __user *data, int cmd); > int (*control_event_handler)(struct qeth_card *card, > struct qeth_ipa_cmd *cmd); > }; > @@ -1124,6 +1125,8 @@ int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, > unsigned int offset, unsigned int hd_len, > int elements_needed); > int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); > +int qeth_siocdevprivate(struct net_device *dev, struct ifreq *rq, > + void __user *data, int cmd); > void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...); > int qeth_configure_cq(struct qeth_card *, enum qeth_cq); > int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action); > diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c > index 62f88ccbd03f..be19cfd05136 100644 > --- a/drivers/s390/net/qeth_core_main.c > +++ b/drivers/s390/net/qeth_core_main.c > @@ -6672,21 +6672,42 @@ struct qeth_card *qeth_get_card_by_busid(char *bus_id) > } > EXPORT_SYMBOL_GPL(qeth_get_card_by_busid); > > -int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) > +int qeth_siocdevprivate(struct net_device *dev, struct ifreq *rq, void __user *data, int cmd) > { > struct qeth_card *card = dev->ml_priv; > - struct mii_ioctl_data *mii_data; > int rc = 0; > > switch (cmd) { > case SIOC_QETH_ADP_SET_SNMP_CONTROL: > - rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); > + rc = qeth_snmp_command(card, data); > break; > case SIOC_QETH_GET_CARD_TYPE: > if ((IS_OSD(card) || IS_OSM(card) || IS_OSX(card)) && > !IS_VM_NIC(card)) > return 1; > return 0; > + case SIOC_QETH_QUERY_OAT: > + rc = qeth_query_oat_command(card, data); > + break; > + default: > + if (card->discipline->do_ioctl) > + rc = card->discipline->do_ioctl(dev, rq, data, cmd); > + else > + rc = -EOPNOTSUPP; > + } > + if (rc) > + QETH_CARD_TEXT_(card, 2, "ioce%x", rc); > + return rc; > +} > +EXPORT_SYMBOL_GPL(qeth_siocdevprivate); > + Looks like you missed to wire this up in our netdev_ops structs.
On Wed, Jul 21, 2021 at 8:06 AM Julian Wiedmann <jwi@linux.ibm.com> wrote: > > On 20.07.21 17:46, Arnd Bergmann wrote: > > From: Arnd Bergmann <arnd@arndb.de> > > > > qeth has both standard MII ioctls and custom SIOCDEVPRIVATE ones, > > all of which work correctly with compat user space. > > > > Move the private ones over to the new ndo_siocdevprivate callback. > > > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > --- > > your get_maintainers scripting seems broken, adding the usual suspects. Right, I ran the wrong script for sending. > > -int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) > > +int qeth_siocdevprivate(struct net_device *dev, struct ifreq *rq, void __user *data, int cmd) > > { > > struct qeth_card *card = dev->ml_priv; > > - struct mii_ioctl_data *mii_data; > > int rc = 0; > > > > switch (cmd) { > > case SIOC_QETH_ADP_SET_SNMP_CONTROL: > > - rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); > > + rc = qeth_snmp_command(card, data); > > break; > > case SIOC_QETH_GET_CARD_TYPE: > > if ((IS_OSD(card) || IS_OSM(card) || IS_OSX(card)) && > > !IS_VM_NIC(card)) > > return 1; > > return 0; > > + case SIOC_QETH_QUERY_OAT: > > + rc = qeth_query_oat_command(card, data); > > + break; > > + default: > > + if (card->discipline->do_ioctl) > > + rc = card->discipline->do_ioctl(dev, rq, data, cmd); > > + else > > + rc = -EOPNOTSUPP; > > + } > > + if (rc) > > + QETH_CARD_TEXT_(card, 2, "ioce%x", rc); > > + return rc; > > +} > > +EXPORT_SYMBOL_GPL(qeth_siocdevprivate); > > + > > Looks like you missed to wire this up in our netdev_ops structs. Fixed now, thanks! I've gone through the other patches as well to see if I made the same mistake elsewhere, but it appears this one was the only time here. Arnd
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index f4d554ea0c93..89fd7432dbec 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h @@ -790,7 +790,8 @@ struct qeth_discipline { void (*remove) (struct ccwgroup_device *); int (*set_online)(struct qeth_card *card, bool carrier_ok); void (*set_offline)(struct qeth_card *card); - int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, int cmd); + int (*do_ioctl)(struct net_device *dev, struct ifreq *rq, + void __user *data, int cmd); int (*control_event_handler)(struct qeth_card *card, struct qeth_ipa_cmd *cmd); }; @@ -1124,6 +1125,8 @@ int qeth_do_send_packet(struct qeth_card *card, struct qeth_qdio_out_q *queue, unsigned int offset, unsigned int hd_len, int elements_needed); int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); +int qeth_siocdevprivate(struct net_device *dev, struct ifreq *rq, + void __user *data, int cmd); void qeth_dbf_longtext(debug_info_t *id, int level, char *text, ...); int qeth_configure_cq(struct qeth_card *, enum qeth_cq); int qeth_hw_trap(struct qeth_card *, enum qeth_diags_trap_action); diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 62f88ccbd03f..be19cfd05136 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c @@ -6672,21 +6672,42 @@ struct qeth_card *qeth_get_card_by_busid(char *bus_id) } EXPORT_SYMBOL_GPL(qeth_get_card_by_busid); -int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +int qeth_siocdevprivate(struct net_device *dev, struct ifreq *rq, void __user *data, int cmd) { struct qeth_card *card = dev->ml_priv; - struct mii_ioctl_data *mii_data; int rc = 0; switch (cmd) { case SIOC_QETH_ADP_SET_SNMP_CONTROL: - rc = qeth_snmp_command(card, rq->ifr_ifru.ifru_data); + rc = qeth_snmp_command(card, data); break; case SIOC_QETH_GET_CARD_TYPE: if ((IS_OSD(card) || IS_OSM(card) || IS_OSX(card)) && !IS_VM_NIC(card)) return 1; return 0; + case SIOC_QETH_QUERY_OAT: + rc = qeth_query_oat_command(card, data); + break; + default: + if (card->discipline->do_ioctl) + rc = card->discipline->do_ioctl(dev, rq, data, cmd); + else + rc = -EOPNOTSUPP; + } + if (rc) + QETH_CARD_TEXT_(card, 2, "ioce%x", rc); + return rc; +} +EXPORT_SYMBOL_GPL(qeth_siocdevprivate); + +int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +{ + struct qeth_card *card = dev->ml_priv; + struct mii_ioctl_data *mii_data; + int rc = 0; + + switch (cmd) { case SIOCGMIIPHY: mii_data = if_mii(rq); mii_data->phy_id = 0; @@ -6699,14 +6720,8 @@ int qeth_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) mii_data->val_out = qeth_mdio_read(dev, mii_data->phy_id, mii_data->reg_num); break; - case SIOC_QETH_QUERY_OAT: - rc = qeth_query_oat_command(card, rq->ifr_ifru.ifru_data); - break; default: - if (card->discipline->do_ioctl) - rc = card->discipline->do_ioctl(dev, rq, cmd); - else - rc = -EOPNOTSUPP; + return -EOPNOTSUPP; } if (rc) QETH_CARD_TEXT_(card, 2, "ioce%x", rc); diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c index f0d6f205c53c..71778b6076bd 100644 --- a/drivers/s390/net/qeth_l3_main.c +++ b/drivers/s390/net/qeth_l3_main.c @@ -1512,7 +1512,7 @@ static int qeth_l3_arp_flush_cache(struct qeth_card *card) return rc; } -static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, void __user *data, int cmd) { struct qeth_card *card = dev->ml_priv; struct qeth_arp_cache_entry arp_entry; @@ -1532,13 +1532,13 @@ static int qeth_l3_do_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) rc = -EPERM; break; } - rc = qeth_l3_arp_query(card, rq->ifr_ifru.ifru_data); + rc = qeth_l3_arp_query(card, data); break; case SIOC_QETH_ARP_ADD_ENTRY: case SIOC_QETH_ARP_REMOVE_ENTRY: if (!capable(CAP_NET_ADMIN)) return -EPERM; - if (copy_from_user(&arp_entry, rq->ifr_data, sizeof(arp_entry))) + if (copy_from_user(&arp_entry, data, sizeof(arp_entry))) return -EFAULT; arp_cmd = (cmd == SIOC_QETH_ARP_ADD_ENTRY) ?