On Wed, 18 Jul 2012 19:48:21 +0400 Pavel Shilovsky <pshilovsky@xxxxxxxxx> wrote: > Signed-off-by: Pavel Shilovsky <pshilovsky@xxxxxxxxx> > --- > fs/cifs/cifsglob.h | 3 +++ > fs/cifs/cifsproto.h | 3 +-- > fs/cifs/cifssmb.c | 15 ++++++++------- > fs/cifs/inode.c | 15 +++++++++++---- > 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 1ae7531..a5b4e82 100644 > --- a/fs/cifs/cifsglob.h > +++ b/fs/cifs/cifsglob.h > @@ -253,6 +253,9 @@ struct smb_version_operations { > void (*mkdir_setinfo)(struct inode *, const char *, > struct cifs_sb_info *, struct cifs_tcon *, > const unsigned int); > + /* remove directory */ > + int (*rmdir)(const unsigned int, struct cifs_tcon *, const char *, > + struct cifs_sb_info *); > }; > > struct smb_version_values { > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h > index 7e02362..43784ee 100644 > --- a/fs/cifs/cifsproto.h > +++ b/fs/cifs/cifsproto.h > @@ -297,8 +297,7 @@ extern int CIFSSMBUnixSetPathInfo(const unsigned int xid, > extern int CIFSSMBMkDir(const unsigned int xid, struct cifs_tcon *tcon, > const char *name, struct cifs_sb_info *cifs_sb); > extern int CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, > - const char *name, const struct nls_table *nls_codepage, > - int remap_special_chars); > + const char *name, struct cifs_sb_info *cifs_sb); > extern int CIFSPOSIXDelFile(const unsigned int xid, struct cifs_tcon *tcon, > const char *name, __u16 type, > const struct nls_table *nls_codepage, > diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c > index d49eedf..9fb21cd 100644 > --- a/fs/cifs/cifssmb.c > +++ b/fs/cifs/cifssmb.c > @@ -948,15 +948,15 @@ DelFileRetry: > } > > int > -CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, > - const char *dirName, const struct nls_table *nls_codepage, > - int remap) > +CIFSSMBRmDir(const unsigned int xid, struct cifs_tcon *tcon, const char *name, > + struct cifs_sb_info *cifs_sb) This is a very good change. One of the things we've had requested for quite some time is a "remote_nls=" mount option, where people could set the codepage that the server uses for non-unicode (ancient) servers instead of just assuming unicode. To do that though, you need to pass in a remote codepage to these functions too. As you go, replacing the remap/nls_codepage combo with a cifs_sb might make that change more possible in the future. > { > DELETE_DIRECTORY_REQ *pSMB = NULL; > DELETE_DIRECTORY_RSP *pSMBr = NULL; > int rc = 0; > int bytes_returned; > int name_len; > + int remap = cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR; > > cFYI(1, "In CIFSSMBRmDir"); > RmDirRetry: > @@ -966,14 +966,15 @@ RmDirRetry: > return rc; > > if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { > - name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, dirName, > - PATH_MAX, nls_codepage, remap); > + name_len = cifsConvertToUTF16((__le16 *) pSMB->DirName, name, > + PATH_MAX, cifs_sb->local_nls, > + remap); > name_len++; /* trailing null */ > name_len *= 2; > } else { /* BB improve check for buffer overruns BB */ > - name_len = strnlen(dirName, PATH_MAX); > + name_len = strnlen(name, PATH_MAX); > name_len++; /* trailing null */ > - strncpy(pSMB->DirName, dirName, name_len); > + strncpy(pSMB->DirName, name, name_len); > } > > pSMB->BufferFormat = 0x04; > diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c > index d7e74b1..7354877 100644 > --- a/fs/cifs/inode.c > +++ b/fs/cifs/inode.c > @@ -1426,7 +1426,8 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry) > unsigned int xid; > struct cifs_sb_info *cifs_sb; > struct tcon_link *tlink; > - struct cifs_tcon *pTcon; > + struct cifs_tcon *tcon; > + struct TCP_Server_Info *server; > char *full_path = NULL; > struct cifsInodeInfo *cifsInode; > > @@ -1446,10 +1447,16 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry) > rc = PTR_ERR(tlink); > goto rmdir_exit; > } > - pTcon = tlink_tcon(tlink); > + tcon = tlink_tcon(tlink); > + server = tcon->ses->server; > + > + if (!server->ops->rmdir) { > + rc = -ENOSYS; > + cifs_put_tlink(tlink); > + goto rmdir_exit; > + } > > - rc = CIFSSMBRmDir(xid, pTcon, full_path, cifs_sb->local_nls, > - cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); > + rc = server->ops->rmdir(xid, tcon, full_path, cifs_sb); > cifs_put_tlink(tlink); > > if (!rc) { > diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c > index 861e2df..3129ac7 100644 > --- a/fs/cifs/smb1ops.c > +++ b/fs/cifs/smb1ops.c > @@ -643,6 +643,7 @@ struct smb_version_operations smb1_operations = { > .echo = CIFSSMBEcho, > .mkdir = CIFSSMBMkDir, > .mkdir_setinfo = cifs_mkdir_setinfo, > + .rmdir = CIFSSMBRmDir, > }; > > struct smb_version_values smb1_values = { Reviewed-by: Jeff Layton <jlayton@xxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html