2005-04-17 02:20:36 +04:00
/*
* fs / cifs / ioctl . c
*
* vfs operations that deal with io control
*
* Copyright ( C ) International Business Machines Corp . , 2005
* Author ( s ) : Steve French ( sfrench @ us . ibm . com )
*
* This library is free software ; you can redistribute it and / or modify
* it under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation ; either version 2.1 of the License , or
* ( at your option ) any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See
* the GNU Lesser General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
2005-04-29 09:41:04 +04:00
2005-04-17 02:20:36 +04:00
# include <linux/fs.h>
# include "cifspdu.h"
# include "cifsglob.h"
# include "cifsproto.h"
# include "cifs_debug.h"
2005-04-29 09:41:04 +04:00
# include "cifsfs.h"
2005-04-17 02:20:36 +04:00
2005-04-29 09:41:07 +04:00
# define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2)
2007-06-05 22:30:44 +04:00
int cifs_ioctl ( struct inode * inode , struct file * filep ,
2005-04-17 02:20:36 +04:00
unsigned int command , unsigned long arg )
{
int rc = - ENOTTY ; /* strange error - but the precedent */
2005-04-29 09:41:07 +04:00
int xid ;
struct cifs_sb_info * cifs_sb ;
2005-04-17 02:20:36 +04:00
# ifdef CONFIG_CIFS_POSIX
2005-04-29 09:41:04 +04:00
__u64 ExtAttrBits = 0 ;
__u64 ExtAttrMask = 0 ;
2005-04-29 09:41:07 +04:00
__u64 caps ;
2005-04-29 09:41:04 +04:00
struct cifsTconInfo * tcon ;
struct cifsFileInfo * pSMBFile =
( struct cifsFileInfo * ) filep - > private_data ;
2005-04-29 09:41:07 +04:00
# endif /* CONFIG_CIFS_POSIX */
2005-04-29 09:41:04 +04:00
xid = GetXid ( ) ;
2007-06-05 22:30:44 +04:00
cFYI ( 1 , ( " ioctl file %p cmd %u arg %lu " , filep , command , arg ) ) ;
2005-04-29 09:41:07 +04:00
2005-04-29 09:41:04 +04:00
cifs_sb = CIFS_SB ( inode - > i_sb ) ;
2005-04-29 09:41:07 +04:00
# ifdef CONFIG_CIFS_POSIX
tcon = cifs_sb - > tcon ;
2007-06-05 22:30:44 +04:00
if ( tcon )
2005-04-29 09:41:04 +04:00
caps = le64_to_cpu ( tcon - > fsUnixInfo . Capability ) ;
else {
rc = - EIO ;
2005-04-29 09:41:07 +04:00
FreeXid ( xid ) ;
return - EIO ;
2005-04-29 09:41:04 +04:00
}
2005-04-29 09:41:07 +04:00
# endif /* CONFIG_CIFS_POSIX */
2005-04-29 09:41:04 +04:00
2007-06-05 22:30:44 +04:00
switch ( command ) {
2005-04-29 09:41:07 +04:00
case CIFS_IOC_CHECKUMOUNT :
2007-06-05 22:30:44 +04:00
cFYI ( 1 , ( " User unmount attempted " ) ) ;
if ( cifs_sb - > mnt_uid = = current - > uid )
2005-04-29 09:41:07 +04:00
rc = 0 ;
else {
rc = - EACCES ;
2007-06-05 22:30:44 +04:00
cFYI ( 1 , ( " uids do not match " ) ) ;
2005-04-29 09:41:07 +04:00
}
break ;
# ifdef CONFIG_CIFS_POSIX
2006-08-29 22:06:16 +04:00
case FS_IOC_GETFLAGS :
2007-06-05 22:30:44 +04:00
if ( CIFS_UNIX_EXTATTR_CAP & caps ) {
2005-04-29 09:41:07 +04:00
if ( pSMBFile = = NULL )
2005-04-29 09:41:07 +04:00
break ;
2005-04-29 09:41:04 +04:00
rc = CIFSGetExtAttr ( xid , tcon , pSMBFile - > netfid ,
& ExtAttrBits , & ExtAttrMask ) ;
2007-06-05 22:30:44 +04:00
if ( rc = = 0 )
2005-04-29 09:41:04 +04:00
rc = put_user ( ExtAttrBits &
2006-08-29 22:06:16 +04:00
FS_FL_USER_VISIBLE ,
2005-04-29 09:41:04 +04:00
( int __user * ) arg ) ;
}
break ;
2006-08-29 22:06:16 +04:00
case FS_IOC_SETFLAGS :
2007-06-05 22:30:44 +04:00
if ( CIFS_UNIX_EXTATTR_CAP & caps ) {
if ( get_user ( ExtAttrBits , ( int __user * ) arg ) ) {
2005-04-29 09:41:04 +04:00
rc = - EFAULT ;
2005-04-29 09:41:07 +04:00
break ;
2005-04-29 09:41:04 +04:00
}
2005-04-29 09:41:07 +04:00
if ( pSMBFile = = NULL )
2005-04-29 09:41:07 +04:00
break ;
2005-04-29 09:41:07 +04:00
/* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid,
2005-04-29 09:41:04 +04:00
extAttrBits , & ExtAttrMask ) ; */
}
2007-06-05 22:30:44 +04:00
cFYI ( 1 , ( " set flags not implemented yet " ) ) ;
2005-04-29 09:41:04 +04:00
break ;
2005-04-29 09:41:07 +04:00
# endif /* CONFIG_CIFS_POSIX */
2005-04-17 02:20:36 +04:00
default :
2007-06-05 22:30:44 +04:00
cFYI ( 1 , ( " unsupported ioctl " ) ) ;
2005-04-29 09:41:07 +04:00
break ;
2005-04-17 02:20:36 +04:00
}
2005-04-29 09:41:04 +04:00
FreeXid ( xid ) ;
2005-04-17 02:20:36 +04:00
return rc ;
2007-06-05 22:30:44 +04:00
}