]> arthur.barton.de Git - netatalk.git/commitdiff
Refactor the locking
authorFrank Lahm <franklahm@googlemail.com>
Thu, 19 Apr 2012 13:05:11 +0000 (15:05 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Thu, 19 Apr 2012 13:05:11 +0000 (15:05 +0200)
etc/afpd/fork.c
etc/afpd/fork.h
etc/afpd/ofork.c

index c7025a8f479fe8b5399b68a8c9201ca4d3dd1316..96ac39363ad09930ca6b19255f69cda8e7ace4b8 100644 (file)
@@ -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;
index ed0be2c6a76ec8f7f5cf8aba3c49e46e22334cfd..d7120e4778b163927bd17b31c2f5ffd4872aa3a9 100644 (file)
@@ -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 *,
index 10cdfc232b153d4022ecae125e94ea1bc2da3205..3d690079ba84f7136575afa593e79ad2a3c6425a 100644 (file)
@@ -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;
 }