ksmbd: don't remove dos attribute xattr on O_TRUNC open
authorNamjae Jeon <linkinjeon@kernel.org>
Sun, 14 Aug 2022 13:40:25 +0000 (22:40 +0900)
committerSteve French <stfrench@microsoft.com>
Tue, 16 Aug 2022 02:07:01 +0000 (21:07 -0500)
When smb client open file in ksmbd share with O_TRUNC, dos attribute
xattr is removed as well as data in file. This cause the FSCTL_SET_SPARSE
request from the client fails because ksmbd can't update the dos attribute
after setting ATTR_SPARSE_FILE. And this patch fix xfstests generic/469
test also.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/ksmbd/smb2pdu.c

index a136d5e4943bac5d13f376709e0f3105ac6ec2a6..19412ac701a65cbfcf25a9a0f1a1b8a234c54cb7 100644 (file)
@@ -2330,15 +2330,15 @@ static int smb2_remove_smb_xattrs(struct path *path)
                        name += strlen(name) + 1) {
                ksmbd_debug(SMB, "%s, len %zd\n", name, strlen(name));
 
-               if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
-                   strncmp(&name[XATTR_USER_PREFIX_LEN], DOS_ATTRIBUTE_PREFIX,
-                           DOS_ATTRIBUTE_PREFIX_LEN) &&
-                   strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX, STREAM_PREFIX_LEN))
-                       continue;
-
-               err = ksmbd_vfs_remove_xattr(user_ns, path->dentry, name);
-               if (err)
-                       ksmbd_debug(SMB, "remove xattr failed : %s\n", name);
+               if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
+                   !strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX,
+                            STREAM_PREFIX_LEN)) {
+                       err = ksmbd_vfs_remove_xattr(user_ns, path->dentry,
+                                                    name);
+                       if (err)
+                               ksmbd_debug(SMB, "remove xattr failed : %s\n",
+                                           name);
+               }
        }
 out:
        kvfree(xattr_list);