diff options
author | shemminger <shemminger> | 2003-04-25 00:11:52 +0000 |
---|---|---|
committer | shemminger <shemminger> | 2003-04-25 00:11:52 +0000 |
commit | 0ab6b867def15d33fafebb3deaca9e7828baed3f (patch) | |
tree | d0de239cc35878e216e6b7159eb1502a7829d46a | |
parent | bff20cb0b625ab56a748928fe4c0ad4e69ae46ca (diff) | |
download | bridge-utils-0ab6b867def15d33fafebb3deaca9e7828baed3f.tar.gz |
In case of race and EAGAIN error, retry in the library.
-rw-r--r-- | libbridge/libbridge_devif.c | 12 |
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); |