From: Frank Lahm Date: Thu, 19 Apr 2012 13:05:11 +0000 (+0200) Subject: Refactor the locking X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=commitdiff_plain;h=0576bda99119fe00dd8f0ce31c28234296ee8ae3 Refactor the locking --- diff --git a/etc/afpd/fork.c b/etc/afpd/fork.c index c7025a8f..96ac3936 100644 --- a/etc/afpd/fork.c +++ b/etc/afpd/fork.c @@ -457,7 +457,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si ad_getattr(ofork->of_ad, &bshort); if ((bshort & htons(ATTRBIT_NOWRITE)) && (access & OPENACC_WR)) { ad_close( ofork->of_ad, adflags | ADFLAGS_SETSHRMD); - of_dealloc(obj, ofork ); + of_dealloc(ofork); ofrefnum = 0; memcpy(rbuf, &ofrefnum, sizeof(ofrefnum)); return(AFPERR_OLOCK); @@ -478,7 +478,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si ofork->of_flags |= AFPFORK_ERROR; ret = errno; ad_close( ofork->of_ad, adflags | ADFLAGS_SETSHRMD); - of_dealloc(obj, ofork ); + of_dealloc(ofork); switch (ret) { case EAGAIN: /* return data anyway */ case EACCES: @@ -504,7 +504,7 @@ int afp_openfork(AFPObj *obj _U_, char *ibuf, size_t ibuflen _U_, char *rbuf, si return( AFP_OK ); openfork_err: - of_dealloc(obj, ofork); + of_dealloc(ofork); if (errno == EACCES) return (access & OPENACC_WR) ? AFPERR_LOCK : AFPERR_ACCESS; return ret; diff --git a/etc/afpd/fork.h b/etc/afpd/fork.h index ed0be2c6..d7120e47 100644 --- a/etc/afpd/fork.h +++ b/etc/afpd/fork.h @@ -57,7 +57,7 @@ extern struct ofork *of_alloc (struct vol *, struct dir *, char *, uint16_t *, const int, struct adouble *, struct stat *); -extern void of_dealloc (const AFPObj *obj, struct ofork *); +extern void of_dealloc (struct ofork *); extern struct ofork *of_find (const uint16_t); extern struct ofork *of_findname (struct path *); extern int of_rename (const struct vol *, diff --git a/etc/afpd/ofork.c b/etc/afpd/ofork.c index 10cdfc23..3d690079 100644 --- a/etc/afpd/ofork.c +++ b/etc/afpd/ofork.c @@ -364,7 +364,7 @@ struct ofork *of_findnameat(int dirfd, struct path *path) } #endif -void of_dealloc(const AFPObj *obj, struct ofork *of) +void of_dealloc(struct ofork *of) { if (!oforks) return; @@ -378,18 +378,6 @@ void of_dealloc(const AFPObj *obj, struct ofork *of) if ( of->of_ad->ad_refcount <= 0) { free( of->of_ad->ad_name ); free( of->of_ad); - } else {/* someone's still using it. just free this user's locks */ - ad_unlock(of->of_ad, of->of_refnum, of->of_flags & AFPFORK_ERROR ? 0 : 1); -#ifdef HAVE_FSHARE_T - if (obj->options.flags & OPTION_SHARE_RESERV) { - fshare_t shmd; - shmd.f_id = of->of_refnum; - if (AD_DATA_OPEN(of->of_ad)) - fcntl(ad_data_fileno(of->of_ad), F_UNSHARE, &shmd); - if (AD_RSRC_OPEN(of->of_ad)) - fcntl(ad_reso_fileno(of->of_ad), F_UNSHARE, &shmd); - } -#endif } free( of ); @@ -422,13 +410,26 @@ int of_closefork(const AFPObj *obj, struct ofork *ofork) fce_register_file_modification(ofork); } - of_dealloc(obj, ofork); + ad_unlock(ofork->of_ad, ofork->of_refnum, ofork->of_flags & AFPFORK_ERROR ? 0 : 1); + +#ifdef HAVE_FSHARE_T + if (obj->options.flags & OPTION_SHARE_RESERV) { + fshare_t shmd; + shmd.f_id = ofork->of_refnum; + if (AD_DATA_OPEN(ofork->of_ad)) + fcntl(ad_data_fileno(ofork->of_ad), F_UNSHARE, &shmd); + if (AD_RSRC_OPEN(ofork->of_ad)) + fcntl(ad_reso_fileno(ofork->of_ad), F_UNSHARE, &shmd); + } +#endif ret = 0; if ( ad_close( ofork->of_ad, adflags | ADFLAGS_SETSHRMD) < 0 ) { ret = -1; } + of_dealloc(ofork); + return ret; }