at v3.12 96 lines 2.7 kB view raw
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 (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 */ 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 = file_inode(filep); 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 cifs_dbg(FYI, "ioctl file %p cmd %u arg %lu\n", 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 * rc = CIFSGetExtAttr(xid, tcon, 81 * pSMBFile->fid.netfid, 82 * extAttrBits, 83 * &ExtAttrMask); 84 */ 85 } 86 cifs_dbg(FYI, "set flags not implemented yet\n"); 87 break; 88#endif /* CONFIG_CIFS_POSIX */ 89 default: 90 cifs_dbg(FYI, "unsupported ioctl\n"); 91 break; 92 } 93 94 free_xid(xid); 95 return rc; 96}