@samitouri / QOSamiQemu / commits / 11d0e070a6

net/tap: net_init_tap(): common fail label

Add common failure label. This: - simplifies failure paths in the function - get rid of unusual free_fail: in the middle of the function - simplify further refactoring Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Reviewed-by: Ben Chaney <bchaney@akamai.com> Signed-off-by: Jason Wang <jasowang@redhat.com>

Vladimir Sementsov-Ogievskiy committed Mar 18, 2026 at 14:31 UTC 11d0e070a6d43008b3ec3461ce1d94c0def6786c
1 file changed +37 -47
net/tap.c
+37 -47
@@ -820,10 +820,12 @@ int net_init_tap(const Netdev *netdev, const char *name,
820 NetClientState *peer, Error **errp)
821 {
822 const NetdevTapOptions *tap;
823 - int fd, vnet_hdr = 0, i = 0, queues;
823 + int fd = -1, vnet_hdr = 0, i = 0, queues;
824 /* for the no-fd, no-helper case */
825 char ifname[128];
826 - int ret = 0;
826 + char **fds = NULL, **vhost_fds = NULL;
827 + int nfds = 0, nvhosts = 0;
828 +
829
830 assert(netdev->type == NET_CLIENT_DRIVER_TAP);
831 tap = &netdev->u.tap;
@@ -867,31 +869,24 @@ int net_init_tap(const Netdev *netdev, const char *name,
869 if (tap->fd) {
870 fd = monitor_fd_param(monitor_cur(), tap->fd, errp);
871 if (fd == -1) {
870 - return -1;
872 + goto fail;
873 }
874
875 if (!qemu_set_blocking(fd, false, errp)) {
874 - close(fd);
875 - return -1;
876 + goto fail;
877 }
878
879 vnet_hdr = tap_probe_vnet_hdr(fd, errp);
880 if (vnet_hdr < 0) {
880 - close(fd);
881 - return -1;
881 + goto fail;
882 }
883
884 if (!net_init_tap_one(tap, peer, "tap", name, NULL,
885 NULL, NULL,
886 tap->vhostfd, vnet_hdr, fd, errp)) {
887 - close(fd);
888 - return -1;
887 + goto fail;
888 }
889 } else if (tap->fds) {
891 - char **fds;
892 - char **vhost_fds;
893 - int nfds = 0, nvhosts = 0;
894 -
890 fds = g_new0(char *, MAX_TAP_QUEUES);
891 vhost_fds = g_new0(char *, MAX_TAP_QUEUES);
892
@@ -901,77 +896,58 @@ int net_init_tap(const Netdev *netdev, const char *name,
896 if (nfds != nvhosts) {
897 error_setg(errp, "The number of fds passed does not match "
898 "the number of vhostfds passed");
904 - ret = -1;
905 - goto free_fail;
899 + goto fail;
900 }
901 }
902
903 for (i = 0; i < nfds; i++) {
904 fd = monitor_fd_param(monitor_cur(), fds[i], errp);
905 if (fd == -1) {
912 - ret = -1;
913 - goto free_fail;
906 + goto fail;
907 }
908
909 if (!qemu_set_blocking(fd, false, errp)) {
917 - ret = -1;
918 - goto free_fail;
910 + goto fail;
911 }
912
913 if (i == 0) {
914 vnet_hdr = tap_probe_vnet_hdr(fd, errp);
915 if (vnet_hdr < 0) {
924 - ret = -1;
925 - goto free_fail;
916 + goto fail;
917 }
918 } else if (vnet_hdr != tap_probe_vnet_hdr(fd, NULL)) {
919 error_setg(errp,
920 "vnet_hdr not consistent across given tap fds");
930 - ret = -1;
931 - goto free_fail;
921 + goto fail;
922 }
923
924 if (!net_init_tap_one(tap, peer, "tap", name, ifname,
925 NULL, NULL,
926 tap->vhostfds ? vhost_fds[i] : NULL,
927 vnet_hdr, fd, errp)) {
938 - ret = -1;
939 - goto free_fail;
928 + goto fail;
929 }
930 }
942 -
943 -free_fail:
944 - for (i = 0; i < nvhosts; i++) {
945 - g_free(vhost_fds[i]);
946 - }
947 - for (i = 0; i < nfds; i++) {
948 - g_free(fds[i]);
949 - }
950 - g_free(fds);
951 - g_free(vhost_fds);
952 - return ret;
931 } else if (tap->helper) {
932 fd = net_bridge_run_helper(tap->helper,
933 tap->br ?: DEFAULT_BRIDGE_INTERFACE,
934 errp);
935 if (fd == -1) {
958 - return -1;
936 + goto fail;
937 }
938
939 if (!qemu_set_blocking(fd, false, errp)) {
962 - return -1;
940 + goto fail;
941 }
942 vnet_hdr = tap_probe_vnet_hdr(fd, errp);
943 if (vnet_hdr < 0) {
966 - close(fd);
967 - return -1;
944 + goto fail;
945 }
946
947 if (!net_init_tap_one(tap, peer, "bridge", name, ifname,
948 NULL, NULL, tap->vhostfd,
949 vnet_hdr, fd, errp)) {
973 - close(fd);
974 - return -1;
950 + goto fail;
951 }
952 } else {
953 g_autofree char *script =
@@ -989,14 +965,13 @@ free_fail:
965 fd = net_tap_init(tap, &vnet_hdr, i >= 1 ? NULL : script,
966 ifname, sizeof ifname, queues > 1, errp);
967 if (fd == -1) {
992 - return -1;
968 + goto fail;
969 }
970
971 if (queues > 1 && i == 0 && !tap->ifname) {
972 if (tap_fd_get_ifname(fd, ifname)) {
973 error_setg(errp, "Fail to get ifname");
998 - close(fd);
999 - return -1;
974 + goto fail;
975 }
976 }
977
@@ -1004,13 +979,28 @@ free_fail:
979 i >= 1 ? NULL : script,
980 i >= 1 ? NULL : downscript,
981 tap->vhostfd, vnet_hdr, fd, errp)) {
1007 - close(fd);
1008 - return -1;
982 + goto fail;
983 }
984 }
985 }
986
987 return 0;
988 +
989 +fail:
990 + close(fd);
991 + if (vhost_fds) {
992 + for (i = 0; i < nvhosts; i++) {
993 + g_free(vhost_fds[i]);
994 + }
995 + g_free(vhost_fds);
996 + }
997 + if (fds) {
998 + for (i = 0; i < nfds; i++) {
999 + g_free(fds[i]);
1000 + }
1001 + g_free(fds);
1002 + }
1003 + return -1;
1004 }
1005
1006 int tap_enable(NetClientState *nc)