diff options
| -rw-r--r-- | fs/cifs/cifsglob.h | 3 | ||||
| -rw-r--r-- | fs/cifs/cifsproto.h | 3 | ||||
| -rw-r--r-- | fs/cifs/cifssmb.c | 15 | ||||
| -rw-r--r-- | fs/cifs/inode.c | 15 | ||||
| -rw-r--r-- | fs/cifs/smb1ops.c | 1 |
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 | ||
| 258 | struct smb_version_values { | 261 | struct 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, | |||
| 297 | extern int CIFSSMBMkDir(const unsigned int xid, struct cifs_tcon *tcon, | 297 | extern 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); |
| 299 | extern int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, | 299 | extern 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); | ||
| 302 | extern int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon, | 301 | extern 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 | ||
| 950 | int | 950 | int |
| 951 | CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, | 951 | CIFSSMBRmDir(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"); |
| 962 | RmDirRetry: | 962 | RmDirRetry: |
| @@ -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 | ||
| 648 | struct smb_version_values smb1_values = { | 649 | struct smb_version_values smb1_values = { |
