diff options
author | Steve French <sfrench@us.ibm.com> | 2008-08-08 17:10:16 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2008-08-08 17:10:16 -0400 |
commit | ad8b15f0ffc297cdd6c65ef7552b3b8abd11a401 (patch) | |
tree | ee3fedbfb1e3be88898de6297e82f7e89cbac17d /fs | |
parent | 0510eeb7367aca017c6320d04cfd9cbc3b5dd992 (diff) |
[CIFS] list entry can not return null
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/cifs_debug.c | 53 | ||||
-rw-r--r-- | fs/cifs/cifsfs.c | 71 | ||||
-rw-r--r-- | fs/cifs/cifssmb.c | 3 | ||||
-rw-r--r-- | fs/cifs/connect.c | 8 |
4 files changed, 61 insertions, 74 deletions
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c index 688a2d42153f..69a12aae91d3 100644 --- a/fs/cifs/cifs_debug.c +++ b/fs/cifs/cifs_debug.c | |||
@@ -79,27 +79,25 @@ void cifs_dump_mids(struct TCP_Server_Info *server) | |||
79 | spin_lock(&GlobalMid_Lock); | 79 | spin_lock(&GlobalMid_Lock); |
80 | list_for_each(tmp, &server->pending_mid_q) { | 80 | list_for_each(tmp, &server->pending_mid_q) { |
81 | mid_entry = list_entry(tmp, struct mid_q_entry, qhead); | 81 | mid_entry = list_entry(tmp, struct mid_q_entry, qhead); |
82 | if (mid_entry) { | 82 | cERROR(1, ("State: %d Cmd: %d Pid: %d Tsk: %p Mid %d", |
83 | cERROR(1, ("State: %d Cmd: %d Pid: %d Tsk: %p Mid %d", | 83 | mid_entry->midState, |
84 | mid_entry->midState, | 84 | (int)mid_entry->command, |
85 | (int)mid_entry->command, | 85 | mid_entry->pid, |
86 | mid_entry->pid, | 86 | mid_entry->tsk, |
87 | mid_entry->tsk, | 87 | mid_entry->mid)); |
88 | mid_entry->mid)); | ||
89 | #ifdef CONFIG_CIFS_STATS2 | 88 | #ifdef CONFIG_CIFS_STATS2 |
90 | cERROR(1, ("IsLarge: %d buf: %p time rcv: %ld now: %ld", | 89 | cERROR(1, ("IsLarge: %d buf: %p time rcv: %ld now: %ld", |
91 | mid_entry->largeBuf, | 90 | mid_entry->largeBuf, |
92 | mid_entry->resp_buf, | 91 | mid_entry->resp_buf, |
93 | mid_entry->when_received, | 92 | mid_entry->when_received, |
94 | jiffies)); | 93 | jiffies)); |
95 | #endif /* STATS2 */ | 94 | #endif /* STATS2 */ |
96 | cERROR(1, ("IsMult: %d IsEnd: %d", mid_entry->multiRsp, | 95 | cERROR(1, ("IsMult: %d IsEnd: %d", mid_entry->multiRsp, |
97 | mid_entry->multiEnd)); | 96 | mid_entry->multiEnd)); |
98 | if (mid_entry->resp_buf) { | 97 | if (mid_entry->resp_buf) { |
99 | cifs_dump_detail(mid_entry->resp_buf); | 98 | cifs_dump_detail(mid_entry->resp_buf); |
100 | cifs_dump_mem("existing buf: ", | 99 | cifs_dump_mem("existing buf: ", |
101 | mid_entry->resp_buf, 62); | 100 | mid_entry->resp_buf, 62); |
102 | } | ||
103 | } | 101 | } |
104 | } | 102 | } |
105 | spin_unlock(&GlobalMid_Lock); | 103 | spin_unlock(&GlobalMid_Lock); |
@@ -163,16 +161,13 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v) | |||
163 | mid_entry = list_entry(tmp1, struct | 161 | mid_entry = list_entry(tmp1, struct |
164 | mid_q_entry, | 162 | mid_q_entry, |
165 | qhead); | 163 | qhead); |
166 | if (mid_entry) { | 164 | seq_printf(m, "State: %d com: %d pid:" |
167 | seq_printf(m, | 165 | " %d tsk: %p mid %d\n", |
168 | "State: %d com: %d pid:" | 166 | mid_entry->midState, |
169 | " %d tsk: %p mid %d\n", | 167 | (int)mid_entry->command, |
170 | mid_entry->midState, | 168 | mid_entry->pid, |
171 | (int)mid_entry->command, | 169 | mid_entry->tsk, |
172 | mid_entry->pid, | 170 | mid_entry->mid); |
173 | mid_entry->tsk, | ||
174 | mid_entry->mid); | ||
175 | } | ||
176 | } | 171 | } |
177 | spin_unlock(&GlobalMid_Lock); | 172 | spin_unlock(&GlobalMid_Lock); |
178 | } | 173 | } |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 1ec7076f7b24..e8da4ee761b5 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -930,36 +930,34 @@ static int cifs_oplock_thread(void *dummyarg) | |||
930 | schedule_timeout(39*HZ); | 930 | schedule_timeout(39*HZ); |
931 | } else { | 931 | } else { |
932 | oplock_item = list_entry(GlobalOplock_Q.next, | 932 | oplock_item = list_entry(GlobalOplock_Q.next, |
933 | struct oplock_q_entry, qhead); | 933 | struct oplock_q_entry, qhead); |
934 | if (oplock_item) { | 934 | cFYI(1, ("found oplock item to write out")); |
935 | cFYI(1, ("found oplock item to write out")); | 935 | pTcon = oplock_item->tcon; |
936 | pTcon = oplock_item->tcon; | 936 | inode = oplock_item->pinode; |
937 | inode = oplock_item->pinode; | 937 | netfid = oplock_item->netfid; |
938 | netfid = oplock_item->netfid; | 938 | spin_unlock(&GlobalMid_Lock); |
939 | spin_unlock(&GlobalMid_Lock); | 939 | DeleteOplockQEntry(oplock_item); |
940 | DeleteOplockQEntry(oplock_item); | 940 | /* can not grab inode sem here since it would |
941 | /* can not grab inode sem here since it would | ||
942 | deadlock when oplock received on delete | 941 | deadlock when oplock received on delete |
943 | since vfs_unlink holds the i_mutex across | 942 | since vfs_unlink holds the i_mutex across |
944 | the call */ | 943 | the call */ |
945 | /* mutex_lock(&inode->i_mutex);*/ | 944 | /* mutex_lock(&inode->i_mutex);*/ |
946 | if (S_ISREG(inode->i_mode)) { | 945 | if (S_ISREG(inode->i_mode)) { |
947 | rc = | 946 | rc = filemap_fdatawrite(inode->i_mapping); |
948 | filemap_fdatawrite(inode->i_mapping); | 947 | if (CIFS_I(inode)->clientCanCacheRead == 0) { |
949 | if (CIFS_I(inode)->clientCanCacheRead | 948 | waitrc = filemap_fdatawait( |
950 | == 0) { | 949 | inode->i_mapping); |
951 | waitrc = filemap_fdatawait(inode->i_mapping); | 950 | invalidate_remote_inode(inode); |
952 | invalidate_remote_inode(inode); | 951 | } |
953 | } | 952 | if (rc == 0) |
954 | if (rc == 0) | 953 | rc = waitrc; |
955 | rc = waitrc; | 954 | } else |
956 | } else | 955 | rc = 0; |
957 | rc = 0; | 956 | /* mutex_unlock(&inode->i_mutex);*/ |
958 | /* mutex_unlock(&inode->i_mutex);*/ | 957 | if (rc) |
959 | if (rc) | 958 | CIFS_I(inode)->write_behind_rc = rc; |
960 | CIFS_I(inode)->write_behind_rc = rc; | 959 | cFYI(1, ("Oplock flush inode %p rc %d", |
961 | cFYI(1, ("Oplock flush inode %p rc %d", | 960 | inode, rc)); |
962 | inode, rc)); | ||
963 | 961 | ||
964 | /* releasing stale oplock after recent reconnect | 962 | /* releasing stale oplock after recent reconnect |
965 | of smb session using a now incorrect file | 963 | of smb session using a now incorrect file |
@@ -967,15 +965,13 @@ static int cifs_oplock_thread(void *dummyarg) | |||
967 | not bother sending an oplock release if session | 965 | not bother sending an oplock release if session |
968 | to server still is disconnected since oplock | 966 | to server still is disconnected since oplock |
969 | already released by the server in that case */ | 967 | already released by the server in that case */ |
970 | if (pTcon->tidStatus != CifsNeedReconnect) { | 968 | if (pTcon->tidStatus != CifsNeedReconnect) { |
971 | rc = CIFSSMBLock(0, pTcon, netfid, | 969 | rc = CIFSSMBLock(0, pTcon, netfid, |
972 | 0 /* len */ , 0 /* offset */, 0, | 970 | 0 /* len */ , 0 /* offset */, 0, |
973 | 0, LOCKING_ANDX_OPLOCK_RELEASE, | 971 | 0, LOCKING_ANDX_OPLOCK_RELEASE, |
974 | false /* wait flag */); | 972 | false /* wait flag */); |
975 | cFYI(1, ("Oplock release rc = %d", rc)); | 973 | cFYI(1, ("Oplock release rc = %d", rc)); |
976 | } | 974 | } |
977 | } else | ||
978 | spin_unlock(&GlobalMid_Lock); | ||
979 | set_current_state(TASK_INTERRUPTIBLE); | 975 | set_current_state(TASK_INTERRUPTIBLE); |
980 | schedule_timeout(1); /* yield in case q were corrupt */ | 976 | schedule_timeout(1); /* yield in case q were corrupt */ |
981 | } | 977 | } |
@@ -1001,8 +997,7 @@ static int cifs_dnotify_thread(void *dummyarg) | |||
1001 | list_for_each(tmp, &GlobalSMBSessionList) { | 997 | list_for_each(tmp, &GlobalSMBSessionList) { |
1002 | ses = list_entry(tmp, struct cifsSesInfo, | 998 | ses = list_entry(tmp, struct cifsSesInfo, |
1003 | cifsSessionList); | 999 | cifsSessionList); |
1004 | if (ses && ses->server && | 1000 | if (ses->server && atomic_read(&ses->server->inFlight)) |
1005 | atomic_read(&ses->server->inFlight)) | ||
1006 | wake_up_all(&ses->server->response_q); | 1001 | wake_up_all(&ses->server->response_q); |
1007 | } | 1002 | } |
1008 | read_unlock(&GlobalSMBSeslock); | 1003 | read_unlock(&GlobalSMBSeslock); |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 6e8e8fc04c02..994de7c90474 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -128,8 +128,7 @@ static void mark_open_files_invalid(struct cifsTconInfo *pTcon) | |||
128 | write_lock(&GlobalSMBSeslock); | 128 | write_lock(&GlobalSMBSeslock); |
129 | list_for_each_safe(tmp, tmp1, &pTcon->openFileList) { | 129 | list_for_each_safe(tmp, tmp1, &pTcon->openFileList) { |
130 | open_file = list_entry(tmp, struct cifsFileInfo, tlist); | 130 | open_file = list_entry(tmp, struct cifsFileInfo, tlist); |
131 | if (open_file) | 131 | open_file->invalidHandle = true; |
132 | open_file->invalidHandle = true; | ||
133 | } | 132 | } |
134 | write_unlock(&GlobalSMBSeslock); | 133 | write_unlock(&GlobalSMBSeslock); |
135 | /* BB Add call to invalidate_inodes(sb) for all superblocks mounted | 134 | /* BB Add call to invalidate_inodes(sb) for all superblocks mounted |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index ff4345db7201..0711db65afe8 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -151,7 +151,7 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
151 | } | 151 | } |
152 | list_for_each(tmp, &GlobalTreeConnectionList) { | 152 | list_for_each(tmp, &GlobalTreeConnectionList) { |
153 | tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); | 153 | tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList); |
154 | if ((tcon) && (tcon->ses) && (tcon->ses->server == server)) | 154 | if ((tcon->ses) && (tcon->ses->server == server)) |
155 | tcon->tidStatus = CifsNeedReconnect; | 155 | tcon->tidStatus = CifsNeedReconnect; |
156 | } | 156 | } |
157 | read_unlock(&GlobalSMBSeslock); | 157 | read_unlock(&GlobalSMBSeslock); |
@@ -173,14 +173,12 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
173 | mid_entry = list_entry(tmp, struct | 173 | mid_entry = list_entry(tmp, struct |
174 | mid_q_entry, | 174 | mid_q_entry, |
175 | qhead); | 175 | qhead); |
176 | if (mid_entry) { | 176 | if (mid_entry->midState == MID_REQUEST_SUBMITTED) { |
177 | if (mid_entry->midState == MID_REQUEST_SUBMITTED) { | ||
178 | /* Mark other intransit requests as needing | 177 | /* Mark other intransit requests as needing |
179 | retry so we do not immediately mark the | 178 | retry so we do not immediately mark the |
180 | session bad again (ie after we reconnect | 179 | session bad again (ie after we reconnect |
181 | below) as they timeout too */ | 180 | below) as they timeout too */ |
182 | mid_entry->midState = MID_RETRY_NEEDED; | 181 | mid_entry->midState = MID_RETRY_NEEDED; |
183 | } | ||
184 | } | 182 | } |
185 | } | 183 | } |
186 | spin_unlock(&GlobalMid_Lock); | 184 | spin_unlock(&GlobalMid_Lock); |