Commit 571781eb authored by Namjae Jeon's avatar Namjae Jeon Committed by Steve French
Browse files

ksmbd: provide zero as a unique ID to the Mac client



The Mac SMB client code seems to expect the on-disk file identifier
to have the semantics of HFS+ Catalog Node Identifier (CNID).
ksmbd provides the inode number as a unique ID to the client,
but in the case of subvolumes of btrfs, there are cases where different
files have the same inode number, so the mac smb client treats it
as an error. There is a report that a similar problem occurs
when the share is ZFS.
Returning UniqueId of zero will make the Mac client to stop using and
trusting the file id returned from the server.

Reported-by: default avatarJustin Turner Arthur <justinarthur@gmail.com>
Signed-off-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent d91c0751
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ struct ksmbd_conn {
	__le16				signing_algorithm;
	bool				binding;
	atomic_t			refcnt;
	bool				is_aapl;
};

struct ksmbd_conn_ops {
+17 −2
Original line number Diff line number Diff line
@@ -3539,6 +3539,15 @@ int smb2_open(struct ksmbd_work *work)
			ksmbd_debug(SMB, "get query on disk id context\n");
			query_disk_id = 1;
		}

		if (conn->is_aapl == false) {
			context = smb2_find_context_vals(req, SMB2_CREATE_AAPL, 4);
			if (IS_ERR(context)) {
				rc = PTR_ERR(context);
				goto err_out1;
			} else if (context)
				conn->is_aapl = true;
		}
	}

	rc = ksmbd_vfs_getattr(&path, &stat);
@@ -3978,6 +3987,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
		if (dinfo->EaSize)
			dinfo->ExtFileAttributes = FILE_ATTRIBUTE_REPARSE_POINT_LE;
		dinfo->Reserved = 0;
		if (conn->is_aapl)
			dinfo->UniqueId = 0;
		else
			dinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino);
		if (d_info->hide_dot_file && d_info->name[0] == '.')
			dinfo->ExtFileAttributes |= FILE_ATTRIBUTE_HIDDEN_LE;
@@ -3995,6 +4007,9 @@ static int smb2_populate_readdir_entry(struct ksmbd_conn *conn, int info_level,
			smb2_get_reparse_tag_special_file(ksmbd_kstat->kstat->mode);
		if (fibdinfo->EaSize)
			fibdinfo->ExtFileAttributes = FILE_ATTRIBUTE_REPARSE_POINT_LE;
		if (conn->is_aapl)
			fibdinfo->UniqueId = 0;
		else
			fibdinfo->UniqueId = cpu_to_le64(ksmbd_kstat->kstat->ino);
		fibdinfo->ShortNameLength = 0;
		fibdinfo->Reserved = 0;
+3 −0
Original line number Diff line number Diff line
@@ -63,6 +63,9 @@ struct preauth_integrity_info {

#define SMB2_SESSION_TIMEOUT		(10 * HZ)

/* Apple Defined Contexts */
#define SMB2_CREATE_AAPL		"AAPL"

struct create_durable_req_v2 {
	struct create_context_hdr ccontext;
	__u8   Name[8];