Re: [PATCH v2 5/9] cifs: simplify id_to_sid and sid_to_id mapping code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sun, 25 Nov 2012 14:38:48 -0600
Steve French <smfrench@xxxxxxxxx> wrote:

> For this patch, your argument makes sense, but wondering if the
> performance hit is measurable (and remembering how atrocious ACL
> lookup performance can be on some servers).  Have you or Shirish tried
> to measure the performance affect with this patch vs. current code?
> 

I haven't, but the existing code was broken enough that any comparison
before and after wouldn't mean much. You'd need to repair the existing
code first and then do the comparison...

> On Fri, Oct 19, 2012 at 7:20 AM, Jeff Layton <jlayton@xxxxxxxxxx> wrote:
> > 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.
> >
> > Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
> > ---
> >  fs/cifs/cifsacl.c   | 535 +++++++++-------------------------------------------
> >  fs/cifs/cifsacl.h   |  28 +--
> >  fs/cifs/cifsfs.c    |   1 -
> >  fs/cifs/cifsproto.h |   1 -
> >  4 files changed, 99 insertions(+), 466 deletions(-)
> >
> > diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
> > index 42b3fe9..f4508ee 100644
> > --- a/fs/cifs/cifsacl.c
> > +++ b/fs/cifs/cifsacl.c
> > @@ -44,128 +44,6 @@ static const struct cifs_sid sid_user = {1, 2 , {0, 0, 0, 0, 0, 5}, {} };
> >
> >  static const struct cred *root_cred;
> >
> > -static void
> > -shrink_idmap_tree(struct rb_root *root, int nr_to_scan, int *nr_rem,
> > -                       int *nr_del)
> > -{
> > -       struct rb_node *node;
> > -       struct rb_node *tmp;
> > -       struct cifs_sid_id *psidid;
> > -
> > -       node = rb_first(root);
> > -       while (node) {
> > -               tmp = node;
> > -               node = rb_next(tmp);
> > -               psidid = rb_entry(tmp, struct cifs_sid_id, rbnode);
> > -               if (nr_to_scan == 0 || *nr_del == nr_to_scan)
> > -                       ++(*nr_rem);
> > -               else {
> > -                       if (time_after(jiffies, psidid->time + SID_MAP_EXPIRE)
> > -                                               && psidid->refcount == 0) {
> > -                               rb_erase(tmp, root);
> > -                               ++(*nr_del);
> > -                       } else
> > -                               ++(*nr_rem);
> > -               }
> > -       }
> > -}
> > -
> > -/*
> > - * Run idmap cache shrinker.
> > - */
> > -static int
> > -cifs_idmap_shrinker(struct shrinker *shrink, struct shrink_control *sc)
> > -{
> > -       int nr_to_scan = sc->nr_to_scan;
> > -       int nr_del = 0;
> > -       int nr_rem = 0;
> > -       struct rb_root *root;
> > -
> > -       root = &uidtree;
> > -       spin_lock(&siduidlock);
> > -       shrink_idmap_tree(root, nr_to_scan, &nr_rem, &nr_del);
> > -       spin_unlock(&siduidlock);
> > -
> > -       root = &gidtree;
> > -       spin_lock(&sidgidlock);
> > -       shrink_idmap_tree(root, nr_to_scan, &nr_rem, &nr_del);
> > -       spin_unlock(&sidgidlock);
> > -
> > -       root = &siduidtree;
> > -       spin_lock(&uidsidlock);
> > -       shrink_idmap_tree(root, nr_to_scan, &nr_rem, &nr_del);
> > -       spin_unlock(&uidsidlock);
> > -
> > -       root = &sidgidtree;
> > -       spin_lock(&gidsidlock);
> > -       shrink_idmap_tree(root, nr_to_scan, &nr_rem, &nr_del);
> > -       spin_unlock(&gidsidlock);
> > -
> > -       return nr_rem;
> > -}
> > -
> > -static void
> > -sid_rb_insert(struct rb_root *root, unsigned long cid,
> > -               struct cifs_sid_id **psidid, char *typestr)
> > -{
> > -       char *strptr;
> > -       struct rb_node *node = root->rb_node;
> > -       struct rb_node *parent = NULL;
> > -       struct rb_node **linkto = &(root->rb_node);
> > -       struct cifs_sid_id *lsidid;
> > -
> > -       while (node) {
> > -               lsidid = rb_entry(node, struct cifs_sid_id, rbnode);
> > -               parent = node;
> > -               if (cid > lsidid->id) {
> > -                       linkto = &(node->rb_left);
> > -                       node = node->rb_left;
> > -               }
> > -               if (cid < lsidid->id) {
> > -                       linkto = &(node->rb_right);
> > -                       node = node->rb_right;
> > -               }
> > -       }
> > -
> > -       (*psidid)->id = cid;
> > -       (*psidid)->time = jiffies - (SID_MAP_RETRY + 1);
> > -       (*psidid)->refcount = 0;
> > -
> > -       sprintf((*psidid)->sidstr, "%s", typestr);
> > -       strptr = (*psidid)->sidstr + strlen((*psidid)->sidstr);
> > -       sprintf(strptr, "%ld", cid);
> > -
> > -       clear_bit(SID_ID_PENDING, &(*psidid)->state);
> > -       clear_bit(SID_ID_MAPPED, &(*psidid)->state);
> > -
> > -       rb_link_node(&(*psidid)->rbnode, parent, linkto);
> > -       rb_insert_color(&(*psidid)->rbnode, root);
> > -}
> > -
> > -static struct cifs_sid_id *
> > -sid_rb_search(struct rb_root *root, unsigned long cid)
> > -{
> > -       struct rb_node *node = root->rb_node;
> > -       struct cifs_sid_id *lsidid;
> > -
> > -       while (node) {
> > -               lsidid = rb_entry(node, struct cifs_sid_id, rbnode);
> > -               if (cid > lsidid->id)
> > -                       node = node->rb_left;
> > -               else if (cid < lsidid->id)
> > -                       node = node->rb_right;
> > -               else /* node found */
> > -                       return lsidid;
> > -       }
> > -
> > -       return NULL;
> > -}
> > -
> > -static struct shrinker cifs_shrinker = {
> > -       .shrink = cifs_idmap_shrinker,
> > -       .seeks = DEFAULT_SEEKS,
> > -};
> > -
> >  static int
> >  cifs_idmap_key_instantiate(struct key *key, struct key_preparsed_payload *prep)
> >  {
> > @@ -195,30 +73,39 @@ static struct key_type cifs_idmap_key_type = {
> >         .match       = user_match,
> >  };
> >
> > -static void
> > -sid_to_str(struct cifs_sid *sidptr, char *sidstr)
> > +static char *
> > +sid_to_key_str(struct cifs_sid *sidptr, unsigned int type)
> >  {
> > -       int i;
> > +       int i, len;
> >         unsigned int saval;
> > -       char *strptr;
> > +       char *sidstr, *strptr;
> >
> > -       strptr = sidstr;
> > +       /* 3 bytes for prefix */
> > +       sidstr = kmalloc(3 + SID_STRING_BASE_SIZE +
> > +                        (SID_STRING_SUBAUTH_SIZE * sidptr->num_subauth),
> > +                        GFP_KERNEL);
> > +       if (!sidstr)
> > +               return sidstr;
> >
> > -       sprintf(strptr, "S-%hhu", sidptr->revision);
> > -       strptr = sidstr + strlen(sidstr);
> > +       strptr = sidstr;
> > +       len = sprintf(strptr, "%cs:S-%hhu", type == SIDOWNER ? 'o' : 'g',
> > +                       sidptr->revision);
> > +       strptr += len;
> >
> >         for (i = 0; i < NUM_AUTHS; ++i) {
> >                 if (sidptr->authority[i]) {
> > -                       sprintf(strptr, "-%hhu", sidptr->authority[i]);
> > -                       strptr = sidstr + strlen(sidstr);
> > +                       len = sprintf(strptr, "-%hhu", sidptr->authority[i]);
> > +                       strptr += len;
> >                 }
> >         }
> >
> >         for (i = 0; i < sidptr->num_subauth; ++i) {
> >                 saval = le32_to_cpu(sidptr->sub_auth[i]);
> > -               sprintf(strptr, "-%u", saval);
> > -               strptr = sidstr + strlen(sidstr);
> > +               len = sprintf(strptr, "-%u", saval);
> > +               strptr += len;
> >         }
> > +
> > +       return sidstr;
> >  }
> >
> >  /*
> > @@ -284,184 +171,38 @@ cifs_copy_sid(struct cifs_sid *dst, const struct cifs_sid *src)
> >                 dst->sub_auth[i] = src->sub_auth[i];
> >  }
> >
> > -static void
> > -id_rb_insert(struct rb_root *root, struct cifs_sid *sidptr,
> > -               struct cifs_sid_id **psidid, char *typestr)
> > -{
> > -       int rc;
> > -       char *strptr;
> > -       struct rb_node *node = root->rb_node;
> > -       struct rb_node *parent = NULL;
> > -       struct rb_node **linkto = &(root->rb_node);
> > -       struct cifs_sid_id *lsidid;
> > -
> > -       while (node) {
> > -               lsidid = rb_entry(node, struct cifs_sid_id, rbnode);
> > -               parent = node;
> > -               rc = compare_sids(sidptr, &((lsidid)->sid));
> > -               if (rc > 0) {
> > -                       linkto = &(node->rb_left);
> > -                       node = node->rb_left;
> > -               } else if (rc < 0) {
> > -                       linkto = &(node->rb_right);
> > -                       node = node->rb_right;
> > -               }
> > -       }
> > -
> > -       cifs_copy_sid(&(*psidid)->sid, sidptr);
> > -       (*psidid)->time = jiffies - (SID_MAP_RETRY + 1);
> > -       (*psidid)->refcount = 0;
> > -
> > -       sprintf((*psidid)->sidstr, "%s", typestr);
> > -       strptr = (*psidid)->sidstr + strlen((*psidid)->sidstr);
> > -       sid_to_str(&(*psidid)->sid, strptr);
> > -
> > -       clear_bit(SID_ID_PENDING, &(*psidid)->state);
> > -       clear_bit(SID_ID_MAPPED, &(*psidid)->state);
> > -
> > -       rb_link_node(&(*psidid)->rbnode, parent, linkto);
> > -       rb_insert_color(&(*psidid)->rbnode, root);
> > -}
> > -
> > -static struct cifs_sid_id *
> > -id_rb_search(struct rb_root *root, struct cifs_sid *sidptr)
> > -{
> > -       int rc;
> > -       struct rb_node *node = root->rb_node;
> > -       struct cifs_sid_id *lsidid;
> > -
> > -       while (node) {
> > -               lsidid = rb_entry(node, struct cifs_sid_id, rbnode);
> > -               rc = compare_sids(sidptr, &((lsidid)->sid));
> > -               if (rc > 0) {
> > -                       node = node->rb_left;
> > -               } else if (rc < 0) {
> > -                       node = node->rb_right;
> > -               } else /* node found */
> > -                       return lsidid;
> > -       }
> > -
> > -       return NULL;
> > -}
> > -
> > -static int
> > -sidid_pending_wait(void *unused)
> > -{
> > -       schedule();
> > -       return signal_pending(current) ? -ERESTARTSYS : 0;
> > -}
> > -
> >  static int
> > -id_to_sid(unsigned long cid, uint sidtype, struct cifs_sid *ssid)
> > +id_to_sid(unsigned int cid, uint sidtype, struct cifs_sid *ssid)
> >  {
> > -       int rc = 0;
> > +       int rc;
> >         struct key *sidkey;
> > +       char desc[3 + 10 + 1]; /* 3 byte prefix + 10 bytes for value + NULL */
> >         const struct cred *saved_cred;
> > -       struct cifs_sid *lsid;
> > -       struct cifs_sid_id *psidid, *npsidid;
> > -       struct rb_root *cidtree;
> > -       spinlock_t *cidlock;
> > -
> > -       if (sidtype == SIDOWNER) {
> > -               cidlock = &siduidlock;
> > -               cidtree = &uidtree;
> > -       } else if (sidtype == SIDGROUP) {
> > -               cidlock = &sidgidlock;
> > -               cidtree = &gidtree;
> > -       } else
> > -               return -EINVAL;
> > -
> > -       spin_lock(cidlock);
> > -       psidid = sid_rb_search(cidtree, cid);
> > -
> > -       if (!psidid) { /* node does not exist, allocate one & attempt adding */
> > -               spin_unlock(cidlock);
> > -               npsidid = kzalloc(sizeof(struct cifs_sid_id), GFP_KERNEL);
> > -               if (!npsidid)
> > -                       return -ENOMEM;
> > -
> > -               npsidid->sidstr = kmalloc(SID_STRING_MAX, GFP_KERNEL);
> > -               if (!npsidid->sidstr) {
> > -                       kfree(npsidid);
> > -                       return -ENOMEM;
> > -               }
> > -
> > -               spin_lock(cidlock);
> > -               psidid = sid_rb_search(cidtree, cid);
> > -               if (psidid) { /* node happened to get inserted meanwhile */
> > -                       ++psidid->refcount;
> > -                       spin_unlock(cidlock);
> > -                       kfree(npsidid->sidstr);
> > -                       kfree(npsidid);
> > -               } else {
> > -                       psidid = npsidid;
> > -                       sid_rb_insert(cidtree, cid, &psidid,
> > -                                       sidtype == SIDOWNER ? "oi:" : "gi:");
> > -                       ++psidid->refcount;
> > -                       spin_unlock(cidlock);
> > -               }
> > -       } else {
> > -               ++psidid->refcount;
> > -               spin_unlock(cidlock);
> > -       }
> >
> > -       /*
> > -        * If we are here, it is safe to access psidid and its fields
> > -        * since a reference was taken earlier while holding the spinlock.
> > -        * A reference on the node is put without holding the spinlock
> > -        * and it is OK to do so in this case, shrinker will not erase
> > -        * this node until all references are put and we do not access
> > -        * any fields of the node after a reference is put .
> > -        */
> > -       if (test_bit(SID_ID_MAPPED, &psidid->state)) {
> > -               cifs_copy_sid(ssid, &psidid->sid);
> > -               psidid->time = jiffies; /* update ts for accessing */
> > -               goto id_sid_out;
> > -       }
> > +       rc = snprintf(desc, sizeof(desc), "%ci:%u",
> > +                       sidtype == SIDOWNER ? 'o' : 'g', cid);
> > +       if (rc >= sizeof(desc))
> > +               return -EINVAL;
> >
> > -       if (time_after(psidid->time + SID_MAP_RETRY, jiffies)) {
> > +       rc = 0;
> > +       saved_cred = override_creds(root_cred);
> > +       sidkey = request_key(&cifs_idmap_key_type, desc, "");
> > +       if (IS_ERR(sidkey)) {
> >                 rc = -EINVAL;
> > -               goto id_sid_out;
> > -       }
> > -
> > -       if (!test_and_set_bit(SID_ID_PENDING, &psidid->state)) {
> > -               saved_cred = override_creds(root_cred);
> > -               sidkey = request_key(&cifs_idmap_key_type, psidid->sidstr, "");
> > -               if (IS_ERR(sidkey)) {
> > -                       rc = -EINVAL;
> > -                       cFYI(1, "%s: Can't map and id to a SID", __func__);
> > -               } else if (sidkey->datalen < CIFS_SID_BASE_SIZE) {
> > -                       rc = -EIO;
> > -                       cFYI(1, "%s: Downcall contained malformed key "
> > -                               "(datalen=%hu)", __func__, sidkey->datalen);
> > -               } else {
> > -                       lsid = (struct cifs_sid *)sidkey->payload.data;
> > -                       cifs_copy_sid(&psidid->sid, lsid);
> > -                       cifs_copy_sid(ssid, &psidid->sid);
> > -                       set_bit(SID_ID_MAPPED, &psidid->state);
> > -                       key_put(sidkey);
> > -                       kfree(psidid->sidstr);
> > -               }
> > -               psidid->time = jiffies; /* update ts for accessing */
> > -               revert_creds(saved_cred);
> > -               clear_bit(SID_ID_PENDING, &psidid->state);
> > -               wake_up_bit(&psidid->state, SID_ID_PENDING);
> > -       } else {
> > -               rc = wait_on_bit(&psidid->state, SID_ID_PENDING,
> > -                               sidid_pending_wait, TASK_INTERRUPTIBLE);
> > -               if (rc) {
> > -                       cFYI(1, "%s: sidid_pending_wait interrupted %d",
> > -                                       __func__, rc);
> > -                       --psidid->refcount;
> > -                       return rc;
> > -               }
> > -               if (test_bit(SID_ID_MAPPED, &psidid->state))
> > -                       cifs_copy_sid(ssid, &psidid->sid);
> > -               else
> > -                       rc = -EINVAL;
> > -       }
> > -id_sid_out:
> > -       --psidid->refcount;
> > +               cFYI(1, "%s: Can't map %cid %u to a SID", __func__,
> > +                       sidtype == SIDOWNER ? 'u' : 'g', cid);
> > +               goto out_revert_creds;
> > +       } else if (sidkey->datalen < CIFS_SID_BASE_SIZE) {
> > +               rc = -EIO;
> > +               cFYI(1, "%s: Downcall contained malformed key "
> > +                       "(datalen=%hu)", __func__, sidkey->datalen);
> > +               goto out_key_put;
> > +       }
> > +       cifs_copy_sid(ssid, (struct cifs_sid *)sidkey->payload.data);
> > +out_key_put:
> > +       key_put(sidkey);
> > +out_revert_creds:
> > +       revert_creds(saved_cred);
> >         return rc;
> >  }
> >
> > @@ -470,111 +211,66 @@ sid_to_id(struct cifs_sb_info *cifs_sb, struct cifs_sid *psid,
> >                 struct cifs_fattr *fattr, uint sidtype)
> >  {
> >         int rc;
> > -       unsigned long cid;
> > -       struct key *idkey;
> > +       struct key *sidkey;
> > +       char *sidstr;
> >         const struct cred *saved_cred;
> > -       struct cifs_sid_id *psidid, *npsidid;
> > -       struct rb_root *cidtree;
> > -       spinlock_t *cidlock;
> > -
> > -       if (sidtype == SIDOWNER) {
> > -               cid = cifs_sb->mnt_uid; /* default uid, in case upcall fails */
> > -               cidlock = &siduidlock;
> > -               cidtree = &uidtree;
> > -       } else if (sidtype == SIDGROUP) {
> > -               cid = cifs_sb->mnt_gid; /* default gid, in case upcall fails */
> > -               cidlock = &sidgidlock;
> > -               cidtree = &gidtree;
> > -       } else
> > -               return -ENOENT;
> > -
> > -       spin_lock(cidlock);
> > -       psidid = id_rb_search(cidtree, psid);
> > -
> > -       if (!psidid) { /* node does not exist, allocate one & attempt adding */
> > -               spin_unlock(cidlock);
> > -               npsidid = kzalloc(sizeof(struct cifs_sid_id), GFP_KERNEL);
> > -               if (!npsidid)
> > -                       return -ENOMEM;
> > -
> > -               npsidid->sidstr = kmalloc(SID_STRING_MAX, GFP_KERNEL);
> > -               if (!npsidid->sidstr) {
> > -                       kfree(npsidid);
> > -                       return -ENOMEM;
> > -               }
> > -
> > -               spin_lock(cidlock);
> > -               psidid = id_rb_search(cidtree, psid);
> > -               if (psidid) { /* node happened to get inserted meanwhile */
> > -                       ++psidid->refcount;
> > -                       spin_unlock(cidlock);
> > -                       kfree(npsidid->sidstr);
> > -                       kfree(npsidid);
> > -               } else {
> > -                       psidid = npsidid;
> > -                       id_rb_insert(cidtree, psid, &psidid,
> > -                                       sidtype == SIDOWNER ? "os:" : "gs:");
> > -                       ++psidid->refcount;
> > -                       spin_unlock(cidlock);
> > -               }
> > -       } else {
> > -               ++psidid->refcount;
> > -               spin_unlock(cidlock);
> > -       }
> > +       uid_t fuid = cifs_sb->mnt_uid;
> > +       gid_t fgid = cifs_sb->mnt_gid;
> >
> >         /*
> > -        * If we are here, it is safe to access psidid and its fields
> > -        * since a reference was taken earlier while holding the spinlock.
> > -        * A reference on the node is put without holding the spinlock
> > -        * and it is OK to do so in this case, shrinker will not erase
> > -        * this node until all references are put and we do not access
> > -        * any fields of the node after a reference is put .
> > +        * If we have too many subauthorities, then something is really wrong.
> > +        * Just return an error.
> >          */
> > -       if (test_bit(SID_ID_MAPPED, &psidid->state)) {
> > -               cid = psidid->id;
> > -               psidid->time = jiffies; /* update ts for accessing */
> > -               goto sid_to_id_out;
> > +       if (unlikely(psid->num_subauth > SID_MAX_SUB_AUTHORITIES)) {
> > +               cFYI(1, "%s: %u subauthorities is too many!", __func__,
> > +                       psid->num_subauth);
> > +               return -EIO;
> >         }
> >
> > -       if (time_after(psidid->time + SID_MAP_RETRY, jiffies))
> > -               goto sid_to_id_out;
> > -
> > -       if (!test_and_set_bit(SID_ID_PENDING, &psidid->state)) {
> > -               saved_cred = override_creds(root_cred);
> > -               idkey = request_key(&cifs_idmap_key_type, psidid->sidstr, "");
> > -               if (IS_ERR(idkey))
> > -                       cFYI(1, "%s: Can't map SID to an id", __func__);
> > -               else {
> > -                       cid = *(unsigned long *)idkey->payload.value;
> > -                       psidid->id = cid;
> > -                       set_bit(SID_ID_MAPPED, &psidid->state);
> > -                       key_put(idkey);
> > -                       kfree(psidid->sidstr);
> > -               }
> > -               revert_creds(saved_cred);
> > -               psidid->time = jiffies; /* update ts for accessing */
> > -               clear_bit(SID_ID_PENDING, &psidid->state);
> > -               wake_up_bit(&psidid->state, SID_ID_PENDING);
> > -       } else {
> > -               rc = wait_on_bit(&psidid->state, SID_ID_PENDING,
> > -                               sidid_pending_wait, TASK_INTERRUPTIBLE);
> > -               if (rc) {
> > -                       cFYI(1, "%s: sidid_pending_wait interrupted %d",
> > -                                       __func__, rc);
> > -                       --psidid->refcount; /* decremented without spinlock */
> > -                       return rc;
> > -               }
> > -               if (test_bit(SID_ID_MAPPED, &psidid->state))
> > -                       cid = psidid->id;
> > +       sidstr = sid_to_key_str(psid, sidtype);
> > +       if (!sidstr)
> > +               return -ENOMEM;
> > +
> > +       saved_cred = override_creds(root_cred);
> > +       sidkey = request_key(&cifs_idmap_key_type, sidstr, "");
> > +       if (IS_ERR(sidkey)) {
> > +               rc = -EINVAL;
> > +               cFYI(1, "%s: Can't map SID %s to a %cid", __func__, sidstr,
> > +                       sidtype == SIDOWNER ? 'u' : 'g');
> > +               goto out_revert_creds;
> > +       }
> > +
> > +       /*
> > +        * FIXME: Here we assume that uid_t and gid_t are same size. It's
> > +        * probably a safe assumption but might be better to check based on
> > +        * sidtype.
> > +        */
> > +       if (sidkey->datalen < sizeof(uid_t)) {
> > +               rc = -EIO;
> > +               cFYI(1, "%s: Downcall contained malformed key "
> > +                       "(datalen=%hu)", __func__, sidkey->datalen);
> > +               goto out_key_put;
> >         }
> >
> > -sid_to_id_out:
> > -       --psidid->refcount; /* decremented without spinlock */
> >         if (sidtype == SIDOWNER)
> > -               fattr->cf_uid = cid;
> > +               fuid = *(uid_t *)sidkey->payload.value;
> >         else
> > -               fattr->cf_gid = cid;
> > +               fgid = *(gid_t *)sidkey->payload.value;
> >
> > +out_key_put:
> > +       key_put(sidkey);
> > +out_revert_creds:
> > +       revert_creds(saved_cred);
> > +       kfree(sidstr);
> > +
> > +       /*
> > +        * Note that we return 0 here unconditionally. If the mapping
> > +        * fails then we just fall back to using the mnt_uid/mnt_gid.
> > +        */
> > +       if (sidtype == SIDOWNER)
> > +               fattr->cf_uid = fuid;
> > +       else
> > +               fattr->cf_gid = fgid;
> >         return 0;
> >  }
> >
> > @@ -621,17 +317,6 @@ init_cifs_idmap(void)
> >         cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
> >         root_cred = cred;
> >
> > -       spin_lock_init(&siduidlock);
> > -       uidtree = RB_ROOT;
> > -       spin_lock_init(&sidgidlock);
> > -       gidtree = RB_ROOT;
> > -
> > -       spin_lock_init(&uidsidlock);
> > -       siduidtree = RB_ROOT;
> > -       spin_lock_init(&gidsidlock);
> > -       sidgidtree = RB_ROOT;
> > -       register_shrinker(&cifs_shrinker);
> > -
> >         cFYI(1, "cifs idmap keyring: %d", key_serial(keyring));
> >         return 0;
> >
> > @@ -648,41 +333,9 @@ exit_cifs_idmap(void)
> >         key_revoke(root_cred->thread_keyring);
> >         unregister_key_type(&cifs_idmap_key_type);
> >         put_cred(root_cred);
> > -       unregister_shrinker(&cifs_shrinker);
> >         cFYI(1, "Unregistered %s key type", cifs_idmap_key_type.name);
> >  }
> >
> > -void
> > -cifs_destroy_idmaptrees(void)
> > -{
> > -       struct rb_root *root;
> > -       struct rb_node *node;
> > -
> > -       root = &uidtree;
> > -       spin_lock(&siduidlock);
> > -       while ((node = rb_first(root)))
> > -               rb_erase(node, root);
> > -       spin_unlock(&siduidlock);
> > -
> > -       root = &gidtree;
> > -       spin_lock(&sidgidlock);
> > -       while ((node = rb_first(root)))
> > -               rb_erase(node, root);
> > -       spin_unlock(&sidgidlock);
> > -
> > -       root = &siduidtree;
> > -       spin_lock(&uidsidlock);
> > -       while ((node = rb_first(root)))
> > -               rb_erase(node, root);
> > -       spin_unlock(&uidsidlock);
> > -
> > -       root = &sidgidtree;
> > -       spin_lock(&gidsidlock);
> > -       while ((node = rb_first(root)))
> > -               rb_erase(node, root);
> > -       spin_unlock(&gidsidlock);
> > -}
> > -
> >  /* copy ntsd, owner sid, and group sid from a security descriptor to another */
> >  static void copy_sec_desc(const struct cifs_ntsd *pntsd,
> >                                 struct cifs_ntsd *pnntsd, __u32 sidsoffset)
> > diff --git a/fs/cifs/cifsacl.h b/fs/cifs/cifsacl.h
> > index 249c94f..46cd444 100644
> > --- a/fs/cifs/cifsacl.h
> > +++ b/fs/cifs/cifsacl.h
> > @@ -23,7 +23,7 @@
> >  #define _CIFSACL_H
> >
> >
> > -#define NUM_AUTHS 6 /* number of authority fields */
> > +#define NUM_AUTHS (6)  /* number of authority fields */
> >  #define SID_MAX_SUB_AUTHORITIES (15) /* max number of sub authority fields */
> >  #define NUM_WK_SIDS 7 /* number of well known sids */
> >  #define SIDNAMELENGTH 20 /* long enough for the ones we care about */
> > @@ -51,15 +51,12 @@
> >   * u32: max 10 bytes in decimal
> >   *
> >   * "S-" + 3 bytes for version field + 4 bytes for each authority field (3 bytes
> > - * per number + 1 for '-') + 11 bytes for each subauthority field (10 bytes
> >   * per number + 1 for '-') + NULL terminator.
> > + *
> > + * Add 11 bytes for each subauthority field (10 bytes each + 1 for '-')
> >   */
> > -#define SID_STRING_MAX (195)
> > -
> > -#define SID_ID_MAPPED 0
> > -#define SID_ID_PENDING 1
> > -#define SID_MAP_EXPIRE (3600 * HZ) /* map entry expires after one hour */
> > -#define SID_MAP_RETRY (300 * HZ)   /* wait 5 minutes for next attempt to map */
> > +#define SID_STRING_BASE_SIZE (2 + 3 + (4 * NUM_AUTHS) + 1)
> > +#define SID_STRING_SUBAUTH_SIZE (11) /* size of a single subauth string */
> >
> >  struct cifs_ntsd {
> >         __le16 revision; /* revision level */
> > @@ -94,19 +91,4 @@ struct cifs_ace {
> >         struct cifs_sid sid; /* ie UUID of user or group who gets these perms */
> >  } __attribute__((packed));
> >
> > -struct cifs_wksid {
> > -       struct cifs_sid cifssid;
> > -       char sidname[SIDNAMELENGTH];
> > -} __attribute__((packed));
> > -
> > -struct cifs_sid_id {
> > -       unsigned int refcount; /* increment with spinlock, decrement without */
> > -       unsigned long id;
> > -       unsigned long time;
> > -       unsigned long state;
> > -       char *sidstr;
> > -       struct rb_node rbnode;
> > -       struct cifs_sid sid;
> > -};
> > -
> >  #endif /* _CIFSACL_H */
> > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> > index 07a8ab52..5e62f44 100644
> > --- a/fs/cifs/cifsfs.c
> > +++ b/fs/cifs/cifsfs.c
> > @@ -1204,7 +1204,6 @@ exit_cifs(void)
> >         unregister_filesystem(&cifs_fs_type);
> >         cifs_dfs_release_automount_timer();
> >  #ifdef CONFIG_CIFS_ACL
> > -       cifs_destroy_idmaptrees();
> >         exit_cifs_idmap();
> >  #endif
> >  #ifdef CONFIG_CIFS_UPCALL
> > diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> > index 5144e9f..2d2ae69 100644
> > --- a/fs/cifs/cifsproto.h
> > +++ b/fs/cifs/cifsproto.h
> > @@ -58,7 +58,6 @@ do {                                                          \
> >  } while (0)
> >  extern int init_cifs_idmap(void);
> >  extern void exit_cifs_idmap(void);
> > -extern void cifs_destroy_idmaptrees(void);
> >  extern char *build_path_from_dentry(struct dentry *);
> >  extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
> >  extern char *cifs_compose_mount_options(const char *sb_mountdata,
> > --
> > 1.7.11.7
> >
> 
> 
> 


-- 
Jeff Layton <jlayton@xxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux