On Tue, Apr 23, 2013 at 8:52 AM, Theodore Ts'o <tytso@xxxxxxx> wrote: > > Maybe it's worth creating a magic helper function, called something > like mask_out() that handles the casting automatically, and it makes > it clear to a reader what you're trying to do? We have that for some things. Like the aligning code (see include/{uapi/}linux/kernel.h). We have that whole ALIGN() infrastructure that casts the alignment to the result type, exactly because people got things wrong so often (and exactly the "& ~mask" thing in particular). But doing so becomes *less* readable when the types already match, and it's another extra complication in kernel programming to know all the "oh, don't use the standard C &~ constructs because it has some subtle type handling under *some* circumstances". So for aligning things up, we've been able to do it, because people hate doing that duplicated " (val + mask) & ~mask" thing anyway (especially since "mask" tends to be something like "size-1". IOW, having a helper function/macro ends up solving more than just the type issue. But if it's just the type, it ends up being very inconvenient. We don't have the equivalent "align down" macro, for example, exactly because aligning things down is *just* the logical mask, and so in most cases it's actually just more pain to have a macro helper. So ALIGN() only aligns upwards, even though it doesn't even say so in the name. Inconsistent? Unclear? Yes, but there's a reason for it. Linus -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html