From: Volker Lendecke Date: Mon, 29 Aug 2016 07:58:45 +0000 (+0200) Subject: smbd: Reset O_NONBLOCK on open files X-Git-Tag: samba-4.4.6~27 X-Git-Url: http://git.samba.org/samba.git/?a=commitdiff_plain;h=aa45e1a88c0f3eee254f4445be95484bd7ef043e;p=sfrench%2Fsamba-autobuild%2F.git smbd: Reset O_NONBLOCK on open files See the comment inline :-) Bug: https://bugzilla.samba.org/show_bug.cgi?id=12268 Signed-off-by: Volker Lendecke Reviewed-by: Simo Autobuild-User(master): Volker Lendecke Autobuild-Date(master): Thu Sep 15 20:21:41 CEST 2016 on sn-devel-144 (cherry picked from commit e69b17d603e5f09ac1e7ee05fc1f5ad67288c484) Autobuild-User(v4-4-test): Karolin Seeger Autobuild-Date(v4-4-test): Mon Sep 19 13:44:01 CEST 2016 on sn-devel-144 --- diff --git a/source3/smbd/open.c b/source3/smbd/open.c index 5935ff569a5..90155bde99d 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -883,6 +883,25 @@ static NTSTATUS open_file(files_struct *fsp, return status; } + if (local_flags & O_NONBLOCK) { + /* + * GPFS can return ETIMEDOUT for pread on + * nonblocking file descriptors when files + * migrated to tape need to be recalled. I + * could imagine this happens elsehwere + * too. With blocking file descriptors this + * does not happen. + */ + ret = set_blocking(fsp->fh->fd, true); + if (ret == -1) { + status = map_nt_error_from_unix(errno); + DBG_WARNING("Could not set fd to blocking: " + "%s\n", strerror(errno)); + fd_close(fsp); + return status; + } + } + ret = SMB_VFS_FSTAT(fsp, &smb_fname->st); if (ret == -1) { /* If we have an fd, this stat should succeed. */