Merge tag 'nfs-for-4.21-1' of git://git.linux-nfs.org/projects/anna/linux-nfs
Pull NFS client updates from Anna Schumaker: "Stable bugfixes: - xprtrdma: Yet another double DMA-unmap # v4.20 Features: - Allow some /proc/sys/sunrpc entries without CONFIG_SUNRPC_DEBUG - Per-xprt rdma receive workqueues - Drop support for FMR memory registration - Make port= mount option optional for RDMA mounts Other bugfixes and cleanups: - Remove unused nfs4_xdev_fs_type declaration - Fix comments for behavior that has changed - Remove generic RPC credentials by switching to 'struct cred' - Fix crossing mountpoints with different auth flavors - Various xprtrdma fixes from testing and auditing the close code - Fixes for disconnect issues when using xprtrdma with krb5 - Clean up and improve xprtrdma trace points - Fix NFS v4.2 async copy reboot recovery" * tag 'nfs-for-4.21-1' of git://git.linux-nfs.org/projects/anna/linux-nfs: (63 commits) sunrpc: convert to DEFINE_SHOW_ATTRIBUTE sunrpc: Add xprt after nfs4_test_session_trunk() sunrpc: convert unnecessary GFP_ATOMIC to GFP_NOFS sunrpc: handle ENOMEM in rpcb_getport_async NFS: remove unnecessary test for IS_ERR(cred) xprtrdma: Prevent leak of rpcrdma_rep objects NFSv4.2 fix async copy reboot recovery xprtrdma: Don't leak freed MRs xprtrdma: Add documenting comment for rpcrdma_buffer_destroy xprtrdma: Replace outdated comment for rpcrdma_ep_post xprtrdma: Update comments in frwr_op_send SUNRPC: Fix some kernel doc complaints SUNRPC: Simplify defining common RPC trace events NFS: Fix NFSv4 symbolic trace point output xprtrdma: Trace mapping, alloc, and dereg failures xprtrdma: Add trace points for calls to transport switch methods xprtrdma: Relocate the xprtrdma_mr_map trace points xprtrdma: Clean up of xprtrdma chunk trace points xprtrdma: Remove unused fields from rpcrdma_ia xprtrdma: Cull dprintk() call sites ...
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
#include <linux/security.h>
|
||||
#include <linux/binfmts.h>
|
||||
#include <linux/cn_proc.h>
|
||||
#include <linux/uidgid.h>
|
||||
|
||||
#if 0
|
||||
#define kdebug(FMT, ...) \
|
||||
@@ -194,11 +195,12 @@ const struct cred *get_task_cred(struct task_struct *task)
|
||||
do {
|
||||
cred = __task_cred((task));
|
||||
BUG_ON(!cred);
|
||||
} while (!atomic_inc_not_zero(&((struct cred *)cred)->usage));
|
||||
} while (!get_cred_rcu(cred));
|
||||
|
||||
rcu_read_unlock();
|
||||
return cred;
|
||||
}
|
||||
EXPORT_SYMBOL(get_task_cred);
|
||||
|
||||
/*
|
||||
* Allocate blank credentials, such that the credentials can be filled in at a
|
||||
@@ -564,6 +566,60 @@ void revert_creds(const struct cred *old)
|
||||
}
|
||||
EXPORT_SYMBOL(revert_creds);
|
||||
|
||||
/**
|
||||
* cred_fscmp - Compare two credentials with respect to filesystem access.
|
||||
* @a: The first credential
|
||||
* @b: The second credential
|
||||
*
|
||||
* cred_cmp() will return zero if both credentials have the same
|
||||
* fsuid, fsgid, and supplementary groups. That is, if they will both
|
||||
* provide the same access to files based on mode/uid/gid.
|
||||
* If the credentials are different, then either -1 or 1 will
|
||||
* be returned depending on whether @a comes before or after @b
|
||||
* respectively in an arbitrary, but stable, ordering of credentials.
|
||||
*
|
||||
* Return: -1, 0, or 1 depending on comparison
|
||||
*/
|
||||
int cred_fscmp(const struct cred *a, const struct cred *b)
|
||||
{
|
||||
struct group_info *ga, *gb;
|
||||
int g;
|
||||
|
||||
if (a == b)
|
||||
return 0;
|
||||
if (uid_lt(a->fsuid, b->fsuid))
|
||||
return -1;
|
||||
if (uid_gt(a->fsuid, b->fsuid))
|
||||
return 1;
|
||||
|
||||
if (gid_lt(a->fsgid, b->fsgid))
|
||||
return -1;
|
||||
if (gid_gt(a->fsgid, b->fsgid))
|
||||
return 1;
|
||||
|
||||
ga = a->group_info;
|
||||
gb = b->group_info;
|
||||
if (ga == gb)
|
||||
return 0;
|
||||
if (ga == NULL)
|
||||
return -1;
|
||||
if (gb == NULL)
|
||||
return 1;
|
||||
if (ga->ngroups < gb->ngroups)
|
||||
return -1;
|
||||
if (ga->ngroups > gb->ngroups)
|
||||
return 1;
|
||||
|
||||
for (g = 0; g < ga->ngroups; g++) {
|
||||
if (gid_lt(ga->gid[g], gb->gid[g]))
|
||||
return -1;
|
||||
if (gid_gt(ga->gid[g], gb->gid[g]))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(cred_fscmp);
|
||||
|
||||
/*
|
||||
* initialise the credentials stuff
|
||||
*/
|
||||
|
Reference in New Issue
Block a user