Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
  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
 31#define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2)
 32
 33long 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}