Вы ищете container_of()
;из Википедии
#define container_of(ptr, type, member) ((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))
или более простого, но менее безопасного
#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))
В вашем случае вы бы применили его как
struct *s = container_of(q, struct s, y);