[Devel] [PATCH rhel7] fix userspace if_tun.h compilation
Konstantin Khorenko
khorenko at virtuozzo.com
Wed Nov 11 06:47:22 PST 2015
Andrey, please review.
--
Best regards,
Konstantin Khorenko,
Virtuozzo Linux Kernel Team
On 11/11/2015 01:00 PM, Vladimir Sementsov-Ogievskiy wrote:
> Patch b59e089eb2d : "ve/net: introduce TAP accounting" uses IFNAMSIZ
> in if_tun.h and it can't be compiled in userspace.
>
> This patch fixes it and also use more common approach of sending data
> to tun ioctl, without additional structure.
>
> #PSBM-40629:fixed
>
> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov at virtuozzo.com>
> ---
> drivers/net/tun.c | 16 ++++++----------
> include/uapi/linux/if.h | 2 ++
> include/uapi/linux/if_tun.h | 8 +-------
> 3 files changed, 9 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index 779d73c..dd14140 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
> @@ -1921,17 +1921,12 @@ unlock:
>
> #ifdef CONFIG_VE_TUNTAP_ACCOUNTING
> /* setacctid_ioctl should be called under rtnl_lock */
> -static long setacctid_ioctl(struct file *file, void __user *argp)
> +static int tun_set_acctid(struct net *net, struct ifreq *ifr)
> {
> - struct tun_file *tfile = file->private_data;
> - struct tun_acctid info;
> struct net_device *dev;
> struct tun_struct *tun;
>
> - if (copy_from_user(&info, argp, sizeof(info)))
> - return -EFAULT;
> -
> - dev = __dev_get_by_name(tfile->net, info.ifname);
> + dev = __dev_get_by_name(net, ifr->ifr_name);
> if (dev == NULL)
> return -ENOENT;
>
> @@ -1943,7 +1938,7 @@ static long setacctid_ioctl(struct file *file, void __user *argp)
> if (tun->vestat) {
> venet_acct_put_stat(tun->vestat);
> }
> - tun->vestat = venet_acct_find_create_stat(info.acctid);
> + tun->vestat = venet_acct_find_create_stat(ifr->ifr_acctid);
> if (tun->vestat == NULL)
> return -ENOMEM;
>
> @@ -1965,7 +1960,8 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
> unsigned int ifindex;
> int ret;
>
> - if (cmd == TUNSETIFF || cmd == TUNSETQUEUE || _IOC_TYPE(cmd) == 0x89) {
> + if (cmd == TUNSETIFF || cmd == TUNSETQUEUE || cmd == TUNSETACCTID ||
> + _IOC_TYPE(cmd) == 0x89) {
> if (copy_from_user(&ifr, argp, ifreq_len))
> return -EFAULT;
> } else {
> @@ -1986,7 +1982,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,
>
> #ifdef CONFIG_VE_TUNTAP_ACCOUNTING
> if (cmd == TUNSETACCTID) {
> - ret = setacctid_ioctl(file, argp);
> + ret = tun_set_acctid(tfile->net, &ifr);
> goto unlock;
> }
> #endif /* CONFIG_VE_TUNTAP_ACCOUNTING */
> diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
> index 1ec407b..b0c8933 100644
> --- a/include/uapi/linux/if.h
> +++ b/include/uapi/linux/if.h
> @@ -194,6 +194,7 @@ struct ifreq {
> char ifru_newname[IFNAMSIZ];
> void __user * ifru_data;
> struct if_settings ifru_settings;
> + unsigned ifru_acctid;
> } ifr_ifru;
> };
>
> @@ -214,6 +215,7 @@ struct ifreq {
> #define ifr_qlen ifr_ifru.ifru_ivalue /* Queue length */
> #define ifr_newname ifr_ifru.ifru_newname /* New name */
> #define ifr_settings ifr_ifru.ifru_settings /* Device/proto settings*/
> +#define ifr_acctid ifr_ifru.ifru_acctid /* New ve accounting identifier */
>
> /*
> * Structure used in SIOCGIFCONF request.
> diff --git a/include/uapi/linux/if_tun.h b/include/uapi/linux/if_tun.h
> index 81e791e..5952d4b 100644
> --- a/include/uapi/linux/if_tun.h
> +++ b/include/uapi/linux/if_tun.h
> @@ -60,7 +60,7 @@
> #define TUNGETFILTER _IOR('T', 219, struct sock_fprog)
>
> /* CONFIG_VE_TUNTAP_ACCOUNTING should be set */
> -#define TUNSETACCTID _IOW('T', 300, struct tun_acctid)
> +#define TUNSETACCTID _IOW('T', 300, struct ifreq)
>
> /* TUNSETIFF ifr flags */
> #define IFF_TUN 0x0001
> @@ -106,10 +106,4 @@ struct tun_filter {
> __u8 addr[0][ETH_ALEN];
> };
>
> -/* used as TUNSETACCTID ioctl parameter */
> -struct tun_acctid {
> - char ifname[IFNAMSIZ];
> - __u32 acctid;
> -};
> -
> #endif /* _UAPI__IF_TUN_H */
>
More information about the Devel
mailing list