CC: [email protected] BCC: [email protected] CC: [email protected] CC: [email protected] TO: Ronnie Sahlberg <[email protected]> CC: Steve French <[email protected]>
tree: git://git.samba.org/sfrench/cifs-2.6.git for-next head: 4cfa6d6563b6179714e4133fd98d301b5b10bf6a commit: 4cfa6d6563b6179714e4133fd98d301b5b10bf6a [1/1] cifs: cache dirent names for cached directories :::::: branch date: 6 hours ago :::::: commit date: 6 hours ago config: x86_64-randconfig-m001 (https://download.01.org/0day-ci/archive/20220503/[email protected]/config) compiler: gcc-11 (Debian 11.2.0-20) 11.2.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> smatch warnings: fs/cifs/smb2ops.c:796 open_cached_dir() warn: variable dereferenced before check 'tcon' (see line 780) vim +/tcon +796 fs/cifs/smb2ops.c 9da6ec7775d2cd Ronnie Sahlberg 2018-07-31 770 3d4ef9a15343f0 Steve French 2018-04-25 771 /* 45c0f1aabea9e6 Ronnie Sahlberg 2021-03-09 772 * Open the and cache a directory handle. 45c0f1aabea9e6 Ronnie Sahlberg 2021-03-09 773 * Only supported for the root handle. 3d4ef9a15343f0 Steve French 2018-04-25 774 */ 45c0f1aabea9e6 Ronnie Sahlberg 2021-03-09 775 int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon, e6eb19504e2360 Ronnie Sahlberg 2021-03-09 776 const char *path, 9e81e8ff74b90a Ronnie Sahlberg 2020-10-05 777 struct cifs_sb_info *cifs_sb, 9e81e8ff74b90a Ronnie Sahlberg 2020-10-05 778 struct cached_fid **cfid) 3d4ef9a15343f0 Steve French 2018-04-25 779 { b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 @780 struct cifs_ses *ses = tcon->ses; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 781 struct TCP_Server_Info *server = ses->server; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 782 struct cifs_open_parms oparms; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 783 struct smb2_create_rsp *o_rsp = NULL; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 784 struct smb2_query_info_rsp *qi_rsp = NULL; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 785 int resp_buftype[2]; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 786 struct smb_rqst rqst[2]; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 787 struct kvec rsp_iov[2]; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 788 struct kvec open_iov[SMB2_CREATE_IOV_SIZE]; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 789 struct kvec qi_iov[1]; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 790 int rc, flags = 0; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 791 __le16 utf16_path = 0; /* Null - since an open of top of share */ a93864d93977b9 Ronnie Sahlberg 2018-06-14 792 u8 oplock = SMB2_OPLOCK_LEVEL_II; 9e81e8ff74b90a Ronnie Sahlberg 2020-10-05 793 struct cifs_fid *pfid; 5e9c89d43fa6f5 Ronnie Sahlberg 2021-03-09 794 struct dentry *dentry; 3d4ef9a15343f0 Steve French 2018-04-25 795 4cfa6d6563b617 Ronnie Sahlberg 2022-05-03 @796 if (tcon == NULL || tcon->nohandlecache || 4cfa6d6563b617 Ronnie Sahlberg 2022-05-03 797 is_smb1_server(tcon->ses->server)) 4df3d976dda246 Ronnie Sahlberg 2021-03-09 798 return -ENOTSUPP; 4df3d976dda246 Ronnie Sahlberg 2021-03-09 799 269f67e1ffead6 Ronnie Sahlberg 2021-03-09 800 if (cifs_sb->root == NULL) 269f67e1ffead6 Ronnie Sahlberg 2021-03-09 801 return -ENOENT; 269f67e1ffead6 Ronnie Sahlberg 2021-03-09 802 e6eb19504e2360 Ronnie Sahlberg 2021-03-09 803 if (strlen(path)) 269f67e1ffead6 Ronnie Sahlberg 2021-03-09 804 return -ENOENT; e6eb19504e2360 Ronnie Sahlberg 2021-03-09 805 5e9c89d43fa6f5 Ronnie Sahlberg 2021-03-09 806 dentry = cifs_sb->root; 5e9c89d43fa6f5 Ronnie Sahlberg 2021-03-09 807 a93864d93977b9 Ronnie Sahlberg 2018-06-14 808 mutex_lock(&tcon->crfid.fid_mutex); a93864d93977b9 Ronnie Sahlberg 2018-06-14 809 if (tcon->crfid.is_valid) { 3d4ef9a15343f0 Steve French 2018-04-25 810 cifs_dbg(FYI, "found a cached root file handle\n"); 9e81e8ff74b90a Ronnie Sahlberg 2020-10-05 811 *cfid = &tcon->crfid; 9da6ec7775d2cd Ronnie Sahlberg 2018-07-31 812 kref_get(&tcon->crfid.refcount); a93864d93977b9 Ronnie Sahlberg 2018-06-14 813 mutex_unlock(&tcon->crfid.fid_mutex); 3d4ef9a15343f0 Steve French 2018-04-25 814 return 0; 3d4ef9a15343f0 Steve French 2018-04-25 815 } 3d4ef9a15343f0 Steve French 2018-04-25 816 96d9f7ed00b861 Steve French 2019-09-12 817 /* 96d9f7ed00b861 Steve French 2019-09-12 818 * We do not hold the lock for the open because in case 96d9f7ed00b861 Steve French 2019-09-12 819 * SMB2_open needs to reconnect, it will end up calling 96d9f7ed00b861 Steve French 2019-09-12 820 * cifs_mark_open_files_invalid() which takes the lock again 96d9f7ed00b861 Steve French 2019-09-12 821 * thus causing a deadlock 96d9f7ed00b861 Steve French 2019-09-12 822 */ 96d9f7ed00b861 Steve French 2019-09-12 823 96d9f7ed00b861 Steve French 2019-09-12 824 mutex_unlock(&tcon->crfid.fid_mutex); 96d9f7ed00b861 Steve French 2019-09-12 825 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 826 if (smb3_encryption_required(tcon)) b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 827 flags |= CIFS_TRANSFORM_REQ; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 828 0fe0781f29dd8a Paulo Alcantara 2020-04-20 829 if (!server->ops->new_lease_key) 0fe0781f29dd8a Paulo Alcantara 2020-04-20 830 return -EIO; 0fe0781f29dd8a Paulo Alcantara 2020-04-20 831 9e81e8ff74b90a Ronnie Sahlberg 2020-10-05 832 pfid = tcon->crfid.fid; 0fe0781f29dd8a Paulo Alcantara 2020-04-20 833 server->ops->new_lease_key(pfid); 0fe0781f29dd8a Paulo Alcantara 2020-04-20 834 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 835 memset(rqst, 0, sizeof(rqst)); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 836 resp_buftype[0] = resp_buftype[1] = CIFS_NO_BUFFER; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 837 memset(rsp_iov, 0, sizeof(rsp_iov)); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 838 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 839 /* Open */ b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 840 memset(&open_iov, 0, sizeof(open_iov)); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 841 rqst[0].rq_iov = open_iov; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 842 rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 843 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 844 oparms.tcon = tcon; 0f060936e490c6 Amir Goldstein 2020-02-03 845 oparms.create_options = cifs_create_options(cifs_sb, 0); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 846 oparms.desired_access = FILE_READ_ATTRIBUTES; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 847 oparms.disposition = FILE_OPEN; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 848 oparms.fid = pfid; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 849 oparms.reconnect = false; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 850 352d96f3acc6e0 Aurelien Aptel 2020-05-31 851 rc = SMB2_open_init(tcon, server, 352d96f3acc6e0 Aurelien Aptel 2020-05-31 852 &rqst[0], &oplock, &oparms, &utf16_path); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 853 if (rc) 96d9f7ed00b861 Steve French 2019-09-12 854 goto oshr_free; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 855 smb2_set_next_command(tcon, &rqst[0]); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 856 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 857 memset(&qi_iov, 0, sizeof(qi_iov)); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 858 rqst[1].rq_iov = qi_iov; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 859 rqst[1].rq_nvec = 1; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 860 352d96f3acc6e0 Aurelien Aptel 2020-05-31 861 rc = SMB2_query_info_init(tcon, server, 352d96f3acc6e0 Aurelien Aptel 2020-05-31 862 &rqst[1], COMPOUND_FID, b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 863 COMPOUND_FID, FILE_ALL_INFORMATION, b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 864 SMB2_O_INFO_FILE, 0, b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 865 sizeof(struct smb2_file_all_info) + b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 866 PATH_MAX * 2, 0, NULL); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 867 if (rc) 96d9f7ed00b861 Steve French 2019-09-12 868 goto oshr_free; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 869 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 870 smb2_set_related(&rqst[1]); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 871 352d96f3acc6e0 Aurelien Aptel 2020-05-31 872 rc = compound_send_recv(xid, ses, server, 352d96f3acc6e0 Aurelien Aptel 2020-05-31 873 flags, 2, rqst, b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 874 resp_buftype, rsp_iov); 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 875 mutex_lock(&tcon->crfid.fid_mutex); 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 876 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 877 /* 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 878 * Now we need to check again as the cached root might have 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 879 * been successfully re-opened from a concurrent process 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 880 */ 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 881 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 882 if (tcon->crfid.is_valid) { 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 883 /* work was already done */ 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 884 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 885 /* stash fids for close() later */ 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 886 struct cifs_fid fid = { 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 887 .persistent_fid = pfid->persistent_fid, 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 888 .volatile_fid = pfid->volatile_fid, 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 889 }; 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 890 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 891 /* ad7567bc65afe0 Muhammad Usama Anjum 2021-04-15 892 * caller expects this func to set the fid in crfid to valid ad7567bc65afe0 Muhammad Usama Anjum 2021-04-15 893 * cached root, so increment the refcount. 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 894 */ 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 895 kref_get(&tcon->crfid.refcount); 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 896 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 897 mutex_unlock(&tcon->crfid.fid_mutex); 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 898 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 899 if (rc == 0) { 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 900 /* close extra handle outside of crit sec */ 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 901 SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 902 } 77577de64167aa Xiyu Yang 2020-06-13 903 rc = 0; 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 904 goto oshr_free; 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 905 } 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 906 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 907 /* Cached root is still invalid, continue normaly */ 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 908 7dcc82c2dfd5f1 Steve French 2019-09-11 909 if (rc) { 7dcc82c2dfd5f1 Steve French 2019-09-11 910 if (rc == -EREMCHG) { 7dcc82c2dfd5f1 Steve French 2019-09-11 911 tcon->need_reconnect = true; a0a3036b81f1f6 Joe Perches 2020-04-14 912 pr_warn_once("server share %s deleted\n", 7dcc82c2dfd5f1 Steve French 2019-09-11 913 tcon->treeName); 7dcc82c2dfd5f1 Steve French 2019-09-11 914 } b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 915 goto oshr_exit; 7dcc82c2dfd5f1 Steve French 2019-09-11 916 } b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 917 d2f15428d6a0eb Steve French 2019-09-22 918 atomic_inc(&tcon->num_remote_opens); d2f15428d6a0eb Steve French 2019-09-22 919 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 920 o_rsp = (struct smb2_create_rsp *)rsp_iov[0].iov_base; 351a59dace0e0e Paulo Alcantara 2022-03-21 921 oparms.fid->persistent_fid = o_rsp->PersistentFileId; 351a59dace0e0e Paulo Alcantara 2022-03-21 922 oparms.fid->volatile_fid = o_rsp->VolatileFileId; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 923 #ifdef CONFIG_CIFS_DEBUG2 0d35e382e4e96a Ronnie Sahlberg 2021-11-05 924 oparms.fid->mid = le64_to_cpu(o_rsp->hdr.MessageId); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 925 #endif /* CIFS_DEBUG2 */ b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 926 a93864d93977b9 Ronnie Sahlberg 2018-06-14 927 tcon->crfid.tcon = tcon; a93864d93977b9 Ronnie Sahlberg 2018-06-14 928 tcon->crfid.is_valid = true; 5e9c89d43fa6f5 Ronnie Sahlberg 2021-03-09 929 tcon->crfid.dentry = dentry; 5e9c89d43fa6f5 Ronnie Sahlberg 2021-03-09 930 dget(dentry); 9da6ec7775d2cd Ronnie Sahlberg 2018-07-31 931 kref_init(&tcon->crfid.refcount); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 932 89a5bfa350faf8 Steve French 2019-07-18 933 /* BB TBD check to see if oplock level check can be removed below */ 2f94a3125b8742 Ronnie Sahlberg 2019-03-28 934 if (o_rsp->OplockLevel == SMB2_OPLOCK_LEVEL_LEASE) { ad7567bc65afe0 Muhammad Usama Anjum 2021-04-15 935 /* ad7567bc65afe0 Muhammad Usama Anjum 2021-04-15 936 * See commit 2f94a3125b87. Increment the refcount when we ad7567bc65afe0 Muhammad Usama Anjum 2021-04-15 937 * get a lease for root, release it if lease break occurs ad7567bc65afe0 Muhammad Usama Anjum 2021-04-15 938 */ 2f94a3125b8742 Ronnie Sahlberg 2019-03-28 939 kref_get(&tcon->crfid.refcount); d9191319358da1 Pavel Shilovsky 2019-12-10 940 tcon->crfid.has_lease = true; 89a5bfa350faf8 Steve French 2019-07-18 941 smb2_parse_contexts(server, o_rsp, 2f94a3125b8742 Ronnie Sahlberg 2019-03-28 942 &oparms.fid->epoch, 69dda3059e7a4d Aurelien Aptel 2020-03-02 943 oparms.fid->lease_key, &oplock, 69dda3059e7a4d Aurelien Aptel 2020-03-02 944 NULL, NULL); 2f94a3125b8742 Ronnie Sahlberg 2019-03-28 945 } else 2f94a3125b8742 Ronnie Sahlberg 2019-03-28 946 goto oshr_exit; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 947 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 948 qi_rsp = (struct smb2_query_info_rsp *)rsp_iov[1].iov_base; b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 949 if (le32_to_cpu(qi_rsp->OutputBufferLength) < sizeof(struct smb2_file_all_info)) b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 950 goto oshr_exit; 4811e3096daaa5 Ronnie Sahlberg 2019-04-01 951 if (!smb2_validate_and_copy_iov( b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 952 le16_to_cpu(qi_rsp->OutputBufferOffset), b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 953 sizeof(struct smb2_file_all_info), b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 954 &rsp_iov[1], sizeof(struct smb2_file_all_info), 4811e3096daaa5 Ronnie Sahlberg 2019-04-01 955 (char *)&tcon->crfid.file_all_info)) 720aec01262d49 zhengbin 2019-12-25 956 tcon->crfid.file_all_info_is_valid = true; ed20f54a3c63a9 Ronnie Sahlberg 2021-03-09 957 tcon->crfid.time = jiffies; ed20f54a3c63a9 Ronnie Sahlberg 2021-03-09 958 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 959 b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 960 oshr_exit: a93864d93977b9 Ronnie Sahlberg 2018-06-14 961 mutex_unlock(&tcon->crfid.fid_mutex); 7e5a70ad88b1e6 Aurelien Aptel 2019-07-17 962 oshr_free: b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 963 SMB2_open_free(&rqst[0]); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 964 SMB2_query_info_free(&rqst[1]); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 965 free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base); b0f6df737a1c5d Ronnie Sahlberg 2019-03-12 966 free_rsp_buf(resp_buftype[1], rsp_iov[1].iov_base); 9e81e8ff74b90a Ronnie Sahlberg 2020-10-05 967 if (rc == 0) 9e81e8ff74b90a Ronnie Sahlberg 2020-10-05 968 *cfid = &tcon->crfid; 3d4ef9a15343f0 Steve French 2018-04-25 969 return rc; 3d4ef9a15343f0 Steve French 2018-04-25 970 } 3d4ef9a15343f0 Steve French 2018-04-25 971 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
