Skip to content

Commit a3a78b6

Browse files
committed
Merge tag '5.20-rc2-ksmbd-smb3-server-fixes' of git://git.samba.org/ksmbd
Pull ksmbd server fixes from Steve French: - important sparse file fix - allocation size fix - fix incorrect rc on bad share - share config fix * tag '5.20-rc2-ksmbd-smb3-server-fixes' of git://git.samba.org/ksmbd: ksmbd: don't remove dos attribute xattr on O_TRUNC open ksmbd: remove unnecessary generic_fillattr in smb2_open ksmbd: request update to stale share config ksmbd: return STATUS_BAD_NETWORK_NAME error status if share is not configured
2 parents 963a70b + 17661ec commit a3a78b6

File tree

5 files changed

+39
-21
lines changed

5 files changed

+39
-21
lines changed

fs/ksmbd/ksmbd_netlink.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ enum KSMBD_TREE_CONN_STATUS {
349349
#define KSMBD_SHARE_FLAG_STREAMS BIT(11)
350350
#define KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS BIT(12)
351351
#define KSMBD_SHARE_FLAG_ACL_XATTR BIT(13)
352+
#define KSMBD_SHARE_FLAG_UPDATE BIT(14)
352353

353354
/*
354355
* Tree connect request flags.
@@ -364,6 +365,7 @@ enum KSMBD_TREE_CONN_STATUS {
364365
#define KSMBD_TREE_CONN_FLAG_READ_ONLY BIT(1)
365366
#define KSMBD_TREE_CONN_FLAG_WRITABLE BIT(2)
366367
#define KSMBD_TREE_CONN_FLAG_ADMIN_ACCOUNT BIT(3)
368+
#define KSMBD_TREE_CONN_FLAG_UPDATE BIT(4)
367369

368370
/*
369371
* RPC over IPC.

fs/ksmbd/mgmt/share_config.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,16 @@ static void kill_share(struct ksmbd_share_config *share)
5151
kfree(share);
5252
}
5353

54-
void __ksmbd_share_config_put(struct ksmbd_share_config *share)
54+
void ksmbd_share_config_del(struct ksmbd_share_config *share)
5555
{
5656
down_write(&shares_table_lock);
5757
hash_del(&share->hlist);
5858
up_write(&shares_table_lock);
59+
}
5960

61+
void __ksmbd_share_config_put(struct ksmbd_share_config *share)
62+
{
63+
ksmbd_share_config_del(share);
6064
kill_share(share);
6165
}
6266

fs/ksmbd/mgmt/share_config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ static inline int test_share_config_flag(struct ksmbd_share_config *share,
6464
return share->flags & flag;
6565
}
6666

67+
void ksmbd_share_config_del(struct ksmbd_share_config *share);
6768
void __ksmbd_share_config_put(struct ksmbd_share_config *share);
6869

6970
static inline void ksmbd_share_config_put(struct ksmbd_share_config *share)

fs/ksmbd/mgmt/tree_connect.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct ksmbd_tree_conn_status
1919
ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
2020
char *share_name)
2121
{
22-
struct ksmbd_tree_conn_status status = {-EINVAL, NULL};
22+
struct ksmbd_tree_conn_status status = {-ENOENT, NULL};
2323
struct ksmbd_tree_connect_response *resp = NULL;
2424
struct ksmbd_share_config *sc;
2525
struct ksmbd_tree_connect *tree_conn = NULL;
@@ -57,6 +57,20 @@ ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess,
5757
goto out_error;
5858

5959
tree_conn->flags = resp->connection_flags;
60+
if (test_tree_conn_flag(tree_conn, KSMBD_TREE_CONN_FLAG_UPDATE)) {
61+
struct ksmbd_share_config *new_sc;
62+
63+
ksmbd_share_config_del(sc);
64+
new_sc = ksmbd_share_config_get(share_name);
65+
if (!new_sc) {
66+
pr_err("Failed to update stale share config\n");
67+
status.ret = -ESTALE;
68+
goto out_error;
69+
}
70+
ksmbd_share_config_put(sc);
71+
sc = new_sc;
72+
}
73+
6074
tree_conn->user = sess->user;
6175
tree_conn->share_conf = sc;
6276
status.tree_conn = tree_conn;

fs/ksmbd/smb2pdu.c

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,8 +1944,10 @@ int smb2_tree_connect(struct ksmbd_work *work)
19441944
rsp->hdr.Status = STATUS_SUCCESS;
19451945
rc = 0;
19461946
break;
1947+
case -ESTALE:
1948+
case -ENOENT:
19471949
case KSMBD_TREE_CONN_STATUS_NO_SHARE:
1948-
rsp->hdr.Status = STATUS_BAD_NETWORK_PATH;
1950+
rsp->hdr.Status = STATUS_BAD_NETWORK_NAME;
19491951
break;
19501952
case -ENOMEM:
19511953
case KSMBD_TREE_CONN_STATUS_NOMEM:
@@ -2328,15 +2330,15 @@ static int smb2_remove_smb_xattrs(struct path *path)
23282330
name += strlen(name) + 1) {
23292331
ksmbd_debug(SMB, "%s, len %zd\n", name, strlen(name));
23302332

2331-
if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
2332-
strncmp(&name[XATTR_USER_PREFIX_LEN], DOS_ATTRIBUTE_PREFIX,
2333-
DOS_ATTRIBUTE_PREFIX_LEN) &&
2334-
strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX, STREAM_PREFIX_LEN))
2335-
continue;
2336-
2337-
err = ksmbd_vfs_remove_xattr(user_ns, path->dentry, name);
2338-
if (err)
2339-
ksmbd_debug(SMB, "remove xattr failed : %s\n", name);
2333+
if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) &&
2334+
!strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX,
2335+
STREAM_PREFIX_LEN)) {
2336+
err = ksmbd_vfs_remove_xattr(user_ns, path->dentry,
2337+
name);
2338+
if (err)
2339+
ksmbd_debug(SMB, "remove xattr failed : %s\n",
2340+
name);
2341+
}
23402342
}
23412343
out:
23422344
kvfree(xattr_list);
@@ -3042,12 +3044,6 @@ int smb2_open(struct ksmbd_work *work)
30423044
list_add(&fp->node, &fp->f_ci->m_fp_list);
30433045
write_unlock(&fp->f_ci->m_lock);
30443046

3045-
rc = ksmbd_vfs_getattr(&path, &stat);
3046-
if (rc) {
3047-
generic_fillattr(user_ns, d_inode(path.dentry), &stat);
3048-
rc = 0;
3049-
}
3050-
30513047
/* Check delete pending among previous fp before oplock break */
30523048
if (ksmbd_inode_pending_delete(fp)) {
30533049
rc = -EBUSY;
@@ -3134,6 +3130,10 @@ int smb2_open(struct ksmbd_work *work)
31343130
}
31353131
}
31363132

3133+
rc = ksmbd_vfs_getattr(&path, &stat);
3134+
if (rc)
3135+
goto err_out;
3136+
31373137
if (stat.result_mask & STATX_BTIME)
31383138
fp->create_time = ksmbd_UnixTimeToNT(stat.btime);
31393139
else
@@ -3149,9 +3149,6 @@ int smb2_open(struct ksmbd_work *work)
31493149

31503150
memcpy(fp->client_guid, conn->ClientGUID, SMB2_CLIENT_GUID_SIZE);
31513151

3152-
generic_fillattr(user_ns, file_inode(fp->filp),
3153-
&stat);
3154-
31553152
rsp->StructureSize = cpu_to_le16(89);
31563153
rcu_read_lock();
31573154
opinfo = rcu_dereference(fp->f_opinfo);

0 commit comments

Comments
 (0)