| From 9a596f5b39593414c0ec80f71b94a226286f084e Mon Sep 17 00:00:00 2001 |
| From: Georgy A Bystrenin <gkot@altlinux.org> |
| Date: Fri, 21 Dec 2018 00:11:42 -0600 |
| Subject: CIFS: Fix error mapping for SMB2_LOCK command which caused OFD lock problem |
| |
| From: Georgy A Bystrenin <gkot@altlinux.org> |
| |
| commit 9a596f5b39593414c0ec80f71b94a226286f084e upstream. |
| |
| While resolving a bug with locks on samba shares found a strange behavior. |
| When a file locked by one node and we trying to lock it from another node |
| it fail with errno 5 (EIO) but in that case errno must be set to |
| (EACCES | EAGAIN). |
| This isn't happening when we try to lock file second time on same node. |
| In this case it returns EACCES as expected. |
| Also this issue not reproduces when we use SMB1 protocol (vers=1.0 in |
| mount options). |
| |
| Further investigation showed that the mapping from status_to_posix_error |
| is different for SMB1 and SMB2+ implementations. |
| For SMB1 mapping is [NT_STATUS_LOCK_NOT_GRANTED to ERRlock] |
| (See fs/cifs/netmisc.c line 66) |
| but for SMB2+ mapping is [STATUS_LOCK_NOT_GRANTED to -EIO] |
| (see fs/cifs/smb2maperror.c line 383) |
| |
| Quick changes in SMB2+ mapping from EIO to EACCES has fixed issue. |
| |
| BUG: https://bugzilla.kernel.org/show_bug.cgi?id=201971 |
| |
| Signed-off-by: Georgy A Bystrenin <gkot@altlinux.org> |
| Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com> |
| CC: Stable <stable@vger.kernel.org> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/smb2maperror.c | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/fs/cifs/smb2maperror.c |
| +++ b/fs/cifs/smb2maperror.c |
| @@ -377,8 +377,8 @@ static const struct status_to_posix_erro |
| {STATUS_NONEXISTENT_EA_ENTRY, -EIO, "STATUS_NONEXISTENT_EA_ENTRY"}, |
| {STATUS_NO_EAS_ON_FILE, -ENODATA, "STATUS_NO_EAS_ON_FILE"}, |
| {STATUS_EA_CORRUPT_ERROR, -EIO, "STATUS_EA_CORRUPT_ERROR"}, |
| - {STATUS_FILE_LOCK_CONFLICT, -EIO, "STATUS_FILE_LOCK_CONFLICT"}, |
| - {STATUS_LOCK_NOT_GRANTED, -EIO, "STATUS_LOCK_NOT_GRANTED"}, |
| + {STATUS_FILE_LOCK_CONFLICT, -EACCES, "STATUS_FILE_LOCK_CONFLICT"}, |
| + {STATUS_LOCK_NOT_GRANTED, -EACCES, "STATUS_LOCK_NOT_GRANTED"}, |
| {STATUS_DELETE_PENDING, -ENOENT, "STATUS_DELETE_PENDING"}, |
| {STATUS_CTL_FILE_NOT_SUPPORTED, -ENOSYS, |
| "STATUS_CTL_FILE_NOT_SUPPORTED"}, |