]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - fs/cifs/ioctl.c
new helper: file_inode(file)
[mirror_ubuntu-artful-kernel.git] / fs / cifs / ioctl.c
CommitLineData
1da177e4
LT
1/*
2 * fs/cifs/ioctl.c
3 *
4 * vfs operations that deal with io control
5 *
fb8c4b14 6 * Copyright (C) International Business Machines Corp., 2005,2007
1da177e4
LT
7 * Author(s): Steve French (sfrench@us.ibm.com)
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 */
f654bac2 23
1da177e4 24#include <linux/fs.h>
1da177e4
LT
25#include "cifspdu.h"
26#include "cifsglob.h"
27#include "cifsproto.h"
28#include "cifs_debug.h"
c67593a0 29#include "cifsfs.h"
1da177e4 30
f9ddcca4 31long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
1da177e4 32{
496ad9aa 33 struct inode *inode = file_inode(filep);
1da177e4 34 int rc = -ENOTTY; /* strange error - but the precedent */
6d5786a3 35 unsigned int xid;
c81156dd 36 struct cifs_sb_info *cifs_sb;
1da177e4 37#ifdef CONFIG_CIFS_POSIX
ba00ba64 38 struct cifsFileInfo *pSMBFile = filep->private_data;
96daf2b0 39 struct cifs_tcon *tcon;
f654bac2
SF
40 __u64 ExtAttrBits = 0;
41 __u64 ExtAttrMask = 0;
61876395 42 __u64 caps;
c81156dd 43#endif /* CONFIG_CIFS_POSIX */
f654bac2 44
6d5786a3 45 xid = get_xid();
f654bac2 46
b6b38f70 47 cFYI(1, "ioctl file %p cmd %u arg %lu", filep, command, arg);
f28ac91b 48
f654bac2 49 cifs_sb = CIFS_SB(inode->i_sb);
f654bac2 50
5fdae1f6 51 switch (command) {
f28ac91b 52#ifdef CONFIG_CIFS_POSIX
36695673 53 case FS_IOC_GETFLAGS:
61876395
JL
54 if (pSMBFile == NULL)
55 break;
56 tcon = tlink_tcon(pSMBFile->tlink);
57 caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
5fdae1f6 58 if (CIFS_UNIX_EXTATTR_CAP & caps) {
4b4de76e
PS
59 rc = CIFSGetExtAttr(xid, tcon,
60 pSMBFile->fid.netfid,
61 &ExtAttrBits, &ExtAttrMask);
5fdae1f6 62 if (rc == 0)
f654bac2 63 rc = put_user(ExtAttrBits &
36695673 64 FS_FL_USER_VISIBLE,
f654bac2
SF
65 (int __user *)arg);
66 }
67 break;
68
36695673 69 case FS_IOC_SETFLAGS:
61876395
JL
70 if (pSMBFile == NULL)
71 break;
72 tcon = tlink_tcon(pSMBFile->tlink);
73 caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
5fdae1f6
SF
74 if (CIFS_UNIX_EXTATTR_CAP & caps) {
75 if (get_user(ExtAttrBits, (int __user *)arg)) {
f654bac2 76 rc = -EFAULT;
c81156dd 77 break;
f654bac2 78 }
4b4de76e
PS
79 /*
80 * rc = CIFSGetExtAttr(xid, tcon,
81 * pSMBFile->fid.netfid,
82 * extAttrBits,
83 * &ExtAttrMask);
84 */
f654bac2 85 }
b6b38f70 86 cFYI(1, "set flags not implemented yet");
f654bac2 87 break;
f28ac91b 88#endif /* CONFIG_CIFS_POSIX */
1da177e4 89 default:
b6b38f70 90 cFYI(1, "unsupported ioctl");
f28ac91b 91 break;
1da177e4 92 }
f654bac2 93
6d5786a3 94 free_xid(xid);
1da177e4 95 return rc;
5fdae1f6 96}