Это выглядит хорошо. Возможно, что буфер, который передал пользовательское пространство, отображается только для чтения - например, если он находится в текстовом сегменте (например, строковый литерал). Кстати, это, вероятно, то, что вы хотите:
return copy_to_user(buff, &tmp, len) ? -EFAULT : 0;