Loading fs/cifs/cifsfs.c +4 −0 Original line number Diff line number Diff line Loading @@ -190,6 +190,7 @@ cifs_statfs(struct super_block *sb, struct kstatfs *buf) #ifdef CONFIG_CIFS_EXPERIMENTAL /* BB we could add a second check for a QFS Unix capability bit */ /* BB FIXME check CIFS_POSIX_EXTENSIONS Unix cap first FIXME BB */ if (pTcon->ses->capabilities & CAP_UNIX) rc = CIFSSMBQFSPosixInfo(xid, pTcon, buf); Loading Loading @@ -599,6 +600,9 @@ struct file_operations cifs_dir_ops = { #ifdef CONFIG_CIFS_EXPERIMENTAL .dir_notify = cifs_dir_notify, #endif /* CONFIG_CIFS_EXPERIMENTAL */ #ifdef CONFIG_CIFS_POSIX .ioctl = cifs_ioctl, #endif /* CONFIG_CIFS_POSIX */ }; static void Loading fs/cifs/cifspdu.h +1 −1 Original line number Diff line number Diff line Loading @@ -1556,7 +1556,7 @@ typedef struct { #define CIFS_UNIX_POSIX_ACL_CAP 0x00000002 /* support getfacl/setfacl */ #define CIFS_UNIX_XATTR_CAP 0x00000004 /* support new namespace */ #define CIFS_UNIX_EXTATTR_CAP 0x00000008 /* support chattr/chflag */ #define CIFS_POSIX_EXTENSIONS 0x00000010 /* support for new QFSInfo */ typedef struct { /* For undefined recommended transfer size return -1 in that field */ __le32 OptimalTransferSize; /* bsize on some os, iosize on other os */ Loading fs/cifs/ioctl.c +23 −8 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ #include "cifs_debug.h" #include "cifsfs.h" #define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) int cifs_ioctl (struct inode * inode, struct file * filep, unsigned int command, unsigned long arg) { Loading @@ -36,8 +38,8 @@ int cifs_ioctl (struct inode * inode, struct file * filep, #ifdef CONFIG_CIFS_POSIX __u64 ExtAttrBits = 0; __u64 ExtAttrMask = 0; __u64 caps; #endif /* CONFIG_CIFS_POSIX */ __u64 caps; int xid; struct cifs_sb_info *cifs_sb; struct cifsTconInfo *tcon; Loading @@ -46,12 +48,11 @@ int cifs_ioctl (struct inode * inode, struct file * filep, 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) caps = le64_to_cpu(tcon->fsUnixInfo.Capability); else { Loading @@ -59,10 +60,22 @@ int cifs_ioctl (struct inode * inode, struct file * filep, goto cifs_ioctl_out; } cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); switch(command) { case CIFS_IOC_CHECKUMOUNT: cFYI(1,("User unmount attempted")); /* BB FIXME - add missing code here FIXME */ if(cifs_sb->mnt_uid == current->uid) rc = 0; else { rc = -EACCES; cFYI(1,("uids do not match")); } break; #ifdef CONFIG_CIFS_POSIX case EXT2_IOC_GETFLAGS: if(CIFS_UNIX_EXTATTR_CAP & caps) { if (pSMBFile == NULL) goto cifs_ioctl_out; rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, &ExtAttrBits, &ExtAttrMask); if(rc == 0) Loading @@ -78,17 +91,19 @@ int cifs_ioctl (struct inode * inode, struct file * filep, rc = -EFAULT; goto cifs_ioctl_out; } if (pSMBFile == NULL) goto cifs_ioctl_out; /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, extAttrBits, &ExtAttrMask);*/ } cFYI(1,("set flags not implemented yet")); break; #endif /* CONFIG_CIFS_POSIX */ default: cFYI(1,("unsupported ioctl")); return rc; break; } #endif /* CONFIG_CIFS_POSIX */ cifs_ioctl_out: FreeXid(xid); Loading Loading
fs/cifs/cifsfs.c +4 −0 Original line number Diff line number Diff line Loading @@ -190,6 +190,7 @@ cifs_statfs(struct super_block *sb, struct kstatfs *buf) #ifdef CONFIG_CIFS_EXPERIMENTAL /* BB we could add a second check for a QFS Unix capability bit */ /* BB FIXME check CIFS_POSIX_EXTENSIONS Unix cap first FIXME BB */ if (pTcon->ses->capabilities & CAP_UNIX) rc = CIFSSMBQFSPosixInfo(xid, pTcon, buf); Loading Loading @@ -599,6 +600,9 @@ struct file_operations cifs_dir_ops = { #ifdef CONFIG_CIFS_EXPERIMENTAL .dir_notify = cifs_dir_notify, #endif /* CONFIG_CIFS_EXPERIMENTAL */ #ifdef CONFIG_CIFS_POSIX .ioctl = cifs_ioctl, #endif /* CONFIG_CIFS_POSIX */ }; static void Loading
fs/cifs/cifspdu.h +1 −1 Original line number Diff line number Diff line Loading @@ -1556,7 +1556,7 @@ typedef struct { #define CIFS_UNIX_POSIX_ACL_CAP 0x00000002 /* support getfacl/setfacl */ #define CIFS_UNIX_XATTR_CAP 0x00000004 /* support new namespace */ #define CIFS_UNIX_EXTATTR_CAP 0x00000008 /* support chattr/chflag */ #define CIFS_POSIX_EXTENSIONS 0x00000010 /* support for new QFSInfo */ typedef struct { /* For undefined recommended transfer size return -1 in that field */ __le32 OptimalTransferSize; /* bsize on some os, iosize on other os */ Loading
fs/cifs/ioctl.c +23 −8 Original line number Diff line number Diff line Loading @@ -29,6 +29,8 @@ #include "cifs_debug.h" #include "cifsfs.h" #define CIFS_IOC_CHECKUMOUNT _IO(0xCF, 2) int cifs_ioctl (struct inode * inode, struct file * filep, unsigned int command, unsigned long arg) { Loading @@ -36,8 +38,8 @@ int cifs_ioctl (struct inode * inode, struct file * filep, #ifdef CONFIG_CIFS_POSIX __u64 ExtAttrBits = 0; __u64 ExtAttrMask = 0; __u64 caps; #endif /* CONFIG_CIFS_POSIX */ __u64 caps; int xid; struct cifs_sb_info *cifs_sb; struct cifsTconInfo *tcon; Loading @@ -46,12 +48,11 @@ int cifs_ioctl (struct inode * inode, struct file * filep, 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) caps = le64_to_cpu(tcon->fsUnixInfo.Capability); else { Loading @@ -59,10 +60,22 @@ int cifs_ioctl (struct inode * inode, struct file * filep, goto cifs_ioctl_out; } cFYI(1,("ioctl file %p cmd %u arg %lu",filep,command,arg)); switch(command) { case CIFS_IOC_CHECKUMOUNT: cFYI(1,("User unmount attempted")); /* BB FIXME - add missing code here FIXME */ if(cifs_sb->mnt_uid == current->uid) rc = 0; else { rc = -EACCES; cFYI(1,("uids do not match")); } break; #ifdef CONFIG_CIFS_POSIX case EXT2_IOC_GETFLAGS: if(CIFS_UNIX_EXTATTR_CAP & caps) { if (pSMBFile == NULL) goto cifs_ioctl_out; rc = CIFSGetExtAttr(xid, tcon, pSMBFile->netfid, &ExtAttrBits, &ExtAttrMask); if(rc == 0) Loading @@ -78,17 +91,19 @@ int cifs_ioctl (struct inode * inode, struct file * filep, rc = -EFAULT; goto cifs_ioctl_out; } if (pSMBFile == NULL) goto cifs_ioctl_out; /* rc= CIFSGetExtAttr(xid,tcon,pSMBFile->netfid, extAttrBits, &ExtAttrMask);*/ } cFYI(1,("set flags not implemented yet")); break; #endif /* CONFIG_CIFS_POSIX */ default: cFYI(1,("unsupported ioctl")); return rc; break; } #endif /* CONFIG_CIFS_POSIX */ cifs_ioctl_out: FreeXid(xid); Loading