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        unsigned 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 = get_xid();
  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        free_xid(xid);
 109        return rc;
 110}
 111
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.