aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshemminger <shemminger>2003-04-25 00:11:52 +0000
committershemminger <shemminger>2003-04-25 00:11:52 +0000
commit0ab6b867def15d33fafebb3deaca9e7828baed3f (patch)
treed0de239cc35878e216e6b7159eb1502a7829d46a
parentbff20cb0b625ab56a748928fe4c0ad4e69ae46ca (diff)
downloadbridge-utils-0ab6b867def15d33fafebb3deaca9e7828baed3f.tar.gz
In case of race and EAGAIN error, retry in the library.
-rw-r--r--libbridge/libbridge_devif.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/libbridge/libbridge_devif.c b/libbridge/libbridge_devif.c
index 936fa9a..b1189d3 100644
--- a/libbridge/libbridge_devif.c
+++ b/libbridge/libbridge_devif.c
@@ -187,9 +187,15 @@ int br_read_fdb(struct bridge *br, struct fdb_entry *fdbs, int offset, int num)
int i;
int numread;
- if ((numread = br_device_ioctl(br, BRCTL_GET_FDB_ENTRIES,
- (unsigned long)f, num, offset)) < 0)
- return errno;
+ again:
+ numread = br_device_ioctl(br, BRCTL_GET_FDB_ENTRIES,
+ (unsigned long)f, num, offset);
+ if (numread < 0) {
+ if (errno == EAGAIN)
+ goto again;
+
+ return -errno;
+ }
for (i=0;i<numread;i++)
__copy_fdb(fdbs+i, f+i);