From: Chas Williams Date: Sun, 20 Mar 2005 20:18:08 +0000 (+0000) Subject: linux-crref-held-longer-20050320 X-Git-Tag: openafs-devel-1_5_0~709 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=5a8f1057b0e9d07246af9213b8388dee0a64fd41 linux-crref-held-longer-20050320 FIXES 17917 hold the cr ref longer we were putting it too soon --- diff --git a/src/afs/LINUX/osi_cred.c b/src/afs/LINUX/osi_cred.c index 9cad716..6795d3f 100644 --- a/src/afs/LINUX/osi_cred.c +++ b/src/afs/LINUX/osi_cred.c @@ -54,11 +54,11 @@ crget(void) osi_Panic("crget: No more memory for creds!\n"); for (i = 0; i < CRED_ALLOC_STEP - 1; i++) - cred_pool[i].cr_ref = (long)&cred_pool[i + 1]; - cred_pool[i].cr_ref = 0; + cred_pool[i].cr_next = (cred_t *) &cred_pool[i + 1]; + cred_pool[i].cr_next = NULL; } tmp = cred_pool; - cred_pool = (cred_t *) tmp->cr_ref; + cred_pool = (cred_t *) tmp->cr_next; ncreds_inuse++; CRED_UNLOCK(); @@ -74,15 +74,15 @@ void crfree(cred_t * cr) { if (cr->cr_ref > 1) { -#if defined(AFS_LINUX26_ENV) - put_group_info(cr->cr_group_info); -#endif cr->cr_ref--; return; } +#if defined(AFS_LINUX26_ENV) + put_group_info(cr->cr_group_info); +#endif CRED_LOCK(); - cr->cr_ref = (long)cred_pool; + cr->cr_next = (cred_t *) cred_pool; cred_pool = cr; CRED_UNLOCK(); ncreds_inuse--; diff --git a/src/afs/LINUX/osi_machdep.h b/src/afs/LINUX/osi_machdep.h index 03ba34e..e3c8c1a 100644 --- a/src/afs/LINUX/osi_machdep.h +++ b/src/afs/LINUX/osi_machdep.h @@ -141,11 +141,7 @@ extern struct vnodeops afs_file_iops, afs_dir_iops, afs_symlink_iops; /* cred struct */ typedef struct cred { /* maps to task field: */ -#if (CPU == sparc64) - long cr_ref; -#else int cr_ref; -#endif uid_t cr_uid; /* euid */ uid_t cr_ruid; /* uid */ gid_t cr_gid; /* egid */ @@ -156,6 +152,7 @@ typedef struct cred { /* maps to task field: */ gid_t cr_groups[NGROUPS]; /* 32 groups - empty set to NOGROUP */ int cr_ngroups; #endif + struct cred *cr_next; } cred_t; #define AFS_UCRED cred #define AFS_PROC struct task_struct