-int
-lnet_notify (lnet_ni_t *ni, lnet_nid_t nid, int alive, time_t when)
-{
- lnet_peer_t *lp = NULL;
- time_t now = cfs_time_current_sec();
-
- LASSERT (!in_interrupt ());
-
- CDEBUG (D_NET, "%s notifying %s: %s\n",
- (ni == NULL) ? "userspace" : libcfs_nid2str(ni->ni_nid),
- libcfs_nid2str(nid),
- alive ? "up" : "down");
-
- if (ni != NULL &&
- LNET_NIDNET(ni->ni_nid) != LNET_NIDNET(nid)) {
- CWARN ("Ignoring notification of %s %s by %s (different net)\n",
- libcfs_nid2str(nid), alive ? "birth" : "death",
- libcfs_nid2str(ni->ni_nid));
- return -EINVAL;
- }
-
- /* can't do predictions... */
- if (when > now) {
- CWARN ("Ignoring prediction from %s of %s %s "
- "%ld seconds in the future\n",
- (ni == NULL) ? "userspace" : libcfs_nid2str(ni->ni_nid),
- libcfs_nid2str(nid), alive ? "up" : "down",
- when - now);
- return -EINVAL;
- }
-
- if (ni != NULL && !alive && /* LND telling me she's down */
- !auto_down) { /* auto-down disabled */
- CDEBUG(D_NET, "Auto-down disabled\n");
- return 0;
- }
-
- LNET_LOCK();
-
- lp = lnet_find_peer_locked(nid);
- if (lp == NULL) {
- /* nid not found */
- LNET_UNLOCK();
- CDEBUG(D_NET, "%s not found\n", libcfs_nid2str(nid));
- return 0;
- }
-
- /* We can't fully trust LND on reporting exact peer last_alive
- * if he notifies us about dead peer. For example ksocklnd can
- * call us with when == _time_when_the_node_was_booted_ if
- * no connections were successfully established */
- if (ni != NULL && !alive && when < lp->lp_last_alive)
- when = lp->lp_last_alive;
-
- lnet_notify_locked(lp, ni == NULL, alive, when);
-
- LNET_UNLOCK();
-
- lnet_do_notify(lp);
-
- LNET_LOCK();
-
- lnet_peer_decref_locked(lp);
-
- LNET_UNLOCK();
- return 0;
-}
-EXPORT_SYMBOL(lnet_notify);
-
-#else
-
-int
-lnet_notify (lnet_ni_t *ni, lnet_nid_t nid, int alive, time_t when)
-{
- return -EOPNOTSUPP;
-}
-
-void
-lnet_notify_locked (lnet_peer_t *lp, int notifylnd, int alive, time_t when)
-{
- return;
-}
-
-#endif