Merge "Use ordered data mode & disable delayed allocation when /config is ext4"
diff --git a/fs/skeleton/bin/has-ghn b/fs/skeleton/bin/has-ghn
new file mode 100755
index 0000000..217a842
--- /dev/null
+++ b/fs/skeleton/bin/has-ghn
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# Returns 0 (true) if this device has a local G.hn node
+# By checking for marvell's DEK tool: configlayer
+#
+. /etc/utils.sh
+if runnable configlayer; then
+  exit 0
+else
+  exit 1
+fi
diff --git a/fs/skeleton/bin/has-tuneable-laser b/fs/skeleton/bin/has-tuneable-laser
new file mode 100755
index 0000000..3e97d37
--- /dev/null
+++ b/fs/skeleton/bin/has-tuneable-laser
@@ -0,0 +1,11 @@
+#!/bin/sh
+#
+# Returns 0 (true) if this device has a tuneable laser
+#
+. /etc/utils.sh
+plat=$(cat /etc/platform)
+if startswith "$plat" "GFLT3" ; then
+  exit 0
+else
+  exit 1
+fi
diff --git a/fs/skeleton/etc/init.d/S45ghn.platform_gfiberlt b/fs/skeleton/etc/init.d/S45ghn.platform_gfiberlt
new file mode 100755
index 0000000..16ac013
--- /dev/null
+++ b/fs/skeleton/etc/init.d/S45ghn.platform_gfiberlt
@@ -0,0 +1,51 @@
+#! /bin/sh
+
+. /etc/utils.sh
+
+GHN_DIR="/tmp/ghn"
+GHN_MAC_ADDR_FILE="${GHN_DIR}/mac_addr"
+
+case "$1" in
+  start|"")
+    platform=$(cat /etc/platform)
+    if ! startswith "$platform" "GFLT4"; then
+      exit 0
+    fi
+
+    # Create Ghn directory and mac_addr file
+    mkdir -p "$GHN_DIR"
+
+    HNVRAM_MAC=$(hnvram -q -r MAC_ADDR_PON)
+    if [ -z "$HNVRAM_MAC" ]; then
+      echo "S45ghn: hnvram G.hn mac_addr is empty!"
+      exit 1
+    fi
+    echo "$HNVRAM_MAC" >"$GHN_MAC_ADDR_FILE"
+
+    # Bring up eth1 interface to ghn
+    ip link set up dev eth1
+    # ghn defaults to 10.10.1.69, we want to be on the same subnet
+    ip addr add 10.10.1.2/24 dev eth1
+
+    if ! read-ghn-local "NODE.GENERAL.ENABLE" 1>/dev/null; then
+      echo "S45ghn: Failed to read stats from G.hn: $HNVRAM_MAC"
+      exit 1
+    fi
+
+    # Periodically grab GHN stats and write to file
+    babysit 60 ghn-periodic-stats 2>&1 | logos ghn-periodic-stats &
+    ;;
+  stop)
+    pkillwait -f ghn-periodic-stats
+    ip addr del 10.10.1.2/24 dev eth1
+    ip link set down dev eth1
+    rm -rf "$GHN_DIR"
+    ;;
+  restart)
+    $0 stop; $0 start
+    ;;
+  *)
+    echo "Usage: S45ghn {start|stop|restart}" >&2
+    exit 1
+    ;;
+esac
diff --git a/fs/skeleton/etc/init.d/S74lasertune.platform_gfiberlt b/fs/skeleton/etc/init.d/S74lasertune.platform_gfiberlt
index aa4dff5..7dc8d78 100755
--- a/fs/skeleton/etc/init.d/S74lasertune.platform_gfiberlt
+++ b/fs/skeleton/etc/init.d/S74lasertune.platform_gfiberlt
@@ -1,11 +1,10 @@
 #!/bin/sh
 
 . /etc/utils.sh
-platform=$(cat /etc/platform)
 
 case "$1" in
   start)
-    if startswith "$platform" "GFLT3"; then
+    if has-tuneable-laser; then
       echo "Starting lasertune."
       babysit 5 lasertune 2>&1 | logos lasertune &
     fi
diff --git a/fs/skeleton/usr/bin/ghn-periodic-stats.platform_gfiberlt b/fs/skeleton/usr/bin/ghn-periodic-stats.platform_gfiberlt
new file mode 100755
index 0000000..ad3ddba
--- /dev/null
+++ b/fs/skeleton/usr/bin/ghn-periodic-stats.platform_gfiberlt
@@ -0,0 +1,61 @@
+#!/bin/sh
+
+. /etc/utils.sh
+
+GHN_DIR="/tmp/ghn"
+GHN_STATS_FILE="${GHN_DIR}/config"
+
+usage() {
+  echo "Usage:"
+  echo
+  echo "  $0"
+  echo
+  echo "  Repeatedly grabs up to date stats from G.hn chip using 'configlayer' "
+  echo "  These stats are eventually used in catawampus' periodic statistics. "
+  echo
+  exit 99
+}
+
+if ! has-ghn; then
+  exit 0
+fi
+
+if [ "$#" -ne "0" ]; then
+  usage
+fi
+
+GHN_MAC_ADDR=$(cat "$GHN_DIR"/mac_addr)
+while true; do
+  if configlayer -o GET -i eth1 -m "$GHN_MAC_ADDR" -w paterna \
+    -p NODE.GENERAL.ENABLE \
+    -p NTP.GENERAL.STATUS \
+    -p NODE.GENERAL.DEVICE_ALIAS \
+    -p NODE.GENERAL.DEVICE_NAME \
+    -p SYSTEM.PRODUCTION.DEVICE_NAME \
+    -p NODE.GENERAL.LAST_CHANGE \
+    -p SYSTEM.PRODUCTION.MAC_ADDR \
+    -p SYSTEM.GENERAL.API_VERSION \
+    -p SYSTEM.GENERAL.FW_VERSION \
+    -p SYSTEM.GENERAL.FW_VERSION_CORE \
+    -p NODE.GENERAL.DOMAIN_NAME \
+    -p NODE.GENERAL.DNI \
+    -p NODE.GENERAL.DOMAIN_ID \
+    -p NODE.GENERAL.DEVICE_ID \
+    -p NODE.GENERAL.NODE_TYPE \
+    -p SYSTEM.GENERAL.DOMAIN_MASTER_CAPABLE \
+    -p SYSTEM.GENERAL.SEC_CONTROLLER_CAPABLE \
+    -p SYSTEM.GENERAL.SEC_CONTROLLER_STATUS \
+    -p DIDMNG.GENERAL.NUM_DIDS \
+    -p DIDMNG.GENERAL.DIDS \
+    -p DIDMNG.GENERAL.MACS \
+    -p DIDMNG.GENERAL.TX_BPS \
+    -p DIDMNG.GENERAL.RX_BPS \
+    -p DIDMNG.GENERAL.ACTIVE \
+    > "${GHN_STATS_FILE}.tmp"; then
+    # Do write in two stages to preserve atomicity
+    mv "${GHN_STATS_FILE}.tmp" "$GHN_STATS_FILE"
+  else
+    echo "$0 failed to grab config from G.hn: $GHN_MAC_ADDR"
+  fi
+  sleep 60
+done
diff --git a/fs/skeleton/usr/bin/lasertune.platform_gfiberlt b/fs/skeleton/usr/bin/lasertune.platform_gfiberlt
index 7b7a091..aa0f553 100755
--- a/fs/skeleton/usr/bin/lasertune.platform_gfiberlt
+++ b/fs/skeleton/usr/bin/lasertune.platform_gfiberlt
@@ -3,7 +3,6 @@
 . /etc/utils.sh
 
 laser_channel_file="/sys/devices/platform/gpon/misc/laserChannel"
-platform=$(cat /etc/platform)
 prev_laser_channel=-1
 
 # Initially be very aggressive about acquiring a channel, then back off once
@@ -15,7 +14,7 @@
   echo "$@" >&2
 }
 
-if ! startswith "$platform" "GFLT3"; then
+if ! has-tuneable-laser; then
   # not all fiberjacks have a tunable laser.
   exit 0
 fi
diff --git a/fs/skeleton/usr/bin/read-ghn-local.platform_gfiberlt b/fs/skeleton/usr/bin/read-ghn-local.platform_gfiberlt
new file mode 100755
index 0000000..b528523
--- /dev/null
+++ b/fs/skeleton/usr/bin/read-ghn-local.platform_gfiberlt
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+. /etc/utils.sh
+
+GHN_DIR="/tmp/ghn"
+
+usage() {
+  echo "Usage:"
+  echo
+  echo "  $0 $1"
+  echo
+  echo "  A wrapper for 'read-ghn-node' when querying the local G.hn node "
+  echo "  Grabs a single paramater and prints the value. "
+  echo
+  exit 99
+}
+
+if ! has-ghn; then
+  exit 0
+fi
+
+if [ "$#" -ne "1" ]; then
+  usage "$1"
+fi
+
+GHN_MAC_ADDR=$(cat "$GHN_DIR"/mac_addr)
+read-ghn-node "$GHN_MAC_ADDR" "$1"
diff --git a/fs/skeleton/usr/bin/reset-ghn.platform_gfiberlt b/fs/skeleton/usr/bin/reset-ghn.platform_gfiberlt
index 9f5bdf0..87f6a52 100755
--- a/fs/skeleton/usr/bin/reset-ghn.platform_gfiberlt
+++ b/fs/skeleton/usr/bin/reset-ghn.platform_gfiberlt
@@ -12,8 +12,7 @@
   exit 99
 }
 
-platform=$(cat /etc/platform)
-if ! startswith "$platform" "GFLT4"; then
+if ! has-ghn; then
   # Only GFLT400 has G.hn chip (Marvell's 88x5153)
   exit 0
 fi
diff --git a/fs/skeleton/usr/bin/set_laser_channel.platform_gfiberlt b/fs/skeleton/usr/bin/set_laser_channel.platform_gfiberlt
index 48ced0e..ea159c8 100755
--- a/fs/skeleton/usr/bin/set_laser_channel.platform_gfiberlt
+++ b/fs/skeleton/usr/bin/set_laser_channel.platform_gfiberlt
@@ -2,8 +2,6 @@
 
 . /etc/utils.sh
 
-platform=$(cat /etc/platform)
-
 usage() {
   echo "Usage:"
   echo
@@ -15,7 +13,7 @@
   exit 99
 }
 
-if ! startswith "$platform" "GFLT3"; then
+if ! has-tuneable-laser; then
   # not all fiberjacks have tuneable optics.
   exit 0
 fi
diff --git a/linux/linux.mk b/linux/linux.mk
index 88b83f2..fbb7b5f 100644
--- a/linux/linux.mk
+++ b/linux/linux.mk
@@ -48,7 +48,7 @@
 
 # Get the real Linux version, which tells us where kernel modules are
 # going to be installed in the target filesystem.
-LINUX_VERSION_PROBED = $(shell $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) --no-print-directory -s kernelrelease)
+LINUX_VERSION_PROBED = $(shell LOGLINEAR_LEAVE_STDOUT=1 $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) --no-print-directory -s kernelrelease 2>/dev/null)
 
 ifeq ($(BR2_LINUX_KERNEL_USE_INTREE_DTS),y)
 KERNEL_DTS_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_INTREE_DTS_NAME))
diff --git a/loglinear b/loglinear
index 873d9b1..6afc211 100755
--- a/loglinear
+++ b/loglinear
@@ -249,8 +249,12 @@
       _Write(conn.fileno(), '%s %s\nPWD: %s\nStarting: %s (%s)\n'
              % (parent, nice_cmdline or '',
                 os.getcwd(), cmdline, nice_cmdline))
-      os.dup2(conn.fileno(), 1)
-      os.dup2(conn.fileno(), 2)
+      if os.environ.get('LOGLINEAR_LEAVE_STDOUT'):
+        _Write(conn.fileno(), 'Not redirecting stdout or stderr ' \
+            'because LOGLINEAR_LEAVE_STDOUT is set')
+      else:
+        os.dup2(conn.fileno(), 1)
+        os.dup2(conn.fileno(), 2)
       conn.close()
       os.environ['LOGLINEAR_PARENT'] = str(myid)
       os.execvp(cmdline[0], cmdline)
diff --git a/package/golang/go_cloud/go_cloud.mk b/package/golang/go_cloud/go_cloud.mk
index 28c28b0..6a9689d 100644
--- a/package/golang/go_cloud/go_cloud.mk
+++ b/package/golang/go_cloud/go_cloud.mk
@@ -10,7 +10,7 @@
 
 define GO_CLOUD_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/google.golang.org/"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/google.golang.org/cloud"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/google.golang.org/cloud"
 endef
 
 GO_CLOUD_POST_PATCH_HOOKS += GO_CLOUD_FIX_PATH
diff --git a/package/golang/go_cron/go_cron.mk b/package/golang/go_cron/go_cron.mk
index 4e9e518..71a55e5 100644
--- a/package/golang/go_cron/go_cron.mk
+++ b/package/golang/go_cron/go_cron.mk
@@ -10,7 +10,7 @@
 
 define GO_CRON_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/robfig/"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/robfig/cron"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/robfig/cron"
 endef
 
 GO_CRON_POST_PATCH_HOOKS += GO_CRON_FIX_PATH
diff --git a/package/golang/go_fsnotify/go_fsnotify.mk b/package/golang/go_fsnotify/go_fsnotify.mk
index 357a915..e6ed876 100644
--- a/package/golang/go_fsnotify/go_fsnotify.mk
+++ b/package/golang/go_fsnotify/go_fsnotify.mk
@@ -10,7 +10,7 @@
 
 define GO_FSNOTIFY_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/go-fsnotify/"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/go-fsnotify/fsnotify"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/go-fsnotify/fsnotify"
 endef
 
 GO_FSNOTIFY_POST_PATCH_HOOKS += GO_FSNOTIFY_FIX_PATH
diff --git a/package/golang/go_glog/go_glog.mk b/package/golang/go_glog/go_glog.mk
index d01dbd6..5779579 100644
--- a/package/golang/go_glog/go_glog.mk
+++ b/package/golang/go_glog/go_glog.mk
@@ -10,7 +10,7 @@
 
 define GO_GLOG_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/golang"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/golang/glog"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/golang/glog"
 endef
 
 GO_GLOG_POST_PATCH_HOOKS += GO_GLOG_FIX_PATH
diff --git a/package/golang/go_goczmq/go_goczmq.mk b/package/golang/go_goczmq/go_goczmq.mk
index fdb7950..076ba30 100644
--- a/package/golang/go_goczmq/go_goczmq.mk
+++ b/package/golang/go_goczmq/go_goczmq.mk
@@ -10,7 +10,7 @@
 
 define GO_GOCZMQ_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/zeromq"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/zeromq/goczmq"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/zeromq/goczmq"
 endef
 
 GO_GOCZMQ_POST_PATCH_HOOKS += GO_GOCZMQ_FIX_PATH
diff --git a/package/golang/go_godbus_dbus/go_godbus_dbus.mk b/package/golang/go_godbus_dbus/go_godbus_dbus.mk
index fc16412..15c040e 100644
--- a/package/golang/go_godbus_dbus/go_godbus_dbus.mk
+++ b/package/golang/go_godbus_dbus/go_godbus_dbus.mk
@@ -10,7 +10,7 @@
 
 define GO_GODBUS_DBUS_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/godbus/"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/godbus/dbus"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/godbus/dbus"
 endef
 
 GO_GODBUS_DBUS_POST_PATCH_HOOKS += GO_GODBUS_DBUS_FIX_PATH
diff --git a/package/golang/go_golua/go_golua.mk b/package/golang/go_golua/go_golua.mk
index 27e65c6..f8e9d5b 100644
--- a/package/golang/go_golua/go_golua.mk
+++ b/package/golang/go_golua/go_golua.mk
@@ -10,7 +10,7 @@
 
 define GO_GOLUA_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/aarzilli"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/aarzilli/golua"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/aarzilli/golua"
 endef
 
 GO_GOLUA_POST_PATCH_HOOKS += GO_GOLUA_FIX_PATH
diff --git a/package/golang/go_gonzojive_mdns/go_gonzojive_mdns.mk b/package/golang/go_gonzojive_mdns/go_gonzojive_mdns.mk
index 340a339..5f842e0 100644
--- a/package/golang/go_gonzojive_mdns/go_gonzojive_mdns.mk
+++ b/package/golang/go_gonzojive_mdns/go_gonzojive_mdns.mk
@@ -10,7 +10,7 @@
 
 define GO_GONZOJIVE_MDNS_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/gonzojive"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/gonzojive/mdns"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/gonzojive/mdns"
 endef
 
 GO_GONZOJIVE_MDNS_POST_PATCH_HOOKS += GO_GONZOJIVE_MDNS_FIX_PATH
diff --git a/package/golang/go_google_api/go_google_api.mk b/package/golang/go_google_api/go_google_api.mk
index 4b96596..f063fb4 100644
--- a/package/golang/go_google_api/go_google_api.mk
+++ b/package/golang/go_google_api/go_google_api.mk
@@ -10,7 +10,7 @@
 
 define GO_GOOGLE_API_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/google.golang.org"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/google.golang.org/api"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/google.golang.org/api"
 endef
 
 GO_GOOGLE_API_POST_PATCH_HOOKS += GO_GOOGLE_API_FIX_PATH
diff --git a/package/golang/go_grpc/go_grpc.mk b/package/golang/go_grpc/go_grpc.mk
index 21e68cc..97ca85d 100644
--- a/package/golang/go_grpc/go_grpc.mk
+++ b/package/golang/go_grpc/go_grpc.mk
@@ -10,7 +10,7 @@
 
 define GO_GRPC_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/google.golang.org/"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/google.golang.org/grpc"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/google.golang.org/grpc"
 endef
 
 GO_GRPC_POST_PATCH_HOOKS += GO_GRPC_FIX_PATH
diff --git a/package/golang/go_luar/go_luar.mk b/package/golang/go_luar/go_luar.mk
index 86432d4..0a7386d 100644
--- a/package/golang/go_luar/go_luar.mk
+++ b/package/golang/go_luar/go_luar.mk
@@ -10,7 +10,7 @@
 
 define GO_LUAR_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/stevedonovan/"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/stevedonovan/luar"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/stevedonovan/luar"
 endef
 
 GO_LUAR_POST_PATCH_HOOKS += GO_LUAR_FIX_PATH
diff --git a/package/golang/go_miekg_dns/go_miekg_dns.mk b/package/golang/go_miekg_dns/go_miekg_dns.mk
index 1917ca2..86133b6 100644
--- a/package/golang/go_miekg_dns/go_miekg_dns.mk
+++ b/package/golang/go_miekg_dns/go_miekg_dns.mk
@@ -10,7 +10,7 @@
 
 define GO_MIEKG_DNS_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/miekg"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/miekg/dns"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/miekg/dns"
 endef
 
 GO_MIEKG_DNS_POST_PATCH_HOOKS += GO_MIEKG_DNS_FIX_PATH
diff --git a/package/golang/go_net/go_net.mk b/package/golang/go_net/go_net.mk
index 4dff340..0e3ef15 100644
--- a/package/golang/go_net/go_net.mk
+++ b/package/golang/go_net/go_net.mk
@@ -10,7 +10,7 @@
 
 define GO_NET_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/golang.org/x"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/golang.org/x/net"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/golang.org/x/net"
 endef
 
 GO_NET_POST_PATCH_HOOKS += GO_NET_FIX_PATH
diff --git a/package/golang/go_oauth2/go_oauth2.mk b/package/golang/go_oauth2/go_oauth2.mk
index f2fe500..756208e 100644
--- a/package/golang/go_oauth2/go_oauth2.mk
+++ b/package/golang/go_oauth2/go_oauth2.mk
@@ -10,7 +10,7 @@
 
 define GO_OAUTH2_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/golang.org/x"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/golang.org/x/oauth2"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/golang.org/x/oauth2"
 endef
 
 GO_OAUTH2_POST_PATCH_HOOKS += GO_OAUTH2_FIX_PATH
diff --git a/package/golang/go_protobuf/go_protobuf.mk b/package/golang/go_protobuf/go_protobuf.mk
index a714e4d..3989108 100644
--- a/package/golang/go_protobuf/go_protobuf.mk
+++ b/package/golang/go_protobuf/go_protobuf.mk
@@ -10,7 +10,7 @@
 
 define GO_PROTOBUF_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/github.com/golang"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/golang/protobuf"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/github.com/golang/protobuf"
 endef
 
 GO_PROTOBUF_POST_PATCH_HOOKS += GO_PROTOBUF_FIX_PATH
@@ -20,7 +20,7 @@
 # Install Go protobuf compiler on host
 define HOST_GO_PROTOBUF_INSTALL_CMDS
 	mkdir -p "$(@D)/go/src/github.com/golang"
-	ln -sT "$(@D)" "$(@D)/go/src/github.com/golang/protobuf"
+	ln -sfT "$(@D)" "$(@D)/go/src/github.com/golang/protobuf"
         export $(GOLANG_ENV) ; \
 	GOARCH= GOBIN="$(HOST_DIR)/usr/bin" GOPATH="$(@D)/go" \
 	go install github.com/golang/protobuf/protoc-gen-go
diff --git a/package/golang/go_sys/go_sys.mk b/package/golang/go_sys/go_sys.mk
index 72cdcb5..dff37ba 100644
--- a/package/golang/go_sys/go_sys.mk
+++ b/package/golang/go_sys/go_sys.mk
@@ -10,7 +10,7 @@
 
 define GO_SYS_FIX_PATH
 	mkdir -p "$(BUILD_DIR)/go_pkgs/src/golang.org/x"
-	ln -sT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/golang.org/x/sys"
+	ln -sfT "$(@D)" "$(BUILD_DIR)/go_pkgs/src/golang.org/x/sys"
 endef
 
 GO_SYS_POST_PATCH_HOOKS += GO_SYS_FIX_PATH