commit a5ea57a64a1d70486e8d8ab2da944e50ca51b836 Author: zoulasc Date: Tue Mar 8 23:31:26 2016 -0500 - add more debugging in the unmount path - if the EXPIRE_MULTI call fails, with EAGAIN, fail back to the EXPIRE call seems to fix unmounting with nfsv4 volumes. diff --git a/conf/autofs/autofs_linux.c b/conf/autofs/autofs_linux.c index d543979..5b4ac06 100644 --- a/conf/autofs/autofs_linux.c +++ b/conf/autofs/autofs_linux.c @@ -365,6 +365,7 @@ autofs_expire_one(am_node *mp, char *name, autofs_wqt_t token) ap = find_ap(ap_path); if (ap == NULL) { + dlog("%s: could not find %s", __func__, ap_path); /* not found??? not sure what to do here... */ send_fail(fh->ioctlfd, token); goto out; @@ -376,6 +377,7 @@ autofs_expire_one(am_node *mp, char *name, autofs_wqt_t token) p->next = fh->pending_umounts; fh->pending_umounts = p; + dlog("%s: unmount for %s", __func__, ap_path); unmount_mp(ap); out: @@ -426,6 +428,7 @@ autofs_missing_one(am_node *mp, autofs_wqt_t wait_queue_token, char *name) dlog("Mount still pending, not sending autofs reply yet"); return; } + dlog("%s: lookup failed for %s/%s", __func__, mp->am_path, name); autofs_lookup_failed(mp, name); } mp->am_stats.s_lookup++; @@ -872,15 +875,42 @@ autofs_compute_mount_flags(mntent_t *mnt) return 0; } +static int autofs_expire_4(am_node *mp) +{ + struct autofs_packet_expire pkt; + autofs_fh_t *fh = mp->am_autofs_fh; + + dlog("Calling AUTOFS_IOC_EXPIRE"); + if (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE, &pkt) == -1) + { + dlog("AUTOFS_IOC_EXPIRE for %s failed %d", mp->am_path, errno); + return -1; + } + + autofs_handle_expire(mp, &pkt); + return 0; +} + #if AUTOFS_MAX_PROTO_VERSION >= 4 static int autofs_timeout_mp_task(void *arg) { am_node *mp = (am_node *)arg; autofs_fh_t *fh = mp->am_autofs_fh; - int now = 0; - - while (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &now) == 0); + int how = AUTOFS_EXP_IMMEDIATE; + + for (;;) + { + dlog("Calling AUTOFS_IOC_EXPIRE_MULTI"); + if (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE_MULTI, &how) == -1) + { + dlog("AUTOFS_IOC_EXPIRE_MULTI for %s failed %d", mp->am_path, errno); + if (errno != EAGAIN) + break; + if (autofs_expire_4(mp) == -1) + break; + } + } return 0; } #endif /* AUTOFS_MAX_PROTO_VERSION >= 4 */ @@ -895,9 +925,8 @@ void autofs_timeout_mp(am_node *mp) mp->am_autofs_ttl = now + gopt.am_timeo_w; if (fh->version < 4) { - struct autofs_packet_expire pkt; - while (ioctl(fh->ioctlfd, AUTOFS_IOC_EXPIRE, &pkt) == 0) - autofs_handle_expire(mp, &pkt); + while (autofs_expire_4(mp) == 0) + continue; return; }