Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ioctl.c
Go to the documentation of this file.
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 long 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; /* strange error - but the precedent */
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 /* CONFIG_CIFS_POSIX */
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 &
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  * rc = CIFSGetExtAttr(xid, tcon,
81  * pSMBFile->fid.netfid,
82  * extAttrBits,
83  * &ExtAttrMask);
84  */
85  }
86  cFYI(1, "set flags not implemented yet");
87  break;
88 #endif /* CONFIG_CIFS_POSIX */
89  default:
90  cFYI(1, "unsupported ioctl");
91  break;
92  }
93 
94  free_xid(xid);
95  return rc;
96 }