|
@@ -584,10 +584,26 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
|
|
|
* If either that or op not supported returned, follow
|
|
|
* the normal lookup.
|
|
|
*/
|
|
|
- if ((rc == 0) || (rc == -ENOENT))
|
|
|
+ switch (rc) {
|
|
|
+ case 0:
|
|
|
+ /*
|
|
|
+ * The server may allow us to open things like
|
|
|
+ * FIFOs, but the client isn't set up to deal
|
|
|
+ * with that. If it's not a regular file, just
|
|
|
+ * close it and proceed as if it were a normal
|
|
|
+ * lookup.
|
|
|
+ */
|
|
|
+ if (newInode && !S_ISREG(newInode->i_mode)) {
|
|
|
+ CIFSSMBClose(xid, pTcon, fileHandle);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case -ENOENT:
|
|
|
posix_open = true;
|
|
|
- else if ((rc == -EINVAL) || (rc != -EOPNOTSUPP))
|
|
|
+ case -EOPNOTSUPP:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
pTcon->broken_posix_open = true;
|
|
|
+ }
|
|
|
}
|
|
|
if (!posix_open)
|
|
|
rc = cifs_get_inode_info_unix(&newInode, full_path,
|