Message ID | 20201127190707.2844580-1-trix@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | locks: remove trailing semicolon in macro definition | expand |
On Fri, Nov 27, 2020 at 11:07:07AM -0800, trix@redhat.com wrote: > +++ b/fs/fcntl.c > @@ -526,7 +526,7 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, > (dst)->l_whence = (src)->l_whence; \ > (dst)->l_start = (src)->l_start; \ > (dst)->l_len = (src)->l_len; \ > - (dst)->l_pid = (src)->l_pid; > + (dst)->l_pid = (src)->l_pid This should be wrapped in a do { } while (0). Look, this warning is clearly great at finding smelly code, but the fixes being generated to shut up the warning are low quality.
On 11/27/20 11:53 AM, Matthew Wilcox wrote: > On Fri, Nov 27, 2020 at 11:07:07AM -0800, trix@redhat.com wrote: >> +++ b/fs/fcntl.c >> @@ -526,7 +526,7 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, >> (dst)->l_whence = (src)->l_whence; \ >> (dst)->l_start = (src)->l_start; \ >> (dst)->l_len = (src)->l_len; \ >> - (dst)->l_pid = (src)->l_pid; >> + (dst)->l_pid = (src)->l_pid > This should be wrapped in a do { } while (0). > > Look, this warning is clearly great at finding smelly code, but the > fixes being generated to shut up the warning are low quality. > Multiline macros not following the do {} while (0) pattern are likely a larger problem. I'll take a look. Thanks, Tom
On 11/29/20 9:47 AM, Tom Rix wrote: > > On 11/27/20 11:53 AM, Matthew Wilcox wrote: >> On Fri, Nov 27, 2020 at 11:07:07AM -0800, trix@redhat.com wrote: >>> +++ b/fs/fcntl.c >>> @@ -526,7 +526,7 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, >>> (dst)->l_whence = (src)->l_whence; \ >>> (dst)->l_start = (src)->l_start; \ >>> (dst)->l_len = (src)->l_len; \ >>> - (dst)->l_pid = (src)->l_pid; >>> + (dst)->l_pid = (src)->l_pid >> This should be wrapped in a do { } while (0). >> >> Look, this warning is clearly great at finding smelly code, but the >> fixes being generated to shut up the warning are low quality. >> > Multiline macros not following the do {} while (0) pattern are likely a larger problem. > > I'll take a look. Could it become a static inline function instead? or that might expand its scope too much?
On Sun, 2020-11-29 at 09:52 -0800, Randy Dunlap wrote: > On 11/29/20 9:47 AM, Tom Rix wrote: > > On 11/27/20 11:53 AM, Matthew Wilcox wrote: > > > On Fri, Nov 27, 2020 at 11:07:07AM -0800, trix@redhat.com wrote: > > > > +++ b/fs/fcntl.c > > > > @@ -526,7 +526,7 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, > > > > unsigned int, cmd, > > > > (dst)->l_whence = (src)->l_whence; \ > > > > (dst)->l_start = (src)->l_start; \ > > > > (dst)->l_len = (src)->l_len; \ > > > > - (dst)->l_pid = (src)->l_pid; > > > > + (dst)->l_pid = (src)->l_pid > > > This should be wrapped in a do { } while (0). > > > > > > Look, this warning is clearly great at finding smelly code, but > > > the > > > fixes being generated to shut up the warning are low quality. > > > > > Multiline macros not following the do {} while (0) pattern are > > likely a larger problem. > > > > I'll take a look. > > Could it become a static inline function instead? > or that might expand its scope too much? I think nowadays we should always use static inlines for argument checking unless we're capturing debug information like __FILE__ or __LINE__ or something that a static inline can't. Even in the latter case the pattern should probably be single line #define that captures the information and passes it to a static inline. There was a time when we had problems with compiler expansion of static inlines, so we shouldn't go back and churn the code base to change it because there's thousands of these and possibly some old compiler used for an obscure architecture that still needs the define. James
On Sun, 2020-11-29 at 10:15 -0800, James Bottomley wrote: > I think nowadays we should always use static inlines for argument > checking unless we're capturing debug information like __FILE__ or > __LINE__ or something that a static inline can't. IMO: __LINE__ should never be used. __func__ is the only thing that can't be captured correctly as the inline gets its own name. __builtin_return_address(1) would generally work well enough for the inlines. > There was a time when we had problems with compiler expansion of static > inlines, so we shouldn't go back and churn the code base to change it > because there's thousands of these and possibly some old compiler used > for an obscure architecture that still needs the define. That's not a very compelling argument to me. Those old compilers and obscure architectures should continue to use the old versions of the code.
diff --git a/fs/fcntl.c b/fs/fcntl.c index 05b36b28f2e8..96a65758c498 100644 --- a/fs/fcntl.c +++ b/fs/fcntl.c @@ -526,7 +526,7 @@ SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd, (dst)->l_whence = (src)->l_whence; \ (dst)->l_start = (src)->l_start; \ (dst)->l_len = (src)->l_len; \ - (dst)->l_pid = (src)->l_pid; + (dst)->l_pid = (src)->l_pid static int get_compat_flock(struct flock *kfl, const struct compat_flock __user *ufl) {