LINUX: Clear lock 'pid' fields with NULL 08/14108/2
authorAndrew Deason <adeason@sinenomine.net>
Tue, 24 Mar 2020 16:34:51 +0000 (11:34 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 27 Mar 2020 16:12:07 +0000 (12:12 -0400)
Currently, when we release a lock, we set the e.g. pid_writer field to
0, to clear out any previous pid that was set. On Linux, the
pid_writer field is a pointer, and sparse(1) complains about using a
plain integer 0 in this way:

      CHECK   [...]/afs_axscache.c
    [...]/afs_axscache.c:24:19: warning: Using plain integer as NULL pointer
    [...]/afs_axscache.c:68:9: warning: Using plain integer as NULL pointer
    [...]/afs_axscache.c:88:5: warning: Using plain integer as NULL pointer
    [...]/afs_axscache.c:111:13: warning: Using plain integer as NULL pointer
    [...]/afs_axscache.c:121:17: warning: Using plain integer as NULL pointer
    [...]/afs_axscache.c:126:17: warning: Using plain integer as NULL pointer
    [...]/afs_axscache.c:154:13: warning: Using plain integer as NULL pointer
    [...]/afs_axscache.c:165:9: warning: Using plain integer as NULL pointer

This doesn't break anything, but it spews out quite a lot of warnings
when building with sparse(1) available. To just reduce this noise a
bit, assign these fields to actual NULL.

Since some other platforms do use a plain integer in these fields
(they are an actual pid), define 'MyPid_NULL' to use '0' or 'NULL'
depending on the platform. Define MyPid_NULL to NULL only on Linux;
this causes us to still assign 0 to a pointer on some platforms, but
Linux is the only one that complains, so only bother using NULL on
Linux for now.

Change-Id: I35fcb896ceaa346c330622cfc2913b2975295836
Reviewed-on: https://gerrit.openafs.org/14108
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/afs/lock.h

index 9d7fef4..a5aeb51 100644 (file)
@@ -84,6 +84,7 @@ typedef unsigned int afs_lock_tracker_t;
 typedef struct task_struct * afs_lock_tracker_t;
 # define MyPidxx (current)
 # define MyPidxx2Pid(x) (x? (x)->pid : 0)
+# define MyPid_NULL (NULL)
 #elif defined(AFS_DARWIN_ENV)
 # if defined(AFS_DARWIN80_ENV)
 typedef unsigned int afs_lock_tracker_t;
@@ -108,6 +109,10 @@ typedef unsigned int afs_lock_tracker_t;
 # define MyPidxx2Pid(x) (x)
 #endif
 
+#ifndef MyPid_NULL
+# define MyPid_NULL (0)
+#endif
+
 /* all locks wait on excl_locked except for READ_LOCK, which waits on readers_reading */
 struct afs_lock {
     unsigned char wait_states; /* type of lockers waiting */
@@ -219,7 +224,7 @@ extern int afs_trclock;
            (lock)->excl_locked &= ~(SHARED_LOCK | WRITE_LOCK);\
            ((lock)->readers_reading)++;\
            (lock)->pid_last_reader = MyPidxx ; \
-           (lock)->pid_writer = 0;\
+           (lock)->pid_writer = MyPid_NULL;\
            Afs_Lock_ReleaseR(lock);\
        ENDMAC
 
@@ -229,7 +234,7 @@ extern int afs_trclock;
            (lock)->excl_locked &= ~(SHARED_LOCK | WRITE_LOCK);\
            ((lock)->readers_reading)++;\
            (lock)->pid_last_reader = MyPidxx ; \
-           (lock)->pid_writer = 0;\
+           (lock)->pid_writer = MyPid_NULL;\
            Afs_Lock_ReleaseR(lock);\
        ENDMAC
 
@@ -239,7 +244,7 @@ extern int afs_trclock;
            if (!(--((lock)->readers_reading)) && (lock)->wait_states)\
                Afs_Lock_ReleaseW(lock) ; \
        if ( (lock)->pid_last_reader == MyPidxx ) \
-               (lock)->pid_last_reader =0;\
+               (lock)->pid_last_reader = MyPid_NULL;\
        ENDMAC
 
 #define ReleaseWriteLock(lock)\
@@ -247,7 +252,7 @@ extern int afs_trclock;
        AFS_LOCK_TRACE(CM_TRACE_LOCKDONE, lock, WRITE_LOCK);\
            (lock)->excl_locked &= ~WRITE_LOCK;\
            if ((lock)->wait_states) Afs_Lock_ReleaseR(lock);\
-           (lock)->pid_writer=0; \
+           (lock)->pid_writer = MyPid_NULL; \
         ENDMAC
 
 /* can be used on shared or boosted (write) locks */
@@ -256,7 +261,7 @@ extern int afs_trclock;
        AFS_LOCK_TRACE(CM_TRACE_LOCKDONE, lock, SHARED_LOCK);\
            (lock)->excl_locked &= ~(SHARED_LOCK | WRITE_LOCK);\
            if ((lock)->wait_states) Afs_Lock_ReleaseR(lock);\
-           (lock)->pid_writer=0; \
+           (lock)->pid_writer = MyPid_NULL; \
         ENDMAC
 
 #else /* INSTRUMENT_LOCKS */