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 '4.20-rc7-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6

Pull smb3 fix from Steve French:
"An important smb3 fix for an regression to some servers introduced by
compounding optimization to rmdir.

This fix has been tested by multiple developers (including me) with
the usual private xfstesting, but also by the new cifs/smb3 "buildbot"
xfstest VMs (thank you Ronnie and Aurelien for good work on this
automation). The automated testing has been updated so that it will
catch problems like this in the future.

Note that Pavel discovered (very recently) some unrelated but
extremely important bugs in credit handling (smb3 flow control problem
that can lead to disconnects/reconnects) when compounding, that I
would have liked to send in ASAP but the complete testing of those two
fixes may not be done in time and have to wait for 4.21"

* tag '4.20-rc7-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6:
smb3: Fix rmdir compounding regression to strict servers

+25 -17
+8 -8
fs/cifs/smb2inode.c
··· 97 97 if (rc) 98 98 goto finished; 99 99 100 - smb2_set_next_command(server, &rqst[num_rqst++]); 100 + smb2_set_next_command(server, &rqst[num_rqst++], 0); 101 101 102 102 /* Operation */ 103 103 switch (command) { ··· 111 111 SMB2_O_INFO_FILE, 0, 112 112 sizeof(struct smb2_file_all_info) + 113 113 PATH_MAX * 2, 0, NULL); 114 - smb2_set_next_command(server, &rqst[num_rqst]); 114 + smb2_set_next_command(server, &rqst[num_rqst], 0); 115 115 smb2_set_related(&rqst[num_rqst++]); 116 116 break; 117 117 case SMB2_OP_DELETE: ··· 127 127 rqst[num_rqst].rq_iov = si_iov; 128 128 rqst[num_rqst].rq_nvec = 1; 129 129 130 - size[0] = 8; 130 + size[0] = 1; /* sizeof __u8 See MS-FSCC section 2.4.11 */ 131 131 data[0] = &delete_pending[0]; 132 132 133 133 rc = SMB2_set_info_init(tcon, &rqst[num_rqst], COMPOUND_FID, 134 134 COMPOUND_FID, current->tgid, 135 135 FILE_DISPOSITION_INFORMATION, 136 136 SMB2_O_INFO_FILE, 0, data, size); 137 - smb2_set_next_command(server, &rqst[num_rqst]); 137 + smb2_set_next_command(server, &rqst[num_rqst], 1); 138 138 smb2_set_related(&rqst[num_rqst++]); 139 139 break; 140 140 case SMB2_OP_SET_EOF: ··· 149 149 COMPOUND_FID, current->tgid, 150 150 FILE_END_OF_FILE_INFORMATION, 151 151 SMB2_O_INFO_FILE, 0, data, size); 152 - smb2_set_next_command(server, &rqst[num_rqst]); 152 + smb2_set_next_command(server, &rqst[num_rqst], 0); 153 153 smb2_set_related(&rqst[num_rqst++]); 154 154 break; 155 155 case SMB2_OP_SET_INFO: ··· 165 165 COMPOUND_FID, current->tgid, 166 166 FILE_BASIC_INFORMATION, 167 167 SMB2_O_INFO_FILE, 0, data, size); 168 - smb2_set_next_command(server, &rqst[num_rqst]); 168 + smb2_set_next_command(server, &rqst[num_rqst], 0); 169 169 smb2_set_related(&rqst[num_rqst++]); 170 170 break; 171 171 case SMB2_OP_RENAME: ··· 189 189 COMPOUND_FID, current->tgid, 190 190 FILE_RENAME_INFORMATION, 191 191 SMB2_O_INFO_FILE, 0, data, size); 192 - smb2_set_next_command(server, &rqst[num_rqst]); 192 + smb2_set_next_command(server, &rqst[num_rqst], 0); 193 193 smb2_set_related(&rqst[num_rqst++]); 194 194 break; 195 195 case SMB2_OP_HARDLINK: ··· 213 213 COMPOUND_FID, current->tgid, 214 214 FILE_LINK_INFORMATION, 215 215 SMB2_O_INFO_FILE, 0, data, size); 216 - smb2_set_next_command(server, &rqst[num_rqst]); 216 + smb2_set_next_command(server, &rqst[num_rqst], 0); 217 217 smb2_set_related(&rqst[num_rqst++]); 218 218 break; 219 219 default:
+15 -8
fs/cifs/smb2ops.c
··· 1194 1194 rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, path); 1195 1195 if (rc) 1196 1196 goto iqinf_exit; 1197 - smb2_set_next_command(ses->server, &rqst[0]); 1197 + smb2_set_next_command(ses->server, &rqst[0], 0); 1198 1198 1199 1199 /* Query */ 1200 1200 memset(&qi_iov, 0, sizeof(qi_iov)); ··· 1208 1208 qi.output_buffer_length, buffer); 1209 1209 if (rc) 1210 1210 goto iqinf_exit; 1211 - smb2_set_next_command(ses->server, &rqst[1]); 1211 + smb2_set_next_command(ses->server, &rqst[1], 0); 1212 1212 smb2_set_related(&rqst[1]); 1213 1213 1214 1214 /* Close */ ··· 1761 1761 char smb2_padding[7] = {0, 0, 0, 0, 0, 0, 0}; 1762 1762 1763 1763 void 1764 - smb2_set_next_command(struct TCP_Server_Info *server, struct smb_rqst *rqst) 1764 + smb2_set_next_command(struct TCP_Server_Info *server, struct smb_rqst *rqst, 1765 + bool has_space_for_padding) 1765 1766 { 1766 1767 struct smb2_sync_hdr *shdr; 1767 1768 unsigned long len = smb_rqst_len(server, rqst); 1768 1769 1769 1770 /* SMB headers in a compound are 8 byte aligned. */ 1770 1771 if (len & 7) { 1771 - rqst->rq_iov[rqst->rq_nvec].iov_base = smb2_padding; 1772 - rqst->rq_iov[rqst->rq_nvec].iov_len = 8 - (len & 7); 1773 - rqst->rq_nvec++; 1772 + if (has_space_for_padding) { 1773 + len = rqst->rq_iov[rqst->rq_nvec - 1].iov_len; 1774 + rqst->rq_iov[rqst->rq_nvec - 1].iov_len = 1775 + (len + 7) & ~7; 1776 + } else { 1777 + rqst->rq_iov[rqst->rq_nvec].iov_base = smb2_padding; 1778 + rqst->rq_iov[rqst->rq_nvec].iov_len = 8 - (len & 7); 1779 + rqst->rq_nvec++; 1780 + } 1774 1781 len = smb_rqst_len(server, rqst); 1775 1782 } 1776 1783 ··· 1827 1820 rc = SMB2_open_init(tcon, &rqst[0], &oplock, &oparms, &srch_path); 1828 1821 if (rc) 1829 1822 goto qfs_exit; 1830 - smb2_set_next_command(server, &rqst[0]); 1823 + smb2_set_next_command(server, &rqst[0], 0); 1831 1824 1832 1825 memset(&qi_iov, 0, sizeof(qi_iov)); 1833 1826 rqst[1].rq_iov = qi_iov; ··· 1840 1833 NULL); 1841 1834 if (rc) 1842 1835 goto qfs_exit; 1843 - smb2_set_next_command(server, &rqst[1]); 1836 + smb2_set_next_command(server, &rqst[1], 0); 1844 1837 smb2_set_related(&rqst[1]); 1845 1838 1846 1839 memset(&close_iov, 0, sizeof(close_iov));
+2 -1
fs/cifs/smb2proto.h
··· 117 117 extern unsigned long smb_rqst_len(struct TCP_Server_Info *server, 118 118 struct smb_rqst *rqst); 119 119 extern void smb2_set_next_command(struct TCP_Server_Info *server, 120 - struct smb_rqst *rqst); 120 + struct smb_rqst *rqst, 121 + bool has_space_for_padding); 121 122 extern void smb2_set_related(struct smb_rqst *rqst); 122 123 123 124 /*