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
  31long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
  32{
  33        struct inode *inode = filep->f_dentry->d_inode;
  34        int rc = -ENOTTY; /* strange error - but the precedent */
  35        unsigned int xid;
  36        struct cifs_sb_info *cifs_sb;
  37#ifdef CONFIG_CIFS_POSIX
  38        struct cifsFileInfo *pSMBFile = filep->private_data;
  39        struct cifs_tcon *tcon;
  40        __u64   ExtAttrBits = 0;
  41        __u64   ExtAttrMask = 0;
  42        __u64   caps;
  43#endif /* CONFIG_CIFS_POSIX */
  44
  45        xid = get_xid();
  46
  47        cFYI(1, "ioctl file %p  cmd %u  arg %lu", filep, command, arg);
  48
  49        cifs_sb = CIFS_SB(inode->i_sb);
  50
  51        switch (command) {
  52#ifdef CONFIG_CIFS_POSIX
  53                case FS_IOC_GETFLAGS:
  54                        if (pSMBFile == NULL)
  55                                break;
  56                        tcon = tlink_tcon(pSMBFile->tlink);
  57                        caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
  58                        if (CIFS_UNIX_EXTATTR_CAP & caps) {
  59                                rc = CIFSGetExtAttr(xid, tcon,
  60                                                    pSMBFile->fid.netfid,
  61                                                    &ExtAttrBits, &ExtAttrMask);
  62                                if (rc == 0)
  63                                        rc = put_user(ExtAttrBits &
  64                                                FS_FL_USER_VISIBLE,
  65                                                (int __user *)arg);
  66                        }
  67                        break;
  68
  69                case FS_IOC_SETFLAGS:
  70                        if (pSMBFile == NULL)
  71                                break;
  72                        tcon = tlink_tcon(pSMBFile->tlink);
  73                        caps = le64_to_cpu(tcon->fsUnixInfo.Capability);
  74                        if (CIFS_UNIX_EXTATTR_CAP & caps) {
  75                                if (get_user(ExtAttrBits, (int __user *)arg)) {
  76                                        rc = -EFAULT;
  77                                        break;
  78                                }
  79                                /*
  80                                 * rc = CIFSGetExtAttr(xid, tcon,
  81                                 *                     pSMBFile->fid.netfid,
  82                                 *                     extAttrBits,
  83                                 *                     &ExtAttrMask);
  84                                 */
  85                        }
  86                        cFYI(1, "set flags not implemented yet");
  87                        break;
  88#endif /* CONFIG_CIFS_POSIX */
  89                default:
  90                        cFYI(1, "unsupported ioctl");
  91                        break;
  92        }
  93
  94        free_xid(xid);
  95        return rc;
  96}
  97