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/cifs/cifsfs.c | |
parent | 0510eeb7367aca017c6320d04cfd9cbc3b5dd992 (diff) |
[CIFS] list entry can not return null
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/cifs/cifsfs.c')
-rw-r--r-- | fs/cifs/cifsfs.c | 71 |
1 files changed, 33 insertions, 38 deletions
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); |