Changeset eb85d94bd introduced a problem where if a cifs open fails during query info of a file we will still try to close the file (happens with certain types of reparse points) even though the file handle is not valid. In addition for SMB2/SMB3 we were not mapping the return code returned by Windows when trying to open a file (like a Windows NFS symlink) which is a reparse point.
Unified · Split
| @@ -586,7 +586,7 @@ cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, · 585 unmodified lines | ||
| 586 | 586 | tmprc = CIFS_open(xid, &oparms, &oplock, NULL); |
| 587 | 587 | if (tmprc == -EOPNOTSUPP) |
| 588 | 588 | *symlink = true; |
| 589 | − else | |
| 589 | + else if (tmprc == 0) | |
| 590 | 590 | CIFSSMBClose(xid, tcon, fid.netfid); |
| 591 | 591 | } |
| 592 | 592 | |
| @@ -256,6 +256,8 @@ static const struct status_to_posix_error smb2_error_map_table[] = { · 255 unmodified lines | ||
| 256 | 256 | {STATUS_DLL_MIGHT_BE_INCOMPATIBLE, -EIO, |
| 257 | 257 | "STATUS_DLL_MIGHT_BE_INCOMPATIBLE"}, |
| 258 | 258 | {STATUS_STOPPED_ON_SYMLINK, -EOPNOTSUPP, "STATUS_STOPPED_ON_SYMLINK"}, |
| 259 | + {STATUS_IO_REPARSE_TAG_NOT_HANDLED, -EOPNOTSUPP, | |
| 260 | + "STATUS_REPARSE_NOT_HANDLED"}, | |
| 259 | 261 | {STATUS_DEVICE_REQUIRES_CLEANING, -EIO, |
| 260 | 262 | "STATUS_DEVICE_REQUIRES_CLEANING"}, |
| 261 | 263 | {STATUS_DEVICE_DOOR_OPEN, -EIO, "STATUS_DEVICE_DOOR_OPEN"}, |