diff mbox series

[net-next,v2,16/31] qeth: use ndo_siocdevprivate

Message ID 20210720144638.2859828-17-arnd@kernel.org
State New
Headers show
Series ndo_ioctl rework | expand

Commit Message

Arnd Bergmann July 20, 2021, 2:46 p.m. UTC
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>

---
 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(-)

-- 
2.29.2

Comments

Julian Wiedmann July 21, 2021, 6:05 a.m. UTC | #1
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.
Arnd Bergmann July 21, 2021, 8:49 a.m. UTC | #2
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 mbox series

Patch

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) ?