Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/fs/cifs/ioctl.c
15109 views
1
/*
2
* fs/cifs/ioctl.c
3
*
4
* vfs operations that deal with io control
5
*
6
* Copyright (C) International Business Machines Corp., 2005,2007
7
* Author(s): Steve French ([email protected])
8
*
9
* This library is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU Lesser General Public License as published
11
* by the Free Software Foundation; either version 2.1 of the License, or
12
* (at your option) any later version.
13
*
14
* This library is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
17
* the GNU Lesser General Public License for more details.
18
*
19
* You should have received a copy of the GNU Lesser General Public License
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
22
*/
23
24
#include <linux/fs.h>
25
#include "cifspdu.h"
26
#include "cifsglob.h"
27
#include "cifsproto.h"
28
#include "cifs_debug.h"
29
#include "cifsfs.h"
30
31
#define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2)
32
33
long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
34
{
35
struct inode *inode = filep->f_dentry->d_inode;
36
int rc = -ENOTTY; /* strange error - but the precedent */
37
int xid;
38
struct cifs_sb_info *cifs_sb;
39
#ifdef CONFIG_CIFS_POSIX
40
struct cifsFileInfo *pSMBFile = filep->private_data;
41
struct cifs_tcon *tcon;
42
__u64 ExtAttrBits = 0;
43
__u64 ExtAttrMask = 0;
44
__u64 caps;
45
#endif /* CONFIG_CIFS_POSIX */
46
47
xid = GetXid();
48
49
cFYI(1, "ioctl file %p cmd %u arg %lu", filep, command, arg);
50
51
cifs_sb = CIFS_SB(inode->i_sb);
52
53
switch (command) {
54
case CIFS_IOC_CHECKUMOUNT:
55
cFYI(1, "User unmount attempted");
56
if (cifs_sb->mnt_uid == current_uid())
57
rc = 0;
58
else {
59
rc = -EACCES;
60
cFYI(1, "uids do not match");
61
}
62
break;
63
#ifdef CONFIG_CIFS_POSIX
64
case FS_IOC_GETFLAGS:
65
if (pSMBFile == NULL)
66
break;
67
tcon = tlink_tcon(pSMBFile->tlink);
68
caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
69
if (CIFS_UNIX_EXTATTR_CAP & caps) {
70
rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid,
71
&ExtAttrBits, &ExtAttrMask);
72
if (rc == 0)
73
rc = put_user(ExtAttrBits &
74
FS_FL_USER_VISIBLE,
75
(int __user *)arg);
76
}
77
break;
78
79
case FS_IOC_SETFLAGS:
80
if (pSMBFile == NULL)
81
break;
82
tcon = tlink_tcon(pSMBFile->tlink);
83
caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
84
if (CIFS_UNIX_EXTATTR_CAP & caps) {
85
if (get_user(ExtAttrBits, (int __user *)arg)) {
86
rc = -EFAULT;
87
break;
88
}
89
/* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid,
90
extAttrBits, &ExtAttrMask);*/
91
}
92
cFYI(1, "set flags not implemented yet");
93
break;
94
#endif /* CONFIG_CIFS_POSIX */
95
default:
96
cFYI(1, "unsupported ioctl");
97
break;
98
}
99
100
FreeXid(xid);
101
return rc;
102
}
103
104