1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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
31long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
32{
33 struct inode *inode = filep->f_dentry->d_inode;
34 int rc = -ENOTTY;
35 unsigned int xid;
36 struct cifs_sb_info *cifs_sb;
37#ifdef CONFIG_CIFS_POSIX
38 struct cifsFileInfo *pSMBFile = filep->private_data;
39 struct cifs_tcon *tcon;
40 __u64 ExtAttrBits = 0;
41 __u64 ExtAttrMask = 0;
42 __u64 caps;
43#endif
44
45 xid = get_xid();
46
47 cFYI(1, "ioctl file %p cmd %u arg %lu", filep, command, arg);
48
49 cifs_sb = CIFS_SB(inode->i_sb);
50
51 switch (command) {
52#ifdef CONFIG_CIFS_POSIX
53 case FS_IOC_GETFLAGS:
54 if (pSMBFile == NULL)
55 break;
56 tcon = tlink_tcon(pSMBFile->tlink);
57 caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
58 if (CIFS_UNIX_EXTATTR_CAP & caps) {
59 rc = CIFSGetExtAttr(xid, tcon,
60 pSMBFile->fid.netfid,
61 &ExtAttrBits, &ExtAttrMask);
62 if (rc == 0)
63 rc = put_user(ExtAttrBits &
64 FS_FL_USER_VISIBLE,
65 (int __user *)arg);
66 }
67 break;
68
69 case FS_IOC_SETFLAGS:
70 if (pSMBFile == NULL)
71 break;
72 tcon = tlink_tcon(pSMBFile->tlink);
73 caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
74 if (CIFS_UNIX_EXTATTR_CAP & caps) {
75 if (get_user(ExtAttrBits, (int __user *)arg)) {
76 rc = -EFAULT;
77 break;
78 }
79
80
81
82
83
84
85 }
86 cFYI(1, "set flags not implemented yet");
87 break;
88#endif
89 default:
90 cFYI(1, "unsupported ioctl");
91 break;
92 }
93
94 free_xid(xid);
95 return rc;
96}
97