diff options
Diffstat (limited to 'fs/cifs/ioctl.c')
-rw-r--r-- | fs/cifs/ioctl.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index a4f1c34a8dc7..711bb7a3a98e 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c | |||
@@ -29,6 +29,8 @@ | |||
29 | #include "cifs_debug.h" | 29 | #include "cifs_debug.h" |
30 | #include "cifsfs.h" | 30 | #include "cifsfs.h" |
31 | 31 | ||
32 | #define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) | ||
33 | |||
32 | int cifs_ioctl (struct inode * inode, struct file * filep, | 34 | int cifs_ioctl (struct inode * inode, struct file * filep, |
33 | unsigned int command, unsigned long arg) | 35 | unsigned int command, unsigned long arg) |
34 | { | 36 | { |
@@ -36,8 +38,8 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
36 | #ifdef CONFIG_CIFS_POSIX | 38 | #ifdef CONFIG_CIFS_POSIX |
37 | __u64 ExtAttrBits = 0; | 39 | __u64 ExtAttrBits = 0; |
38 | __u64 ExtAttrMask = 0; | 40 | __u64 ExtAttrMask = 0; |
39 | __u64 caps; | ||
40 | #endif /* CONFIG_CIFS_POSIX */ | 41 | #endif /* CONFIG_CIFS_POSIX */ |
42 | __u64 caps; | ||
41 | int xid; | 43 | int xid; |
42 | struct cifs_sb_info *cifs_sb; | 44 | struct cifs_sb_info *cifs_sb; |
43 | struct cifsTconInfo *tcon; | 45 | struct cifsTconInfo *tcon; |
@@ -46,12 +48,11 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
46 | 48 | ||
47 | xid = GetXid(); | 49 | xid = GetXid(); |
48 | 50 | ||
51 | cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); | ||
52 | |||
49 | cifs_sb = CIFS_SB(inode->i_sb); | 53 | cifs_sb = CIFS_SB(inode->i_sb); |
50 | tcon = cifs_sb->tcon; | 54 | tcon = cifs_sb->tcon; |
51 | if (pSMBFile == NULL) | ||
52 | goto cifs_ioctl_out; | ||
53 | 55 | ||
54 | #ifdef CONFIG_CIFS_POSIX | ||
55 | if(tcon) | 56 | if(tcon) |
56 | caps = le64_to_cpu(tcon->fsUnixInfo.Capability); | 57 | caps = le64_to_cpu(tcon->fsUnixInfo.Capability); |
57 | else { | 58 | else { |
@@ -59,10 +60,22 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
59 | goto cifs_ioctl_out; | 60 | goto cifs_ioctl_out; |
60 | } | 61 | } |
61 | 62 | ||
62 | cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); | ||
63 | switch(command) { | 63 | switch(command) { |
64 | case CIFS_IOC_CHECKUMOUNT: | ||
65 | cFYI(1,("User unmount attempted")); | ||
66 | /* BB FIXME - add missing code here FIXME */ | ||
67 | if(cifs_sb->mnt_uid == current->uid) | ||
68 | rc = 0; | ||
69 | else { | ||
70 | rc = -EACCES; | ||
71 | cFYI(1,("uids do not match")); | ||
72 | } | ||
73 | break; | ||
74 | #ifdef CONFIG_CIFS_POSIX | ||
64 | case EXT2_IOC_GETFLAGS: | 75 | case EXT2_IOC_GETFLAGS: |
65 | if(CIFS_UNIX_EXTATTR_CAP & caps) { | 76 | if(CIFS_UNIX_EXTATTR_CAP & caps) { |
77 | if (pSMBFile == NULL) | ||
78 | goto cifs_ioctl_out; | ||
66 | rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, | 79 | rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, |
67 | &ExtAttrBits, &ExtAttrMask); | 80 | &ExtAttrBits, &ExtAttrMask); |
68 | if(rc == 0) | 81 | if(rc == 0) |
@@ -78,17 +91,19 @@ int cifs_ioctl (struct inode * inode, struct file * filep, | |||
78 | rc = -EFAULT; | 91 | rc = -EFAULT; |
79 | goto cifs_ioctl_out; | 92 | goto cifs_ioctl_out; |
80 | } | 93 | } |
81 | /* rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, | 94 | if (pSMBFile == NULL) |
95 | goto cifs_ioctl_out; | ||
96 | /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, | ||
82 | extAttrBits, &ExtAttrMask);*/ | 97 | extAttrBits, &ExtAttrMask);*/ |
83 | 98 | ||
84 | } | 99 | } |
85 | cFYI(1,("set flags not implemented yet")); | 100 | cFYI(1,("set flags not implemented yet")); |
86 | break; | 101 | break; |
102 | #endif /* CONFIG_CIFS_POSIX */ | ||
87 | default: | 103 | default: |
88 | cFYI(1,("unsupported ioctl")); | 104 | cFYI(1,("unsupported ioctl")); |
89 | return rc; | 105 | break; |
90 | } | 106 | } |
91 | #endif /* CONFIG_CIFS_POSIX */ | ||
92 | 107 | ||
93 | cifs_ioctl_out: | 108 | cifs_ioctl_out: |
94 | FreeXid(xid); | 109 | FreeXid(xid); |