X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=fs%2Fcifs%2Fioctl.c;h=d24fe6880a04e63f1ea370ef67ca92f0205f3fb5;hb=f50b9fef9b94e4305941a5f28e44dbd042aa44d3;hp=7b84b2bb8c4a85e8e50247ee3a514c6baad8dd7d;hpb=f654bac2227adc5c6956405290eeb4f81f09e9ff;p=linux-2.6-omap-h63xx.git diff --git a/fs/cifs/ioctl.c b/fs/cifs/ioctl.c index 7b84b2bb8c4..d24fe6880a0 100644 --- a/fs/cifs/ioctl.c +++ b/fs/cifs/ioctl.c @@ -3,7 +3,7 @@ * * vfs operations that deal with io control * - * Copyright (C) International Business Machines Corp., 2005 + * Copyright (C) International Business Machines Corp., 2005,2007 * Author(s): Steve French (sfrench@us.ibm.com) * * This library is free software; you can redistribute it and/or modify @@ -22,74 +22,89 @@ */ #include -#include #include "cifspdu.h" #include "cifsglob.h" #include "cifsproto.h" #include "cifs_debug.h" +#include "cifsfs.h" -int cifs_ioctl (struct inode * inode, struct file * filep, +#define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) + +int cifs_ioctl (struct inode *inode, struct file *filep, unsigned int command, unsigned long arg) { int rc = -ENOTTY; /* strange error - but the precedent */ + int xid; + struct cifs_sb_info *cifs_sb; #ifdef CONFIG_CIFS_POSIX __u64 ExtAttrBits = 0; __u64 ExtAttrMask = 0; __u64 caps; -#endif /* CONFIG_CIFS_POSIX */ - int xid; - struct cifs_sb_info *cifs_sb; struct cifsTconInfo *tcon; struct cifsFileInfo *pSMBFile = (struct cifsFileInfo *)filep->private_data; +#endif /* CONFIG_CIFS_POSIX */ xid = GetXid(); + cFYI(1, ("ioctl file %p cmd %u arg %lu", filep, command, arg)); + cifs_sb = CIFS_SB(inode->i_sb); - tcon = cifs_sb->tcon; - if (pSMBFile == NULL) - goto cifs_ioctl_out; #ifdef CONFIG_CIFS_POSIX - if(tcon) + tcon = cifs_sb->tcon; + if (tcon) caps = le64_to_cpu(tcon->fsUnixInfo.Capability); else { rc = -EIO; - goto cifs_ioctl_out; + FreeXid(xid); + return -EIO; } +#endif /* CONFIG_CIFS_POSIX */ - cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); - switch(command) { - case EXT2_IOC_GETFLAGS: - if(CIFS_UNIX_EXTATTR_CAP & caps) { + switch (command) { + case CIFS_IOC_CHECKUMOUNT: + cFYI(1, ("User unmount attempted")); + if (cifs_sb->mnt_uid == current->uid) + rc = 0; + else { + rc = -EACCES; + cFYI(1, ("uids do not match")); + } + break; +#ifdef CONFIG_CIFS_POSIX + case FS_IOC_GETFLAGS: + if (CIFS_UNIX_EXTATTR_CAP & caps) { + if (pSMBFile == NULL) + break; rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, &ExtAttrBits, &ExtAttrMask); - if(rc == 0) + if (rc == 0) rc = put_user(ExtAttrBits & - EXT2_FL_USER_VISIBLE, + FS_FL_USER_VISIBLE, (int __user *)arg); } break; - case EXT2_IOC_SETFLAGS: - if(CIFS_UNIX_EXTATTR_CAP & caps) { - if(get_user(ExtAttrBits,(int __user *)arg)) { + case FS_IOC_SETFLAGS: + if (CIFS_UNIX_EXTATTR_CAP & caps) { + if (get_user(ExtAttrBits, (int __user *)arg)) { rc = -EFAULT; - goto cifs_ioctl_out; + break; } - /* rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, + if (pSMBFile == NULL) + break; + /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, extAttrBits, &ExtAttrMask);*/ - } - cFYI(1,("set flags not implemented yet")); + cFYI(1, ("set flags not implemented yet")); break; +#endif /* CONFIG_CIFS_POSIX */ default: - cFYI(1,("unsupported ioctl")); - return rc; + cFYI(1, ("unsupported ioctl")); + break; } -#endif /* CONFIG_CIFS_POSIX */ -cifs_ioctl_out: FreeXid(xid); return rc; -} +}