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        struct cifsFileInfo *pSMBFile = filep->private_data;
  41        struct cifsTconInfo *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}
 103