aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/cifs/cifsglob.h3
-rw-r--r--fs/cifs/cifsproto.h3
-rw-r--r--fs/cifs/cifssmb.c15
-rw-r--r--fs/cifs/inode.c15
-rw-r--r--fs/cifs/smb1ops.c1
5 files changed, 24 insertions, 13 deletions
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 939f91aac162..977dc0e85ccb 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -253,6 +253,9 @@ struct smb_version_operations {
253 void (*mkdir_setinfo)(struct inode *, const char *, 253 void (*mkdir_setinfo)(struct inode *, const char *,
254 struct cifs_sb_info *, struct cifs_tcon *, 254 struct cifs_sb_info *, struct cifs_tcon *,
255 const unsigned int); 255 const unsigned int);
256 /* remove directory */
257 int (*rmdir)(const unsigned int, struct cifs_tcon *, const char *,
258 struct cifs_sb_info *);
256}; 259};
257 260
258struct smb_version_values { 261struct smb_version_values {
diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
index 5e128fb2b618..f1bbf8305d3a 100644
--- a/fs/cifs/cifsproto.h
+++ b/fs/cifs/cifsproto.h
@@ -297,8 +297,7 @@ extern int CIFSSMBUnixSetPathInfo(const unsigned int xid,
297extern int CIFSSMBMkDir(const unsigned int xid, struct cifs_tcon *tcon, 297extern int CIFSSMBMkDir(const unsigned int xid, struct cifs_tcon *tcon,
298 const char *name, struct cifs_sb_info *cifs_sb); 298 const char *name, struct cifs_sb_info *cifs_sb);
299extern int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, 299extern int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon,
300 const char *name, const struct nls_table *nls_codepage, 300 const char *name, struct cifs_sb_info *cifs_sb);
301 int remap_special_chars);
302extern int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon, 301extern int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon,
303 const char *name, __u16 type, 302 const char *name, __u16 type,
304 const struct nls_table *nls_codepage, 303 const struct nls_table *nls_codepage,
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index eb74cceef480..074923ce593d 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -948,15 +948,15 @@ DelFileRetry:
948} 948}
949 949
950int 950int
951CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, 951CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, const char *name,
952 const char *dirName, const struct nls_table *nls_codepage, 952 struct cifs_sb_info *cifs_sb)
953 int remap)
954{ 953{
955 DELETE_DIRECTORY_REQ *pSMB = NULL; 954 DELETE_DIRECTORY_REQ *pSMB = NULL;
956 DELETE_DIRECTORY_RSP *pSMBr = NULL; 955 DELETE_DIRECTORY_RSP *pSMBr = NULL;
957 int rc = 0; 956 int rc = 0;
958 int bytes_returned; 957 int bytes_returned;
959 int name_len; 958 int name_len;
959 int remap = cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR;
960 960
961 cFYI(1, "In CIFSSMBRmDir"); 961 cFYI(1, "In CIFSSMBRmDir");
962RmDirRetry: 962RmDirRetry:
@@ -966,14 +966,15 @@ RmDirRetry:
966 return rc; 966 return rc;
967 967
968 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { 968 if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) {
969 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, dirName, 969 name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name,
970 PATH_MAX, nls_codepage, remap); 970 PATH_MAX, cifs_sb->local_nls,
971 remap);
971 name_len++; /* trailing null */ 972 name_len++; /* trailing null */
972 name_len *= 2; 973 name_len *= 2;
973 } else { /* BB improve check for buffer overruns BB */ 974 } else { /* BB improve check for buffer overruns BB */
974 name_len = strnlen(dirName, PATH_MAX); 975 name_len = strnlen(name, PATH_MAX);
975 name_len++; /* trailing null */ 976 name_len++; /* trailing null */
976 strncpy(pSMB->DirName, dirName, name_len); 977 strncpy(pSMB->DirName, name, name_len);
977 } 978 }
978 979
979 pSMB->BufferFormat = 0x04; 980 pSMB->BufferFormat = 0x04;
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index d7e74b1268cb..7354877fa3bd 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -1426,7 +1426,8 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1426 unsigned int xid; 1426 unsigned int xid;
1427 struct cifs_sb_info *cifs_sb; 1427 struct cifs_sb_info *cifs_sb;
1428 struct tcon_link *tlink; 1428 struct tcon_link *tlink;
1429 struct cifs_tcon *pTcon; 1429 struct cifs_tcon *tcon;
1430 struct TCP_Server_Info *server;
1430 char *full_path = NULL; 1431 char *full_path = NULL;
1431 struct cifsInodeInfo *cifsInode; 1432 struct cifsInodeInfo *cifsInode;
1432 1433
@@ -1446,10 +1447,16 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
1446 rc = PTR_ERR(tlink); 1447 rc = PTR_ERR(tlink);
1447 goto rmdir_exit; 1448 goto rmdir_exit;
1448 } 1449 }
1449 pTcon = tlink_tcon(tlink); 1450 tcon = tlink_tcon(tlink);
1451 server = tcon->ses->server;
1452
1453 if (!server->ops->rmdir) {
1454 rc = -ENOSYS;
1455 cifs_put_tlink(tlink);
1456 goto rmdir_exit;
1457 }
1450 1458
1451 rc = CIFSSMBRmDir(xid, pTcon, full_path, cifs_sb->local_nls, 1459 rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb);
1452 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
1453 cifs_put_tlink(tlink); 1460 cifs_put_tlink(tlink);
1454 1461
1455 if (!rc) { 1462 if (!rc) {
diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
index 861e2df0c37d..3129ac74b819 100644
--- a/fs/cifs/smb1ops.c
+++ b/fs/cifs/smb1ops.c
@@ -643,6 +643,7 @@ struct smb_version_operations smb1_operations = {
643 .echo = CIFSSMBEcho, 643 .echo = CIFSSMBEcho,
644 .mkdir = CIFSSMBMkDir, 644 .mkdir = CIFSSMBMkDir,
645 .mkdir_setinfo = cifs_mkdir_setinfo, 645 .mkdir_setinfo = cifs_mkdir_setinfo,
646 .rmdir = CIFSSMBRmDir,
646}; 647};
647 648
648struct smb_version_values smb1_values = { 649struct smb_version_values smb1_values = {