linux/fs/cifs/ioctl.c
<<
>>
Prefs
   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        __u64   ExtAttrBits = 0;
  41        __u64   ExtAttrMask = 0;
  42        __u64   caps;
  43        struct cifsTconInfo *tcon;
  44        struct cifsFileInfo *pSMBFile =
  45                (struct cifsFileInfo *)filep->private_data;
  46#endif /* CONFIG_CIFS_POSIX */
  47
  48        xid = GetXid();
  49
  50        cFYI(1, ("ioctl file %p  cmd %u  arg %lu", filep, command, arg));
  51
  52        cifs_sb = CIFS_SB(inode->i_sb);
  53
  54#ifdef CONFIG_CIFS_POSIX
  55        tcon = cifs_sb->tcon;
  56        if (tcon)
  57                caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
  58        else {
  59                rc = -EIO;
  60                FreeXid(xid);
  61                return -EIO;
  62        }
  63#endif /* CONFIG_CIFS_POSIX */
  64
  65        switch (command) {
  66                case CIFS_IOC_CHECKUMOUNT:
  67                        cFYI(1, ("User unmount attempted"));
  68                        if (cifs_sb->mnt_uid == current_uid())
  69                                rc = 0;
  70                        else {
  71                                rc = -EACCES;
  72                                cFYI(1, ("uids do not match"));
  73                        }
  74                        break;
  75#ifdef CONFIG_CIFS_POSIX
  76                case FS_IOC_GETFLAGS:
  77                        if (CIFS_UNIX_EXTATTR_CAP & caps) {
  78                                if (pSMBFile == NULL)
  79                                        break;
  80                                rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid,
  81                                        &ExtAttrBits, &ExtAttrMask);
  82                                if (rc == 0)
  83                                        rc = put_user(ExtAttrBits &
  84                                                FS_FL_USER_VISIBLE,
  85                                                (int __user *)arg);
  86                        }
  87                        break;
  88
  89                case FS_IOC_SETFLAGS:
  90                        if (CIFS_UNIX_EXTATTR_CAP & caps) {
  91                                if (get_user(ExtAttrBits, (int __user *)arg)) {
  92                                        rc = -EFAULT;
  93                                        break;
  94                                }
  95                                if (pSMBFile == NULL)
  96                                        break;
  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}
 111