I don't think the new code is equivalent... You probably meant to & CLUST32_MASK instead of | ~CLUST32_MASK here.
Line 629 in old code doesn't make much sense to me because *p should be 0 and it's a no-op, and it is fine to just drop it in the proposed change.
Not related to your change, but I think we should probably assert that cl always even (cl & 1 == 0) here.
Please use CLUST12_MASK instead of 0xfff.
Please rebase with latest svn revision.
I think it should be ((*p & 0xf0) << 8) | (fat[cl].next & CLUST12_MASK) here (end result: the 4 LSBs of *p become the MSBs of the new 16-bit word at p)?