diff options
Diffstat (limited to 'fs/cifs/ioctl.c')
| -rw-r--r-- | fs/cifs/ioctl.c | 75 |
1 files changed, 69 insertions, 6 deletions
diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index b4b8e201d428..b0ea6687ab55 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c | |||
| @@ -20,30 +20,93 @@ | |||
| 20 | * along with this library; if not, write to the Free Software | 20 | * along with this library; if not, write to the Free Software |
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 22 | */ | 22 | */ |
| 23 | |||
| 23 | #include <linux/fs.h> | 24 | #include <linux/fs.h> |
| 24 | #include <linux/ext2_fs.h> | 25 | #include <linux/ext2_fs.h> |
| 25 | #include "cifspdu.h" | 26 | #include "cifspdu.h" |
| 26 | #include "cifsglob.h" | 27 | #include "cifsglob.h" |
| 27 | #include "cifsproto.h" | 28 | #include "cifsproto.h" |
| 28 | #include "cifs_debug.h" | 29 | #include "cifs_debug.h" |
| 30 | #include "cifsfs.h" | ||
| 31 | |||
| 32 | #define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) | ||
| 29 | 33 | ||
| 30 | int cifs_ioctl (struct inode * inode, struct file * filep, | 34 | int cifs_ioctl (struct inode * inode, struct file * filep, |
| 31 | unsigned int command, unsigned long arg) | 35 | unsigned int command, unsigned long arg) |
| 32 | { | 36 | { |
| 33 | int rc = -ENOTTY; /* strange error - but the precedent */ | 37 | int rc = -ENOTTY; /* strange error - but the precedent */ |
| 38 | int xid; | ||
| 39 | struct cifs_sb_info *cifs_sb; | ||
| 40 | #ifdef CONFIG_CIFS_POSIX | ||
| 41 | __u64 ExtAttrBits = 0; | ||
| 42 | __u64 ExtAttrMask = 0; | ||
| 43 | __u64 caps; | ||
| 44 | struct cifsTconInfo *tcon; | ||
| 45 | struct cifsFileInfo *pSMBFile = | ||
| 46 | (struct cifsFileInfo *)filep->private_data; | ||
| 47 | #endif /* CONFIG_CIFS_POSIX */ | ||
| 48 | |||
| 49 | xid = GetXid(); | ||
| 50 | |||
| 51 | cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); | ||
| 52 | |||
| 53 | cifs_sb = CIFS_SB(inode->i_sb); | ||
| 54 | |||
| 34 | #ifdef CONFIG_CIFS_POSIX | 55 | #ifdef CONFIG_CIFS_POSIX |
| 35 | cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); | 56 | tcon = cifs_sb->tcon; |
| 57 | if(tcon) | ||
| 58 | caps = le64_to_cpu(tcon->fsUnixInfo.Capability); | ||
| 59 | else { | ||
| 60 | rc = -EIO; | ||
| 61 | FreeXid(xid); | ||
| 62 | return -EIO; | ||
| 63 | } | ||
| 64 | #endif /* CONFIG_CIFS_POSIX */ | ||
| 65 | |||
| 36 | switch(command) { | 66 | switch(command) { |
| 67 | case CIFS_IOC_CHECKUMOUNT: | ||
| 68 | cFYI(1,("User unmount attempted")); | ||
| 69 | if(cifs_sb->mnt_uid == current->uid) | ||
| 70 | rc = 0; | ||
| 71 | else { | ||
| 72 | rc = -EACCES; | ||
| 73 | cFYI(1,("uids do not match")); | ||
| 74 | } | ||
| 75 | break; | ||
| 76 | #ifdef CONFIG_CIFS_POSIX | ||
| 37 | case EXT2_IOC_GETFLAGS: | 77 | case EXT2_IOC_GETFLAGS: |
| 38 | cFYI(1,("get flags not implemented yet")); | 78 | if(CIFS_UNIX_EXTATTR_CAP & caps) { |
| 39 | return -EOPNOTSUPP; | 79 | if (pSMBFile == NULL) |
| 80 | break; | ||
| 81 | rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, | ||
| 82 | &ExtAttrBits, &ExtAttrMask); | ||
| 83 | if(rc == 0) | ||
| 84 | rc = put_user(ExtAttrBits & | ||
| 85 | EXT2_FL_USER_VISIBLE, | ||
| 86 | (int __user *)arg); | ||
| 87 | } | ||
| 88 | break; | ||
| 89 | |||
| 40 | case EXT2_IOC_SETFLAGS: | 90 | case EXT2_IOC_SETFLAGS: |
| 91 | if(CIFS_UNIX_EXTATTR_CAP & caps) { | ||
| 92 | if(get_user(ExtAttrBits,(int __user *)arg)) { | ||
| 93 | rc = -EFAULT; | ||
| 94 | break; | ||
| 95 | } | ||
| 96 | if (pSMBFile == NULL) | ||
| 97 | break; | ||
| 98 | /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, | ||
| 99 | extAttrBits, &ExtAttrMask);*/ | ||
| 100 | |||
| 101 | } | ||
| 41 | cFYI(1,("set flags not implemented yet")); | 102 | cFYI(1,("set flags not implemented yet")); |
| 42 | return -EOPNOTSUPP; | 103 | break; |
| 104 | #endif /* CONFIG_CIFS_POSIX */ | ||
| 43 | default: | 105 | default: |
| 44 | cFYI(1,("unsupported ioctl")); | 106 | cFYI(1,("unsupported ioctl")); |
| 45 | return rc; | 107 | break; |
| 46 | } | 108 | } |
| 47 | #endif /* CONFIG_CIFS_POSIX */ | 109 | |
| 110 | FreeXid(xid); | ||
| 48 | return rc; | 111 | return rc; |
| 49 | } | 112 | } |
