]> git.karo-electronics.de Git - karo-tx-linux.git/commit
cifs: simplify id_to_sid and sid_to_id mapping code
authorJeff Layton <jlayton@redhat.com>
Fri, 19 Oct 2012 15:24:17 +0000 (11:24 -0400)
committerJeff Layton <jlayton@redhat.com>
Fri, 19 Oct 2012 15:24:17 +0000 (11:24 -0400)
commite02d1fe136a69e891d9c15b24b1a06ce2b9d4f4d
tree58bed09c812a2baecd2d8ed1a23b8a32ae23b06a
parentad01678e9929aba61611a33029216d4d0ed9962d
cifs: simplify id_to_sid and sid_to_id mapping code

The cifs.idmap handling code currently causes the kernel to cache the
data from userspace twice. It first looks in a rbtree to see if there is
a matching entry for the given id. If there isn't then it calls
request_key which then checks its cache and then calls out to userland
if it doesn't have one. If the userland program establishes a mapping
and downcalls with that info, it then gets cached in the keyring and in
this rbtree.

Aside from the double memory usage and the performance penalty in doing
all of these extra copies, there are some nasty bugs in here too. The
code declares four rbtrees and spinlocks to protect them, but only seems
to use two of them. The upshot is that the same tree is used to hold
(eg) uid:sid and sid:uid mappings. The comparitors aren't equipped to
deal with that.

I think we'd be best off to remove a layer of caching in this code. If
this was originally done for performance reasons, then that really seems
like a premature optimization.

This patch does that -- it removes the rbtrees and the locks that
protect them and simply has the code do a request_key call on each call
into sid_to_id and id_to_sid. This greatly simplifies this code and
should roughly halve the memory utilization from using the idmapping
code.

Reviewed-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
fs/cifs/cifsacl.c
fs/cifs/cifsacl.h
fs/cifs/cifsfs.c
fs/cifs/cifsproto.h