diff options
-rw-r--r-- | fs/cifs/cifsproto.h | 3 | ||||
-rw-r--r-- | fs/cifs/dir.c | 40 | ||||
-rw-r--r-- | fs/cifs/file.c | 6 |
3 files changed, 22 insertions, 27 deletions
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h index 781676e9cfc3..ca6a0d9130cb 100644 --- a/fs/cifs/cifsproto.h +++ b/fs/cifs/cifsproto.h | |||
@@ -105,8 +105,7 @@ extern u64 cifs_UnixTimeToNT(struct timespec); | |||
105 | extern struct timespec cnvrtDosUnixTm(__le16 le_date, __le16 le_time, | 105 | extern struct timespec cnvrtDosUnixTm(__le16 le_date, __le16 le_time, |
106 | int offset); | 106 | int offset); |
107 | 107 | ||
108 | extern struct cifsFileInfo *cifs_new_fileinfo(struct inode *newinode, | 108 | extern struct cifsFileInfo *cifs_new_fileinfo(__u16 fileHandle, struct file *file, |
109 | __u16 fileHandle, struct file *file, | ||
110 | struct tcon_link *tlink, __u32 oplock); | 109 | struct tcon_link *tlink, __u32 oplock); |
111 | extern int cifs_posix_open(char *full_path, struct inode **pinode, | 110 | extern int cifs_posix_open(char *full_path, struct inode **pinode, |
112 | struct super_block *sb, | 111 | struct super_block *sb, |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index ce1fa3027b23..36cf3e2ec252 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -131,12 +131,13 @@ cifs_bp_rename_retry: | |||
131 | } | 131 | } |
132 | 132 | ||
133 | struct cifsFileInfo * | 133 | struct cifsFileInfo * |
134 | cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle, struct file *file, | 134 | cifs_new_fileinfo(__u16 fileHandle, struct file *file, |
135 | struct tcon_link *tlink, __u32 oplock) | 135 | struct tcon_link *tlink, __u32 oplock) |
136 | { | 136 | { |
137 | struct dentry *dentry = file->f_path.dentry; | 137 | struct dentry *dentry = file->f_path.dentry; |
138 | struct inode *inode = dentry->d_inode; | ||
139 | struct cifsInodeInfo *pCifsInode = CIFS_I(inode); | ||
138 | struct cifsFileInfo *pCifsFile; | 140 | struct cifsFileInfo *pCifsFile; |
139 | struct cifsInodeInfo *pCifsInode; | ||
140 | 141 | ||
141 | pCifsFile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL); | 142 | pCifsFile = kzalloc(sizeof(struct cifsFileInfo), GFP_KERNEL); |
142 | if (pCifsFile == NULL) | 143 | if (pCifsFile == NULL) |
@@ -158,24 +159,20 @@ cifs_new_fileinfo(struct inode *newinode, __u16 fileHandle, struct file *file, | |||
158 | 159 | ||
159 | write_lock(&GlobalSMBSeslock); | 160 | write_lock(&GlobalSMBSeslock); |
160 | list_add(&pCifsFile->tlist, &(tlink_tcon(tlink)->openFileList)); | 161 | list_add(&pCifsFile->tlist, &(tlink_tcon(tlink)->openFileList)); |
161 | pCifsInode = CIFS_I(newinode); | 162 | /* if readable file instance put first in list*/ |
162 | if (pCifsInode) { | 163 | if (file->f_mode & FMODE_READ) |
163 | /* if readable file instance put first in list*/ | 164 | list_add(&pCifsFile->flist, &pCifsInode->openFileList); |
164 | if (file->f_mode & FMODE_READ) | 165 | else |
165 | list_add(&pCifsFile->flist, &pCifsInode->openFileList); | 166 | list_add_tail(&pCifsFile->flist, &pCifsInode->openFileList); |
166 | else | ||
167 | list_add_tail(&pCifsFile->flist, | ||
168 | &pCifsInode->openFileList); | ||
169 | |||
170 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { | ||
171 | pCifsInode->clientCanCacheAll = true; | ||
172 | pCifsInode->clientCanCacheRead = true; | ||
173 | cFYI(1, "Exclusive Oplock inode %p", newinode); | ||
174 | } else if ((oplock & 0xF) == OPLOCK_READ) | ||
175 | pCifsInode->clientCanCacheRead = true; | ||
176 | } | ||
177 | write_unlock(&GlobalSMBSeslock); | 167 | write_unlock(&GlobalSMBSeslock); |
178 | 168 | ||
169 | if ((oplock & 0xF) == OPLOCK_EXCLUSIVE) { | ||
170 | pCifsInode->clientCanCacheAll = true; | ||
171 | pCifsInode->clientCanCacheRead = true; | ||
172 | cFYI(1, "Exclusive Oplock inode %p", inode); | ||
173 | } else if ((oplock & 0xF) == OPLOCK_READ) | ||
174 | pCifsInode->clientCanCacheRead = true; | ||
175 | |||
179 | file->private_data = pCifsFile; | 176 | file->private_data = pCifsFile; |
180 | 177 | ||
181 | return pCifsFile; | 178 | return pCifsFile; |
@@ -395,8 +392,7 @@ cifs_create_set_dentry: | |||
395 | goto cifs_create_out; | 392 | goto cifs_create_out; |
396 | } | 393 | } |
397 | 394 | ||
398 | pfile_info = cifs_new_fileinfo(newinode, fileHandle, filp, | 395 | pfile_info = cifs_new_fileinfo(fileHandle, filp, tlink, oplock); |
399 | tlink, oplock); | ||
400 | if (pfile_info == NULL) { | 396 | if (pfile_info == NULL) { |
401 | fput(filp); | 397 | fput(filp); |
402 | CIFSSMBClose(xid, tcon, fileHandle); | 398 | CIFSSMBClose(xid, tcon, fileHandle); |
@@ -669,8 +665,8 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
669 | goto lookup_out; | 665 | goto lookup_out; |
670 | } | 666 | } |
671 | 667 | ||
672 | cfile = cifs_new_fileinfo(newInode, fileHandle, filp, | 668 | cfile = cifs_new_fileinfo(fileHandle, filp, tlink, |
673 | tlink, oplock); | 669 | oplock); |
674 | if (cfile == NULL) { | 670 | if (cfile == NULL) { |
675 | fput(filp); | 671 | fput(filp); |
676 | CIFSSMBClose(xid, pTcon, fileHandle); | 672 | CIFSSMBClose(xid, pTcon, fileHandle); |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 774e3ac1208b..394cf28f080d 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -272,8 +272,8 @@ int cifs_open(struct inode *inode, struct file *file) | |||
272 | if (rc == 0) { | 272 | if (rc == 0) { |
273 | cFYI(1, "posix open succeeded"); | 273 | cFYI(1, "posix open succeeded"); |
274 | 274 | ||
275 | pCifsFile = cifs_new_fileinfo(inode, netfid, file, | 275 | pCifsFile = cifs_new_fileinfo(netfid, file, tlink, |
276 | tlink, oplock); | 276 | oplock); |
277 | if (pCifsFile == NULL) { | 277 | if (pCifsFile == NULL) { |
278 | CIFSSMBClose(xid, tcon, netfid); | 278 | CIFSSMBClose(xid, tcon, netfid); |
279 | rc = -ENOMEM; | 279 | rc = -ENOMEM; |
@@ -365,7 +365,7 @@ int cifs_open(struct inode *inode, struct file *file) | |||
365 | if (rc != 0) | 365 | if (rc != 0) |
366 | goto out; | 366 | goto out; |
367 | 367 | ||
368 | pCifsFile = cifs_new_fileinfo(inode, netfid, file, tlink, oplock); | 368 | pCifsFile = cifs_new_fileinfo(netfid, file, tlink, oplock); |
369 | if (pCifsFile == NULL) { | 369 | if (pCifsFile == NULL) { |
370 | rc = -ENOMEM; | 370 | rc = -ENOMEM; |
371 | goto out; | 371 | goto out; |