kobject_put(kobj);
        return error;
 }
+
+static int rx_queue_change_owner(struct net_device *dev, int index, kuid_t kuid,
+                                kgid_t kgid)
+{
+       struct netdev_rx_queue *queue = dev->_rx + index;
+       struct kobject *kobj = &queue->kobj;
+       int error;
+
+       error = sysfs_change_owner(kobj, kuid, kgid);
+       if (error)
+               return error;
+
+       if (dev->sysfs_rx_queue_group)
+               error = sysfs_group_change_owner(
+                       kobj, dev->sysfs_rx_queue_group, kuid, kgid);
+
+       return error;
+}
 #endif /* CONFIG_SYSFS */
 
 int
 #endif
 }
 
+static int net_rx_queue_change_owner(struct net_device *dev, int num,
+                                    kuid_t kuid, kgid_t kgid)
+{
+#ifdef CONFIG_SYSFS
+       int error = 0;
+       int i;
+
+#ifndef CONFIG_RPS
+       if (!dev->sysfs_rx_queue_group)
+               return 0;
+#endif
+       for (i = 0; i < num; i++) {
+               error = rx_queue_change_owner(dev, i, kuid, kgid);
+               if (error)
+                       break;
+       }
+
+       return error;
+#else
+       return 0;
+#endif
+}
+
 #ifdef CONFIG_SYSFS
 /*
  * netdev_queue sysfs structures and functions.
        kobject_put(kobj);
        return error;
 }
+
+static int tx_queue_change_owner(struct net_device *ndev, int index,
+                                kuid_t kuid, kgid_t kgid)
+{
+       struct netdev_queue *queue = ndev->_tx + index;
+       struct kobject *kobj = &queue->kobj;
+       int error;
+
+       error = sysfs_change_owner(kobj, kuid, kgid);
+       if (error)
+               return error;
+
+#ifdef CONFIG_BQL
+       error = sysfs_group_change_owner(kobj, &dql_group, kuid, kgid);
+#endif
+       return error;
+}
 #endif /* CONFIG_SYSFS */
 
 int
 #endif /* CONFIG_SYSFS */
 }
 
+static int net_tx_queue_change_owner(struct net_device *dev, int num,
+                                    kuid_t kuid, kgid_t kgid)
+{
+#ifdef CONFIG_SYSFS
+       int error = 0;
+       int i;
+
+       for (i = 0; i < num; i++) {
+               error = tx_queue_change_owner(dev, i, kuid, kgid);
+               if (error)
+                       break;
+       }
+
+       return error;
+#else
+       return 0;
+#endif /* CONFIG_SYSFS */
+}
+
 static int register_queue_kobjects(struct net_device *dev)
 {
        int error = 0, txq = 0, rxq = 0, real_rx = 0, real_tx = 0;
        return error;
 }
 
+static int queue_change_owner(struct net_device *ndev, kuid_t kuid, kgid_t kgid)
+{
+       int error = 0, real_rx = 0, real_tx = 0;
+
+#ifdef CONFIG_SYSFS
+       if (ndev->queues_kset) {
+               error = sysfs_change_owner(&ndev->queues_kset->kobj, kuid, kgid);
+               if (error)
+                       return error;
+       }
+       real_rx = ndev->real_num_rx_queues;
+#endif
+       real_tx = ndev->real_num_tx_queues;
+
+       error = net_rx_queue_change_owner(ndev, real_rx, kuid, kgid);
+       if (error)
+               return error;
+
+       error = net_tx_queue_change_owner(ndev, real_tx, kuid, kgid);
+       if (error)
+               return error;
+
+       return 0;
+}
+
 static void remove_queue_kobjects(struct net_device *dev)
 {
        int real_rx = 0, real_tx = 0;
        if (error)
                return error;
 
+       error = queue_change_owner(ndev, new_uid, new_gid);
+       if (error)
+               return error;
+
        return 0;
 }