diff options
Diffstat (limited to 'fs/cifs/cifsfs.c')
| -rw-r--r-- | fs/cifs/cifsfs.c | 75 |
1 files changed, 35 insertions, 40 deletions
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 22857c639df5..e8da4ee761b5 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
| @@ -267,7 +267,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 267 | return 0; | 267 | return 0; |
| 268 | } | 268 | } |
| 269 | 269 | ||
| 270 | static int cifs_permission(struct inode *inode, int mask, struct nameidata *nd) | 270 | static int cifs_permission(struct inode *inode, int mask) |
| 271 | { | 271 | { |
| 272 | struct cifs_sb_info *cifs_sb; | 272 | struct cifs_sb_info *cifs_sb; |
| 273 | 273 | ||
| @@ -766,7 +766,7 @@ const struct file_operations cifs_dir_ops = { | |||
| 766 | }; | 766 | }; |
| 767 | 767 | ||
| 768 | static void | 768 | static void |
| 769 | cifs_init_once(struct kmem_cache *cachep, void *inode) | 769 | cifs_init_once(void *inode) |
| 770 | { | 770 | { |
| 771 | struct cifsInodeInfo *cifsi = inode; | 771 | struct cifsInodeInfo *cifsi = inode; |
| 772 | 772 | ||
| @@ -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); |
