Linux Audio

Check our new training course

Linux debugging, profiling, tracing and performance analysis training

Mar 24-27, 2025, special US time zones
Register
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		static bool warned = false;
 55		case CIFS_IOC_CHECKUMOUNT:
 56			if (!warned) {
 57				warned = true;
 58				cERROR(1, "the CIFS_IOC_CHECKMOUNT ioctl will "
 59					  "be deprecated in 3.7. Please "
 60					  "migrate away from the use of "
 61					  "umount.cifs");
 62			}
 63			cFYI(1, "User unmount attempted");
 64			if (cifs_sb->mnt_uid == current_uid())
 65				rc = 0;
 66			else {
 67				rc = -EACCES;
 68				cFYI(1, "uids do not match");
 69			}
 70			break;
 71#ifdef CONFIG_CIFS_POSIX
 72		case FS_IOC_GETFLAGS:
 73			if (pSMBFile == NULL)
 74				break;
 75			tcon = tlink_tcon(pSMBFile->tlink);
 76			caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
 77			if (CIFS_UNIX_EXTATTR_CAP & caps) {
 78				rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid,
 79					&ExtAttrBits, &ExtAttrMask);
 80				if (rc == 0)
 81					rc = put_user(ExtAttrBits &
 82						FS_FL_USER_VISIBLE,
 83						(int __user *)arg);
 84			}
 85			break;
 86
 87		case FS_IOC_SETFLAGS:
 88			if (pSMBFile == NULL)
 89				break;
 90			tcon = tlink_tcon(pSMBFile->tlink);
 91			caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
 92			if (CIFS_UNIX_EXTATTR_CAP & caps) {
 93				if (get_user(ExtAttrBits, (int __user *)arg)) {
 94					rc = -EFAULT;
 95					break;
 96				}
 97				/* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid,
 98					extAttrBits, &ExtAttrMask);*/
 99			}
100			cFYI(1, "set flags not implemented yet");
101			break;
102#endif /* CONFIG_CIFS_POSIX */
103		default:
104			cFYI(1, "unsupported ioctl");
105			break;
106	}
107
108	FreeXid(xid);
109	return rc;
110}