Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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

+39 -21
+2
fs/ksmbd/ksmbd_netlink.h
··· 349 349 #define KSMBD_SHARE_FLAG_STREAMS BIT(11) 350 350 #define KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS BIT(12) 351 351 #define KSMBD_SHARE_FLAG_ACL_XATTR BIT(13) 352 + #define KSMBD_SHARE_FLAG_UPDATE BIT(14) 352 353 353 354 /* 354 355 * Tree connect request flags. ··· 365 364 #define KSMBD_TREE_CONN_FLAG_READ_ONLY BIT(1) 366 365 #define KSMBD_TREE_CONN_FLAG_WRITABLE BIT(2) 367 366 #define KSMBD_TREE_CONN_FLAG_ADMIN_ACCOUNT BIT(3) 367 + #define KSMBD_TREE_CONN_FLAG_UPDATE BIT(4) 368 368 369 369 /* 370 370 * RPC over IPC.
+5 -1
fs/ksmbd/mgmt/share_config.c
··· 51 51 kfree(share); 52 52 } 53 53 54 - void __ksmbd_share_config_put(struct ksmbd_share_config *share) 54 + void ksmbd_share_config_del(struct ksmbd_share_config *share) 55 55 { 56 56 down_write(&shares_table_lock); 57 57 hash_del(&share->hlist); 58 58 up_write(&shares_table_lock); 59 + } 59 60 61 + void __ksmbd_share_config_put(struct ksmbd_share_config *share) 62 + { 63 + ksmbd_share_config_del(share); 60 64 kill_share(share); 61 65 } 62 66
+1
fs/ksmbd/mgmt/share_config.h
··· 64 64 return share->flags & flag; 65 65 } 66 66 67 + void ksmbd_share_config_del(struct ksmbd_share_config *share); 67 68 void __ksmbd_share_config_put(struct ksmbd_share_config *share); 68 69 69 70 static inline void ksmbd_share_config_put(struct ksmbd_share_config *share)
+15 -1
fs/ksmbd/mgmt/tree_connect.c
··· 19 19 ksmbd_tree_conn_connect(struct ksmbd_conn *conn, struct ksmbd_session *sess, 20 20 char *share_name) 21 21 { 22 - struct ksmbd_tree_conn_status status = {-EINVAL, NULL}; 22 + struct ksmbd_tree_conn_status status = {-ENOENT, NULL}; 23 23 struct ksmbd_tree_connect_response *resp = NULL; 24 24 struct ksmbd_share_config *sc; 25 25 struct ksmbd_tree_connect *tree_conn = NULL; ··· 57 57 goto out_error; 58 58 59 59 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 + 60 74 tree_conn->user = sess->user; 61 75 tree_conn->share_conf = sc; 62 76 status.tree_conn = tree_conn;
+16 -19
fs/ksmbd/smb2pdu.c
··· 1944 1944 rsp->hdr.Status = STATUS_SUCCESS; 1945 1945 rc = 0; 1946 1946 break; 1947 + case -ESTALE: 1948 + case -ENOENT: 1947 1949 case KSMBD_TREE_CONN_STATUS_NO_SHARE: 1948 - rsp->hdr.Status = STATUS_BAD_NETWORK_PATH; 1950 + rsp->hdr.Status = STATUS_BAD_NETWORK_NAME; 1949 1951 break; 1950 1952 case -ENOMEM: 1951 1953 case KSMBD_TREE_CONN_STATUS_NOMEM: ··· 2330 2328 name += strlen(name) + 1) { 2331 2329 ksmbd_debug(SMB, "%s, len %zd\n", name, strlen(name)); 2332 2330 2333 - if (strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) && 2334 - strncmp(&name[XATTR_USER_PREFIX_LEN], DOS_ATTRIBUTE_PREFIX, 2335 - DOS_ATTRIBUTE_PREFIX_LEN) && 2336 - strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX, STREAM_PREFIX_LEN)) 2337 - continue; 2338 - 2339 - err = ksmbd_vfs_remove_xattr(user_ns, path->dentry, name); 2340 - if (err) 2341 - ksmbd_debug(SMB, "remove xattr failed : %s\n", name); 2331 + if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) && 2332 + !strncmp(&name[XATTR_USER_PREFIX_LEN], STREAM_PREFIX, 2333 + STREAM_PREFIX_LEN)) { 2334 + err = ksmbd_vfs_remove_xattr(user_ns, path->dentry, 2335 + name); 2336 + if (err) 2337 + ksmbd_debug(SMB, "remove xattr failed : %s\n", 2338 + name); 2339 + } 2342 2340 } 2343 2341 out: 2344 2342 kvfree(xattr_list); ··· 3044 3042 list_add(&fp->node, &fp->f_ci->m_fp_list); 3045 3043 write_unlock(&fp->f_ci->m_lock); 3046 3044 3047 - rc = ksmbd_vfs_getattr(&path, &stat); 3048 - if (rc) { 3049 - generic_fillattr(user_ns, d_inode(path.dentry), &stat); 3050 - rc = 0; 3051 - } 3052 - 3053 3045 /* Check delete pending among previous fp before oplock break */ 3054 3046 if (ksmbd_inode_pending_delete(fp)) { 3055 3047 rc = -EBUSY; ··· 3130 3134 } 3131 3135 } 3132 3136 3137 + rc = ksmbd_vfs_getattr(&path, &stat); 3138 + if (rc) 3139 + goto err_out; 3140 + 3133 3141 if (stat.result_mask & STATX_BTIME) 3134 3142 fp->create_time = ksmbd_UnixTimeToNT(stat.btime); 3135 3143 else ··· 3148 3148 smb2_new_xattrs(tcon, &path, fp); 3149 3149 3150 3150 memcpy(fp->client_guid, conn->ClientGUID, SMB2_CLIENT_GUID_SIZE); 3151 - 3152 - generic_fillattr(user_ns, file_inode(fp->filp), 3153 - &stat); 3154 3151 3155 3152 rsp->StructureSize = cpu_to_le16(89); 3156 3153 rcu_read_lock();