Ronnie Sahlberg <lsahlber@xxxxxxxxxx> writes: > This allows userspace tools to query the raw info levels for cifs files > and process the response in userspace. > In particular this is useful for many of those data where there is no > corresponding native data structure in linux. > For example querying the security descriptor for a file and extract the > SIDs. > > Signed-off-by: Ronnie Sahlberg <lsahlber@xxxxxxxxxx> > --- > fs/cifs/cifs_ioctl.h | 11 +++++++ > fs/cifs/cifsglob.h | 4 +++ > fs/cifs/ioctl.c | 21 +++++++++++++ > fs/cifs/smb2inode.c | 2 +- > fs/cifs/smb2ops.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++- > fs/cifs/smb2pdu.c | 16 +++++----- > fs/cifs/smb2proto.h | 3 +- > 7 files changed, 132 insertions(+), 11 deletions(-) I couldn't apply it on for-next directly, it requires your compounding changes (minus 2 patches already in there). I have applied and built both patches in their respective repo but I run into an issue. The ioctl id doesn't match. I've added a debug print of CIFS_QUERY_INFO (expected) along with the command received. $ smbinfo quota file fs/cifs/inode.c: CIFS VFS: in cifs_revalidate_dentry_attr as Xid: 8 with uid: 0 fs/cifs/dir.c: name: \file fs/cifs/inode.c: Update attributes: \file inode 0x(____ptrval____) count 1 dentry: 0x(____ptrval____) d_time 0 jiffies 4294893374 fs/cifs/inode.c: Getting info on \file fs/cifs/smb2misc.c: Calculated size 153 length 152 mismatch mid 23 fs/cifs/inode.c: cifs_revalidate_cache: revalidating inode 23949104 fs/cifs/inode.c: cifs_revalidate_cache: invalidating inode 23949104 mapping fs/cifs/inode.c: CIFS VFS: leaving cifs_revalidate_dentry_attr (xid = 8) rc = 0 fs/cifs/file.c: CIFS VFS: in cifs_open as Xid: 9 with uid: 0 fs/cifs/dir.c: name: \file fs/cifs/file.c: inode = 0x(____ptrval____) file flags are 0x8000 for \file fs/cifs/smb2pdu.c: create/open fs/cifs/smb2pdu.c: Query Info fs/cifs/inode.c: Getting info on \file fs/cifs/inode.c: cifs_revalidate_cache: revalidating inode 23949104 fs/cifs/inode.c: cifs_revalidate_cache: inode 23949104 is unchanged fs/cifs/smb2ops.c: RHW Lease granted on inode (____ptrval____) fs/cifs/file.c: CIFS VFS: leaving cifs_open (xid = 9) rc = 0 fs/cifs/ioctl.c: CIFS VFS: in cifs_ioctl as Xid: 10 with uid: 0 fs/cifs/ioctl.c: cifs ioctl 0xc018cf07 fs/cifs/ioctl.c: cifs ioctl 0xc010cf07 <--expected fs/cifs/ioctl.c: unsupported ioctl fs/cifs/ioctl.c: CIFS VFS: leaving cifs_ioctl (xid = 10) rc = -25 ioctl failed with Inappropriate ioctl for device fs/cifs/file.c: Flush inode (____ptrval____) file (____ptrval____) rc 0 fs/cifs/file.c: closing last open instance for inode (____ptrval____) fs/cifs/file.c: CIFS VFS: in cifsFileInfo_put as Xid: 11 with uid: 0 fs/cifs/smb2pdu.c: Close $ smbinfo secdesc file fs/cifs/file.c: CIFS VFS: in cifs_open as Xid: 12 with uid: 0 fs/cifs/dir.c: name: \file fs/cifs/file.c: inode = 0x(____ptrval____) file flags are 0x8000 for \file fs/cifs/smb2pdu.c: create/open fs/cifs/smb2pdu.c: Query Info fs/cifs/inode.c: Getting info on \file fs/cifs/inode.c: cifs_revalidate_cache: revalidating inode 23949104 fs/cifs/inode.c: cifs_revalidate_cache: inode 23949104 is unchanged fs/cifs/smb2ops.c: RHW Lease granted on inode (____ptrval____) fs/cifs/file.c: CIFS VFS: leaving cifs_open (xid = 12) rc = 0 fs/cifs/ioctl.c: CIFS VFS: in cifs_ioctl as Xid: 13 with uid: 0 fs/cifs/ioctl.c: cifs ioctl 0xc018cf07 fs/cifs/ioctl.c: cifs ioctl 0xc010cf07 <--expected fs/cifs/ioctl.c: unsupported ioctl fs/cifs/ioctl.c: CIFS VFS: leaving cifs_ioctl (xid = 13) rc = -25 ioctl failed with Inappropriate ioctl for device fs/cifs/file.c: Flush inode (____ptrval____) file (____ptrval____) rc 0 fs/cifs/file.c: closing last open instance for inode (____ptrval____) fs/cifs/file.c: CIFS VFS: in cifsFileInfo_put as Xid: 14 with uid: 0 fs/cifs/smb2pdu.c: Close kernel CIFS_QUERY_INFO is 0xc010cf07 smbinfo CIFS_QUERY_INFO is 0xc018cf07 Yet they are defined the same way: #define CIFS_QUERY_INFO _IOWR(CIFS_IOCTL_MAGIC, 7, struct smb_query_info) Turns out the reason is because _IOWR uses the size of the struct and the struct do not match: > > +struct smb_query_info { > + __u32 info_type; > + __u32 file_info_class; > + __u32 additional_information; > + __u32 flags; > + __u32 input_buffer_length; > + __u32 output_buffer_length; > + /* char buffer[]; */ > +} __packed; VS > +struct smb_query_info { > + __u32 buffer_length; > + __u32 info_type; > + __u32 file_info_class; > + __u32 additional_information; > + /* char buffer[]; */ > +} __packed; I think you send the wrong kernel patch? Or you forgot to update something. Cheers, -- Aurélien Aptel / SUSE Labs Samba Team GPG: 1839 CB5F 9F5B FB9B AA97 8C99 03C8 A49B 521B D5D3 SUSE Linux GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany GF: Felix Imendörffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nürnberg)