aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
authorPavel Shilovsky <piastry@etersoft.ru>2014-01-16 06:53:36 -0500
committerSteve French <smfrench@gmail.com>2014-01-20 10:52:13 -0500
commitd81b8a40e2ece0a9ab57b1fe1798e291e75bf8fc (patch)
treea3fd90c8172375499b2ad8f5f21ba633a3e522b3 /fs/cifs
parent0360d605a236355f9501d21175e405536e2acd48 (diff)
CIFS: Cleanup cifs open codepath
Rename CIFSSMBOpen to CIFS_open and make it take cifs_open_parms structure as a parm. Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru> Signed-off-by: Steve French <smfrench@gmail.com>
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/cifsacl.c40
-rw-r--r--fs/cifs/cifsproto.h7
-rw-r--r--fs/cifs/cifssmb.c16
-rw-r--r--fs/cifs/dir.c21
-rw-r--r--fs/cifs/file.c2
-rw-r--r--fs/cifs/inode.c73
-rw-r--r--fs/cifs/link.c44
-rw-r--r--fs/cifs/smb1ops.c71
8 files changed, 174 insertions, 100 deletions
diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
index 51f5e0ee7237..8f9b4f710d4a 100644
--- a/fs/cifs/cifsacl.c
+++ b/fs/cifs/cifsacl.c
@@ -895,9 +895,10 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
895 int oplock = 0; 895 int oplock = 0;
896 unsigned int xid; 896 unsigned int xid;
897 int rc, create_options = 0; 897 int rc, create_options = 0;
898 __u16 fid;
899 struct cifs_tcon *tcon; 898 struct cifs_tcon *tcon;
900 struct tcon_link *tlink = cifs_sb_tlink(cifs_sb); 899 struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
900 struct cifs_fid fid;
901 struct cifs_open_parms oparms;
901 902
902 if (IS_ERR(tlink)) 903 if (IS_ERR(tlink))
903 return ERR_CAST(tlink); 904 return ERR_CAST(tlink);
@@ -908,12 +909,19 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
908 if (backup_cred(cifs_sb)) 909 if (backup_cred(cifs_sb))
909 create_options |= CREATE_OPEN_BACKUP_INTENT; 910 create_options |= CREATE_OPEN_BACKUP_INTENT;
910 911
911 rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, READ_CONTROL, 912 oparms.tcon = tcon;
912 create_options, &fid, &oplock, NULL, cifs_sb->local_nls, 913 oparms.cifs_sb = cifs_sb;
913 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 914 oparms.desired_access = READ_CONTROL;
915 oparms.create_options = create_options;
916 oparms.disposition = FILE_OPEN;
917 oparms.path = path;
918 oparms.fid = &fid;
919 oparms.reconnect = false;
920
921 rc = CIFS_open(xid, &oparms, &oplock, NULL);
914 if (!rc) { 922 if (!rc) {
915 rc = CIFSSMBGetCIFSACL(xid, tcon, fid, &pntsd, pacllen); 923 rc = CIFSSMBGetCIFSACL(xid, tcon, fid.netfid, &pntsd, pacllen);
916 CIFSSMBClose(xid, tcon, fid); 924 CIFSSMBClose(xid, tcon, fid.netfid);
917 } 925 }
918 926
919 cifs_put_tlink(tlink); 927 cifs_put_tlink(tlink);
@@ -950,10 +958,11 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
950 int oplock = 0; 958 int oplock = 0;
951 unsigned int xid; 959 unsigned int xid;
952 int rc, access_flags, create_options = 0; 960 int rc, access_flags, create_options = 0;
953 __u16 fid;
954 struct cifs_tcon *tcon; 961 struct cifs_tcon *tcon;
955 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 962 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
956 struct tcon_link *tlink = cifs_sb_tlink(cifs_sb); 963 struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
964 struct cifs_fid fid;
965 struct cifs_open_parms oparms;
957 966
958 if (IS_ERR(tlink)) 967 if (IS_ERR(tlink))
959 return PTR_ERR(tlink); 968 return PTR_ERR(tlink);
@@ -969,18 +978,25 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
969 else 978 else
970 access_flags = WRITE_DAC; 979 access_flags = WRITE_DAC;
971 980
972 rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, access_flags, 981 oparms.tcon = tcon;
973 create_options, &fid, &oplock, NULL, cifs_sb->local_nls, 982 oparms.cifs_sb = cifs_sb;
974 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 983 oparms.desired_access = access_flags;
984 oparms.create_options = create_options;
985 oparms.disposition = FILE_OPEN;
986 oparms.path = path;
987 oparms.fid = &fid;
988 oparms.reconnect = false;
989
990 rc = CIFS_open(xid, &oparms, &oplock, NULL);
975 if (rc) { 991 if (rc) {
976 cifs_dbg(VFS, "Unable to open file to set ACL\n"); 992 cifs_dbg(VFS, "Unable to open file to set ACL\n");
977 goto out; 993 goto out;
978 } 994 }
979 995
980 rc = CIFSSMBSetCIFSACL(xid, tcon, fid, pnntsd, acllen, aclflag); 996 rc = CIFSSMBSetCIFSACL(xid, tcon, fid.netfid, pnntsd, acllen, aclflag);
981 cifs_dbg(NOISY, "SetCIFSACL rc = %d\n", rc); 997 cifs_dbg(NOISY, "SetCIFSACL rc = %d\n", rc);
982 998
983 CIFSSMBClose(xid, tcon, fid); 999 CIFSSMBClose(xid, tcon, fid.netfid);
984out: 1000out:
985 free_xid(xid); 1001 free_xid(xid);
986 cifs_put_tlink(tlink); 1002 cifs_put_tlink(tlink);
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 582ae61f45b6..79e6e9a93a8c 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -362,11 +362,8 @@ extern int CIFSSMBQuerySymLink(const unsigned int xid, struct cifs_tcon *tcon,
362 const struct nls_table *nls_codepage); 362 const struct nls_table *nls_codepage);
363extern int CIFSSMB_set_compression(const unsigned int xid, 363extern int CIFSSMB_set_compression(const unsigned int xid,
364 struct cifs_tcon *tcon, __u16 fid); 364 struct cifs_tcon *tcon, __u16 fid);
365extern int CIFSSMBOpen(const unsigned int xid, struct cifs_tcon *tcon, 365extern int CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms,
366 const char *path, const int disposition, 366 int *oplock, FILE_ALL_INFO *buf);
367 const int desired_access, const int create_options,
368 __u16 *netfid, int *oplock, FILE_ALL_INFO *buf,
369 const struct nls_table *nls, int remap);
370extern int SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon, 367extern int SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon,
371 const char *fileName, const int disposition, 368 const char *fileName, const int disposition,
372 const int access_flags, const int omode, 369 const int access_flags, const int omode,
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 8e1ebc2dc0db..4d881c35eeca 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -1273,10 +1273,8 @@ OldOpenRetry:
1273} 1273}
1274 1274
1275int 1275int
1276CIFSSMBOpen(const unsigned int xid, struct cifs_tcon *tcon, 1276CIFS_open(const unsigned int xid, struct cifs_open_parms *oparms, int *oplock,
1277 const char *path, const int disposition, const int desired_access, 1277 FILE_ALL_INFO *buf)
1278 const int create_options, __u16 *netfid, int *oplock,
1279 FILE_ALL_INFO *buf, const struct nls_table *nls, int remap)
1280{ 1278{
1281 int rc = -EACCES; 1279 int rc = -EACCES;
1282 OPEN_REQ *req = NULL; 1280 OPEN_REQ *req = NULL;
@@ -1284,6 +1282,14 @@ CIFSSMBOpen(const unsigned int xid, struct cifs_tcon *tcon,
1284 int bytes_returned; 1282 int bytes_returned;
1285 int name_len; 1283 int name_len;
1286 __u16 count; 1284 __u16 count;
1285 struct cifs_sb_info *cifs_sb = oparms->cifs_sb;
1286 struct cifs_tcon *tcon = oparms->tcon;
1287 int remap = cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR;
1288 const struct nls_table *nls = cifs_sb->local_nls;
1289 int create_options = oparms->create_options;
1290 int desired_access = oparms->desired_access;
1291 int disposition = oparms->disposition;
1292 const char *path = oparms->path;
1287 1293
1288openRetry: 1294openRetry:
1289 rc = smb_init(SMB_COM_NT_CREATE_ANDX, 24, tcon, (void **)&req, 1295 rc = smb_init(SMB_COM_NT_CREATE_ANDX, 24, tcon, (void **)&req,
@@ -1367,7 +1373,7 @@ openRetry:
1367 /* 1 byte no need to le_to_cpu */ 1373 /* 1 byte no need to le_to_cpu */
1368 *oplock = rsp->OplockLevel; 1374 *oplock = rsp->OplockLevel;
1369 /* cifs fid stays in le */ 1375 /* cifs fid stays in le */
1370 *netfid = rsp->Fid; 1376 oparms->fid->netfid = rsp->Fid;
1371 1377
1372 /* Let caller know file was created so we can set the mode. */ 1378 /* Let caller know file was created so we can set the mode. */
1373 /* Do we care about the CreateAction in any other cases? */ 1379 /* Do we care about the CreateAction in any other cases? */
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index 0850325c3b44..d3a6796caa5a 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -570,7 +570,8 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
570 char *full_path = NULL; 570 char *full_path = NULL;
571 struct inode *newinode = NULL; 571 struct inode *newinode = NULL;
572 int oplock = 0; 572 int oplock = 0;
573 u16 netfid; 573 struct cifs_fid fid;
574 struct cifs_open_parms oparms;
574 FILE_ALL_INFO *buf = NULL; 575 FILE_ALL_INFO *buf = NULL;
575 unsigned int bytes_written; 576 unsigned int bytes_written;
576 struct win_dev *pdev; 577 struct win_dev *pdev;
@@ -640,10 +641,16 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
640 if (backup_cred(cifs_sb)) 641 if (backup_cred(cifs_sb))
641 create_options |= CREATE_OPEN_BACKUP_INTENT; 642 create_options |= CREATE_OPEN_BACKUP_INTENT;
642 643
643 rc = CIFSSMBOpen(xid, tcon, full_path, FILE_CREATE, 644 oparms.tcon = tcon;
644 GENERIC_WRITE, create_options, 645 oparms.cifs_sb = cifs_sb;
645 &netfid, &oplock, buf, cifs_sb->local_nls, 646 oparms.desired_access = GENERIC_WRITE;
646 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 647 oparms.create_options = create_options;
648 oparms.disposition = FILE_CREATE;
649 oparms.path = full_path;
650 oparms.fid = &fid;
651 oparms.reconnect = false;
652
653 rc = CIFS_open(xid, &oparms, &oplock, buf);
647 if (rc) 654 if (rc)
648 goto mknod_out; 655 goto mknod_out;
649 656
@@ -653,7 +660,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
653 */ 660 */
654 661
655 pdev = (struct win_dev *)buf; 662 pdev = (struct win_dev *)buf;
656 io_parms.netfid = netfid; 663 io_parms.netfid = fid.netfid;
657 io_parms.pid = current->tgid; 664 io_parms.pid = current->tgid;
658 io_parms.tcon = tcon; 665 io_parms.tcon = tcon;
659 io_parms.offset = 0; 666 io_parms.offset = 0;
@@ -671,7 +678,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
671 rc = CIFSSMBWrite(xid, &io_parms, &bytes_written, (char *)pdev, 678 rc = CIFSSMBWrite(xid, &io_parms, &bytes_written, (char *)pdev,
672 NULL, 0); 679 NULL, 0);
673 } /* else if (S_ISFIFO) */ 680 } /* else if (S_ISFIFO) */
674 CIFSSMBClose(xid, tcon, netfid); 681 CIFSSMBClose(xid, tcon, fid.netfid);
675 d_drop(direntry); 682 d_drop(direntry);
676 683
677 /* FIXME: add code here to set EAs */ 684 /* FIXME: add code here to set EAs */
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 5a5a87240fe2..853d6d1cc822 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -678,7 +678,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
678 678
679 /* 679 /*
680 * Can not refresh inode by passing in file_info buf to be returned by 680 * Can not refresh inode by passing in file_info buf to be returned by
681 * CIFSSMBOpen and then calling get_inode_info with returned buf since 681 * ops->open and then calling get_inode_info with returned buf since
682 * file might have write behind data that needs to be flushed and server 682 * file might have write behind data that needs to be flushed and server
683 * version of file size can be stale. If we knew for sure that inode was 683 * version of file size can be stale. If we knew for sure that inode was
684 * not dirty locally we could do this. 684 * not dirty locally we could do this.
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 5793b5a557e9..9cb9679d7357 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -409,9 +409,10 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
409{ 409{
410 int rc; 410 int rc;
411 int oplock = 0; 411 int oplock = 0;
412 __u16 netfid;
413 struct tcon_link *tlink; 412 struct tcon_link *tlink;
414 struct cifs_tcon *tcon; 413 struct cifs_tcon *tcon;
414 struct cifs_fid fid;
415 struct cifs_open_parms oparms;
415 struct cifs_io_parms io_parms; 416 struct cifs_io_parms io_parms;
416 char buf[24]; 417 char buf[24];
417 unsigned int bytes_read; 418 unsigned int bytes_read;
@@ -437,18 +438,23 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
437 return PTR_ERR(tlink); 438 return PTR_ERR(tlink);
438 tcon = tlink_tcon(tlink); 439 tcon = tlink_tcon(tlink);
439 440
440 rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, GENERIC_READ, 441 oparms.tcon = tcon;
441 CREATE_NOT_DIR, &netfid, &oplock, NULL, 442 oparms.cifs_sb = cifs_sb;
442 cifs_sb->local_nls, 443 oparms.desired_access = GENERIC_READ;
443 cifs_sb->mnt_cifs_flags & 444 oparms.create_options = CREATE_NOT_DIR;
444 CIFS_MOUNT_MAP_SPECIAL_CHR); 445 oparms.disposition = FILE_OPEN;
446 oparms.path = path;
447 oparms.fid = &fid;
448 oparms.reconnect = false;
449
450 rc = CIFS_open(xid, &oparms, &oplock, NULL);
445 if (rc) { 451 if (rc) {
446 cifs_put_tlink(tlink); 452 cifs_put_tlink(tlink);
447 return rc; 453 return rc;
448 } 454 }
449 455
450 /* Read header */ 456 /* Read header */
451 io_parms.netfid = netfid; 457 io_parms.netfid = fid.netfid;
452 io_parms.pid = current->tgid; 458 io_parms.pid = current->tgid;
453 io_parms.tcon = tcon; 459 io_parms.tcon = tcon;
454 io_parms.offset = 0; 460 io_parms.offset = 0;
@@ -494,7 +500,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
494 fattr->cf_dtype = DT_REG; 500 fattr->cf_dtype = DT_REG;
495 rc = -EOPNOTSUPP; /* or some unknown SFU type */ 501 rc = -EOPNOTSUPP; /* or some unknown SFU type */
496 } 502 }
497 CIFSSMBClose(xid, tcon, netfid); 503 CIFSSMBClose(xid, tcon, fid.netfid);
498 cifs_put_tlink(tlink); 504 cifs_put_tlink(tlink);
499 return rc; 505 return rc;
500} 506}
@@ -1035,7 +1041,8 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1035{ 1041{
1036 int oplock = 0; 1042 int oplock = 0;
1037 int rc; 1043 int rc;
1038 __u16 netfid; 1044 struct cifs_fid fid;
1045 struct cifs_open_parms oparms;
1039 struct inode *inode = dentry->d_inode; 1046 struct inode *inode = dentry->d_inode;
1040 struct cifsInodeInfo *cifsInode = CIFS_I(inode); 1047 struct cifsInodeInfo *cifsInode = CIFS_I(inode);
1041 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 1048 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
@@ -1058,10 +1065,16 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1058 goto out; 1065 goto out;
1059 } 1066 }
1060 1067
1061 rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN, 1068 oparms.tcon = tcon;
1062 DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR, 1069 oparms.cifs_sb = cifs_sb;
1063 &netfid, &oplock, NULL, cifs_sb->local_nls, 1070 oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
1064 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 1071 oparms.create_options = CREATE_NOT_DIR;
1072 oparms.disposition = FILE_OPEN;
1073 oparms.path = full_path;
1074 oparms.fid = &fid;
1075 oparms.reconnect = false;
1076
1077 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1065 if (rc != 0) 1078 if (rc != 0)
1066 goto out; 1079 goto out;
1067 1080
@@ -1082,7 +1095,7 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1082 goto out_close; 1095 goto out_close;
1083 } 1096 }
1084 info_buf->Attributes = cpu_to_le32(dosattr); 1097 info_buf->Attributes = cpu_to_le32(dosattr);
1085 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, netfid, 1098 rc = CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1086 current->tgid); 1099 current->tgid);
1087 /* although we would like to mark the file hidden 1100 /* although we would like to mark the file hidden
1088 if that fails we will still try to rename it */ 1101 if that fails we will still try to rename it */
@@ -1093,7 +1106,8 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1093 } 1106 }
1094 1107
1095 /* rename the file */ 1108 /* rename the file */
1096 rc = CIFSSMBRenameOpenFile(xid, tcon, netfid, NULL, cifs_sb->local_nls, 1109 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, NULL,
1110 cifs_sb->local_nls,
1097 cifs_sb->mnt_cifs_flags & 1111 cifs_sb->mnt_cifs_flags &
1098 CIFS_MOUNT_MAP_SPECIAL_CHR); 1112 CIFS_MOUNT_MAP_SPECIAL_CHR);
1099 if (rc != 0) { 1113 if (rc != 0) {
@@ -1103,7 +1117,7 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1103 1117
1104 /* try to set DELETE_ON_CLOSE */ 1118 /* try to set DELETE_ON_CLOSE */
1105 if (!cifsInode->delete_pending) { 1119 if (!cifsInode->delete_pending) {
1106 rc = CIFSSMBSetFileDisposition(xid, tcon, true, netfid, 1120 rc = CIFSSMBSetFileDisposition(xid, tcon, true, fid.netfid,
1107 current->tgid); 1121 current->tgid);
1108 /* 1122 /*
1109 * some samba versions return -ENOENT when we try to set the 1123 * some samba versions return -ENOENT when we try to set the
@@ -1123,7 +1137,7 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
1123 } 1137 }
1124 1138
1125out_close: 1139out_close:
1126 CIFSSMBClose(xid, tcon, netfid); 1140 CIFSSMBClose(xid, tcon, fid.netfid);
1127out: 1141out:
1128 kfree(info_buf); 1142 kfree(info_buf);
1129 cifs_put_tlink(tlink); 1143 cifs_put_tlink(tlink);
@@ -1135,13 +1149,13 @@ out:
1135 * them anyway. 1149 * them anyway.
1136 */ 1150 */
1137undo_rename: 1151undo_rename:
1138 CIFSSMBRenameOpenFile(xid, tcon, netfid, dentry->d_name.name, 1152 CIFSSMBRenameOpenFile(xid, tcon, fid.netfid, dentry->d_name.name,
1139 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & 1153 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1140 CIFS_MOUNT_MAP_SPECIAL_CHR); 1154 CIFS_MOUNT_MAP_SPECIAL_CHR);
1141undo_setattr: 1155undo_setattr:
1142 if (dosattr != origattr) { 1156 if (dosattr != origattr) {
1143 info_buf->Attributes = cpu_to_le32(origattr); 1157 info_buf->Attributes = cpu_to_le32(origattr);
1144 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, netfid, 1158 if (!CIFSSMBSetFileInfo(xid, tcon, info_buf, fid.netfid,
1145 current->tgid)) 1159 current->tgid))
1146 cifsInode->cifsAttrs = origattr; 1160 cifsInode->cifsAttrs = origattr;
1147 } 1161 }
@@ -1552,7 +1566,8 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
1552 struct tcon_link *tlink; 1566 struct tcon_link *tlink;
1553 struct cifs_tcon *tcon; 1567 struct cifs_tcon *tcon;
1554 struct TCP_Server_Info *server; 1568 struct TCP_Server_Info *server;
1555 __u16 srcfid; 1569 struct cifs_fid fid;
1570 struct cifs_open_parms oparms;
1556 int oplock, rc; 1571 int oplock, rc;
1557 1572
1558 tlink = cifs_sb_tlink(cifs_sb); 1573 tlink = cifs_sb_tlink(cifs_sb);
@@ -1579,17 +1594,23 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
1579 if (to_dentry->d_parent != from_dentry->d_parent) 1594 if (to_dentry->d_parent != from_dentry->d_parent)
1580 goto do_rename_exit; 1595 goto do_rename_exit;
1581 1596
1597 oparms.tcon = tcon;
1598 oparms.cifs_sb = cifs_sb;
1582 /* open the file to be renamed -- we need DELETE perms */ 1599 /* open the file to be renamed -- we need DELETE perms */
1583 rc = CIFSSMBOpen(xid, tcon, from_path, FILE_OPEN, DELETE, 1600 oparms.desired_access = DELETE;
1584 CREATE_NOT_DIR, &srcfid, &oplock, NULL, 1601 oparms.create_options = CREATE_NOT_DIR;
1585 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & 1602 oparms.disposition = FILE_OPEN;
1586 CIFS_MOUNT_MAP_SPECIAL_CHR); 1603 oparms.path = from_path;
1604 oparms.fid = &fid;
1605 oparms.reconnect = false;
1606
1607 rc = CIFS_open(xid, &oparms, &oplock, NULL);
1587 if (rc == 0) { 1608 if (rc == 0) {
1588 rc = CIFSSMBRenameOpenFile(xid, tcon, srcfid, 1609 rc = CIFSSMBRenameOpenFile(xid, tcon, fid.netfid,
1589 (const char *) to_dentry->d_name.name, 1610 (const char *) to_dentry->d_name.name,
1590 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & 1611 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
1591 CIFS_MOUNT_MAP_SPECIAL_CHR); 1612 CIFS_MOUNT_MAP_SPECIAL_CHR);
1592 CIFSSMBClose(xid, tcon, srcfid); 1613 CIFSSMBClose(xid, tcon, fid.netfid);
1593 } 1614 }
1594do_rename_exit: 1615do_rename_exit:
1595 cifs_put_tlink(tlink); 1616 cifs_put_tlink(tlink);
diff --git a/fs/cifs/link.c b/fs/cifs/link.c
index 38b9bf4f5a6b..52f41f9f7def 100644
--- a/fs/cifs/link.c
+++ b/fs/cifs/link.c
@@ -320,16 +320,22 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
320{ 320{
321 int rc; 321 int rc;
322 int oplock = 0; 322 int oplock = 0;
323 __u16 netfid = 0; 323 struct cifs_fid fid;
324 struct cifs_open_parms oparms;
324 struct cifs_io_parms io_parms; 325 struct cifs_io_parms io_parms;
325 int buf_type = CIFS_NO_BUFFER; 326 int buf_type = CIFS_NO_BUFFER;
326 FILE_ALL_INFO file_info; 327 FILE_ALL_INFO file_info;
327 328
328 rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, GENERIC_READ, 329 oparms.tcon = tcon;
329 CREATE_NOT_DIR, &netfid, &oplock, &file_info, 330 oparms.cifs_sb = cifs_sb;
330 cifs_sb->local_nls, 331 oparms.desired_access = GENERIC_READ;
331 cifs_sb->mnt_cifs_flags & 332 oparms.create_options = CREATE_NOT_DIR;
332 CIFS_MOUNT_MAP_SPECIAL_CHR); 333 oparms.disposition = FILE_OPEN;
334 oparms.path = path;
335 oparms.fid = &fid;
336 oparms.reconnect = false;
337
338 rc = CIFS_open(xid, &oparms, &oplock, &file_info);
333 if (rc) 339 if (rc)
334 return rc; 340 return rc;
335 341
@@ -337,7 +343,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
337 /* it's not a symlink */ 343 /* it's not a symlink */
338 goto out; 344 goto out;
339 345
340 io_parms.netfid = netfid; 346 io_parms.netfid = fid.netfid;
341 io_parms.pid = current->tgid; 347 io_parms.pid = current->tgid;
342 io_parms.tcon = tcon; 348 io_parms.tcon = tcon;
343 io_parms.offset = 0; 349 io_parms.offset = 0;
@@ -345,7 +351,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
345 351
346 rc = CIFSSMBRead(xid, &io_parms, pbytes_read, &pbuf, &buf_type); 352 rc = CIFSSMBRead(xid, &io_parms, pbytes_read, &pbuf, &buf_type);
347out: 353out:
348 CIFSSMBClose(xid, tcon, netfid); 354 CIFSSMBClose(xid, tcon, fid.netfid);
349 return rc; 355 return rc;
350} 356}
351 357
@@ -356,29 +362,35 @@ cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
356{ 362{
357 int rc; 363 int rc;
358 int oplock = 0; 364 int oplock = 0;
359 __u16 netfid = 0; 365 struct cifs_fid fid;
366 struct cifs_open_parms oparms;
360 struct cifs_io_parms io_parms; 367 struct cifs_io_parms io_parms;
361 int create_options = CREATE_NOT_DIR; 368 int create_options = CREATE_NOT_DIR;
362 369
363 if (backup_cred(cifs_sb)) 370 if (backup_cred(cifs_sb))
364 create_options |= CREATE_OPEN_BACKUP_INTENT; 371 create_options |= CREATE_OPEN_BACKUP_INTENT;
365 372
366 rc = CIFSSMBOpen(xid, tcon, path, FILE_CREATE, GENERIC_WRITE, 373 oparms.tcon = tcon;
367 create_options, &netfid, &oplock, NULL, 374 oparms.cifs_sb = cifs_sb;
368 cifs_sb->local_nls, 375 oparms.desired_access = GENERIC_WRITE;
369 cifs_sb->mnt_cifs_flags & 376 oparms.create_options = create_options;
370 CIFS_MOUNT_MAP_SPECIAL_CHR); 377 oparms.disposition = FILE_OPEN;
378 oparms.path = path;
379 oparms.fid = &fid;
380 oparms.reconnect = false;
381
382 rc = CIFS_open(xid, &oparms, &oplock, NULL);
371 if (rc) 383 if (rc)
372 return rc; 384 return rc;
373 385
374 io_parms.netfid = netfid; 386 io_parms.netfid = fid.netfid;
375 io_parms.pid = current->tgid; 387 io_parms.pid = current->tgid;
376 io_parms.tcon = tcon; 388 io_parms.tcon = tcon;
377 io_parms.offset = 0; 389 io_parms.offset = 0;
378 io_parms.length = CIFS_MF_SYMLINK_FILE_SIZE; 390 io_parms.length = CIFS_MF_SYMLINK_FILE_SIZE;
379 391
380 rc = CIFSSMBWrite(xid, &io_parms, pbytes_written, pbuf, NULL, 0); 392 rc = CIFSSMBWrite(xid, &io_parms, pbytes_written, pbuf, NULL, 0);
381 CIFSSMBClose(xid, tcon, netfid); 393 CIFSSMBClose(xid, tcon, fid.netfid);
382 return rc; 394 return rc;
383} 395}
384 396
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
index abd2cc9515c9..9ac5bfc9cc56 100644
--- a/fs/cifs/smb1ops.c
+++ b/fs/cifs/smb1ops.c
@@ -560,17 +560,24 @@ cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
560 if (!rc && (le32_to_cpu(data->Attributes) & ATTR_REPARSE)) { 560 if (!rc && (le32_to_cpu(data->Attributes) & ATTR_REPARSE)) {
561 int tmprc; 561 int tmprc;
562 int oplock = 0; 562 int oplock = 0;
563 __u16 netfid; 563 struct cifs_fid fid;
564 struct cifs_open_parms oparms;
565
566 oparms.tcon = tcon;
567 oparms.cifs_sb = cifs_sb;
568 oparms.desired_access = FILE_READ_ATTRIBUTES;
569 oparms.create_options = 0;
570 oparms.disposition = FILE_OPEN;
571 oparms.path = full_path;
572 oparms.fid = &fid;
573 oparms.reconnect = false;
564 574
565 /* Need to check if this is a symbolic link or not */ 575 /* Need to check if this is a symbolic link or not */
566 tmprc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN, 576 tmprc = CIFS_open(xid, &oparms, &oplock, NULL);
567 FILE_READ_ATTRIBUTES, 0, &netfid, &oplock,
568 NULL, cifs_sb->local_nls,
569 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
570 if (tmprc == -EOPNOTSUPP) 577 if (tmprc == -EOPNOTSUPP)
571 *symlink = true; 578 *symlink = true;
572 else 579 else
573 CIFSSMBClose(xid, tcon, netfid); 580 CIFSSMBClose(xid, tcon, fid.netfid);
574 } 581 }
575 582
576 return rc; 583 return rc;
@@ -705,12 +712,7 @@ cifs_open_file(const unsigned int xid, struct cifs_open_parms *oparms,
705 oparms->cifs_sb->local_nls, 712 oparms->cifs_sb->local_nls,
706 oparms->cifs_sb->mnt_cifs_flags 713 oparms->cifs_sb->mnt_cifs_flags
707 & CIFS_MOUNT_MAP_SPECIAL_CHR); 714 & CIFS_MOUNT_MAP_SPECIAL_CHR);
708 return CIFSSMBOpen(xid, oparms->tcon, oparms->path, 715 return CIFS_open(xid, oparms, oplock, buf);
709 oparms->disposition, oparms->desired_access,
710 oparms->create_options, &oparms->fid->netfid, oplock,
711 buf, oparms->cifs_sb->local_nls,
712 oparms->cifs_sb->mnt_cifs_flags &
713 CIFS_MOUNT_MAP_SPECIAL_CHR);
714} 716}
715 717
716static void 718static void
@@ -761,8 +763,9 @@ smb_set_file_info(struct inode *inode, const char *full_path,
761{ 763{
762 int oplock = 0; 764 int oplock = 0;
763 int rc; 765 int rc;
764 __u16 netfid;
765 __u32 netpid; 766 __u32 netpid;
767 struct cifs_fid fid;
768 struct cifs_open_parms oparms;
766 struct cifsFileInfo *open_file; 769 struct cifsFileInfo *open_file;
767 struct cifsInodeInfo *cinode = CIFS_I(inode); 770 struct cifsInodeInfo *cinode = CIFS_I(inode);
768 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); 771 struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
@@ -772,7 +775,7 @@ smb_set_file_info(struct inode *inode, const char *full_path,
772 /* if the file is already open for write, just use that fileid */ 775 /* if the file is already open for write, just use that fileid */
773 open_file = find_writable_file(cinode, true); 776 open_file = find_writable_file(cinode, true);
774 if (open_file) { 777 if (open_file) {
775 netfid = open_file->fid.netfid; 778 fid.netfid = open_file->fid.netfid;
776 netpid = open_file->pid; 779 netpid = open_file->pid;
777 tcon = tlink_tcon(open_file->tlink); 780 tcon = tlink_tcon(open_file->tlink);
778 goto set_via_filehandle; 781 goto set_via_filehandle;
@@ -796,12 +799,17 @@ smb_set_file_info(struct inode *inode, const char *full_path,
796 goto out; 799 goto out;
797 } 800 }
798 801
799 cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for times not supported by this server\n"); 802 oparms.tcon = tcon;
800 rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN, 803 oparms.cifs_sb = cifs_sb;
801 SYNCHRONIZE | FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR, 804 oparms.desired_access = SYNCHRONIZE | FILE_WRITE_ATTRIBUTES;
802 &netfid, &oplock, NULL, cifs_sb->local_nls, 805 oparms.create_options = CREATE_NOT_DIR;
803 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 806 oparms.disposition = FILE_OPEN;
807 oparms.path = full_path;
808 oparms.fid = &fid;
809 oparms.reconnect = false;
804 810
811 cifs_dbg(FYI, "calling SetFileInfo since SetPathInfo for times not supported by this server\n");
812 rc = CIFS_open(xid, &oparms, &oplock, NULL);
805 if (rc != 0) { 813 if (rc != 0) {
806 if (rc == -EIO) 814 if (rc == -EIO)
807 rc = -EINVAL; 815 rc = -EINVAL;
@@ -811,12 +819,12 @@ smb_set_file_info(struct inode *inode, const char *full_path,
811 netpid = current->tgid; 819 netpid = current->tgid;
812 820
813set_via_filehandle: 821set_via_filehandle:
814 rc = CIFSSMBSetFileInfo(xid, tcon, buf, netfid, netpid); 822 rc = CIFSSMBSetFileInfo(xid, tcon, buf, fid.netfid, netpid);
815 if (!rc) 823 if (!rc)
816 cinode->cifsAttrs = le32_to_cpu(buf->Attributes); 824 cinode->cifsAttrs = le32_to_cpu(buf->Attributes);
817 825
818 if (open_file == NULL) 826 if (open_file == NULL)
819 CIFSSMBClose(xid, tcon, netfid); 827 CIFSSMBClose(xid, tcon, fid.netfid);
820 else 828 else
821 cifsFileInfo_put(open_file); 829 cifsFileInfo_put(open_file);
822out: 830out:
@@ -941,7 +949,8 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
941{ 949{
942 int rc; 950 int rc;
943 int oplock = 0; 951 int oplock = 0;
944 __u16 netfid; 952 struct cifs_fid fid;
953 struct cifs_open_parms oparms;
945 954
946 cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path); 955 cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
947 956
@@ -957,21 +966,27 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
957 goto out; 966 goto out;
958 } 967 }
959 968
960 rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN, 969 oparms.tcon = tcon;
961 FILE_READ_ATTRIBUTES, OPEN_REPARSE_POINT, &netfid, 970 oparms.cifs_sb = cifs_sb;
962 &oplock, NULL, cifs_sb->local_nls, 971 oparms.desired_access = FILE_READ_ATTRIBUTES;
963 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 972 oparms.create_options = OPEN_REPARSE_POINT;
973 oparms.disposition = FILE_OPEN;
974 oparms.path = full_path;
975 oparms.fid = &fid;
976 oparms.reconnect = false;
977
978 rc = CIFS_open(xid, &oparms, &oplock, NULL);
964 if (rc) 979 if (rc)
965 goto out; 980 goto out;
966 981
967 rc = CIFSSMBQuerySymLink(xid, tcon, netfid, target_path, 982 rc = CIFSSMBQuerySymLink(xid, tcon, fid.netfid, target_path,
968 cifs_sb->local_nls); 983 cifs_sb->local_nls);
969 if (rc) 984 if (rc)
970 goto out_close; 985 goto out_close;
971 986
972 convert_delimiter(*target_path, '/'); 987 convert_delimiter(*target_path, '/');
973out_close: 988out_close:
974 CIFSSMBClose(xid, tcon, netfid); 989 CIFSSMBClose(xid, tcon, fid.netfid);
975out: 990out:
976 if (!rc) 991 if (!rc)
977 cifs_dbg(FYI, "%s: target path: %s\n", __func__, *target_path); 992 cifs_dbg(FYI, "%s: target path: %s\n", __func__, *target_path);