The combination of
32-bit signed block pointers and 512 bytes/block = 2 GB. Though be careful with using 0xFFFFFFFF as the number of blocks as it can mean -1 in signed interpretation. There are different saying if it's unsigned or signed. But the sure bet is to limit to 2 GB.
Thus to break the 2/4 GB wall. Use PFS (or SFS). Or even better network via Ethernet to a fileserver that can store at least 8 EBytes

Maybe one can trick with block size larger than 512 bytes, but dunno if FFS supports that completely.