[OpenAFS] IPUT Bad refCount 0 on inode 0xf8abadb8 in openafs-1.2.11
Troy Benjegerdes
hozer@hozed.org
Mon, 15 Nov 2004 12:43:51 -0600
Should I try applying this to openafs-1.2.11, or 1.3?
On Mon, Nov 15, 2004 at 11:32:51AM -0500, chas williams (contractor) wrote:
> In message <20041029140540.GE13909@kalmia.hozed.org>,Troy Benjegerdes writes:
> >Trace; f89976c0 <[openafs.mp].rodata.end+4459/d3b9>
> >Trace; f8983340 <[openafs.mp]afs_dentry_iput+0/f0>
> >Trace; f89a0c44 <[openafs.mp]afs_global_lock+0/1c>
> >Trace; f8980168 <[openafs.mp]osi_iput+58/f0>
> >Trace; f89976c0 <[openafs.mp].rodata.end+4459/d3b9>
> >Trace; f8983340 <[openafs.mp]afs_dentry_iput+0/f0>
> >Trace; c015c93b <d_delete+bb/c0>
> >Trace; c0153d66 <vfs_unlink+186/280>
> >Trace; c0153f1b <sys_unlink+bb/120>
> >Trace; c0108efb <system_call+33/38>
>
> can you see if the following attached patch helps this problem.
>
> Index: src/afs/VNOPS/afs_vnop_remove.c
> ===================================================================
> RCS file: /cvs/openafs/src/afs/VNOPS/afs_vnop_remove.c,v
> retrieving revision 1.31
> diff -u -u -r1.31 afs_vnop_remove.c
> --- src/afs/VNOPS/afs_vnop_remove.c 23 Jun 2004 22:25:06 -0000 1.31
> +++ src/afs/VNOPS/afs_vnop_remove.c 15 Nov 2004 15:59:50 -0000
> @@ -14,9 +14,7 @@
> * afs_IsWired (DUX)
> * afsremove
> * afs_remove
> - *
> - * Local:
> - * newname
> + * afs_newname
> *
> */
> #include <afsconfig.h>
> @@ -110,7 +108,7 @@
> register struct conn *tc;
> struct AFSFetchStatus OutDirStatus;
> struct AFSVolSync tsync;
> - XSTATS_DECLS
> + XSTATS_DECLS;
> do {
> tc = afs_Conn(&adp->fid, treqp, SHARED_LOCK);
> if (tc) {
> @@ -193,8 +191,8 @@
> return (0);
> }
>
> -static char *
> -newname(void)
> +char *
> +afs_newname(void)
> {
> char *name, *sp, *p = ".__afs";
> afs_int32 rd = afs_random() & 0xffff;
> @@ -412,7 +410,7 @@
> #endif
> #endif
> {
> - char *unlname = newname();
> + char *unlname = afs_newname();
>
> ReleaseWriteLock(&adp->lock);
> if (tdc)
> Index: src/afs/LINUX/osi_vnodeops.c
> ===================================================================
> RCS file: /cvs/openafs/src/afs/LINUX/osi_vnodeops.c,v
> retrieving revision 1.83
> diff -u -u -r1.83 osi_vnodeops.c
> --- src/afs/LINUX/osi_vnodeops.c 19 Aug 2004 00:58:47 -0000 1.83
> +++ src/afs/LINUX/osi_vnodeops.c 15 Nov 2004 15:59:50 -0000
> @@ -1149,18 +1149,63 @@
> int
> afs_linux_unlink(struct inode *dip, struct dentry *dp)
> {
> - int code;
> + int code = EBUSY;
> cred_t *credp = crref();
> const char *name = dp->d_name.name;
> + struct vcache *tvc = ITOAFS(dp->d_inode);
>
> #if defined(AFS_LINUX26_ENV)
> lock_kernel();
> #endif
> + if (((VREFCOUNT(tvc) > 0) && tvc->opens > 0)
> + && !(tvc->states & CUnlinked)) {
> + struct dentry *__dp;
> + char *__name;
> + extern char *afs_newname();
> +
> + __dp = NULL;
> + __name = NULL;
> + do {
> + dput(__dp);
> +
> + AFS_GLOCK();
> + if (__name)
> + osi_FreeSmallSpace(__name);
> + __name = afs_newname();
> + AFS_GUNLOCK();
> +
> + __dp = lookup_one_len(__name, dp->d_parent, strlen(__name));
> +
> + if (IS_ERR(__dp))
> + goto out;
> + } while (__dp->d_inode != NULL);
> +
> + AFS_GLOCK();
> + code = afs_rename(ITOAFS(dip), dp->d_name.name, ITOAFS(dip), __dp->d_name.name, credp);
> + if (!code) {
> + tvc->mvid = __name;
> + crhold(credp);
> + if (tvc->uncred) {
> + crfree(tvc->uncred);
> + }
> + tvc->uncred = credp;
> + tvc->states |= CUnlinked;
> + }
> + AFS_GUNLOCK();
> +
> + if (!code)
> + d_move(dp, __dp);
> + dput(__dp);
> +
> + goto out;
> + }
> +
> AFS_GLOCK();
> code = afs_remove(ITOAFS(dip), name, credp);
> AFS_GUNLOCK();
> if (!code)
> d_drop(dp);
> +out:
> #if defined(AFS_LINUX26_ENV)
> unlock_kernel();
> #endif
--
--------------------------------------------------------------------------
Troy Benjegerdes 'da hozer' hozer@hozed.org
Somone asked my why I work on this free (http://www.fsf.org/philosophy/)
software stuff and not get a real job. Charles Shultz had the best answer:
"Why do musicians compose symphonies and poets write poems? They do it
because life wouldn't have any meaning for them if they didn't. That's why
I draw cartoons. It's my life." -- Charles Shultz