Sto cercando una specifica definitiva che descriva gli argomenti e il comportamento previsti di ioctl 0x1268 (BLKSSZGET).Dove sono effettivamente specificati i parametri ioctl (come 0x1268/BLKSSZGET)?
Questo numero è dichiarato in molti luoghi (nessuno dei quali contiene una fonte di riferimento definitiva), come ad esempio linux/fs.h
, ma non riesco a trovare alcuna specifica per questo.
Sicuramente, qualcuno a un certo punto nel passato ha deciso che 0x1268 avrebbe ottenuto la dimensione del settore fisico di un dispositivo e l'avrebbe documentata da qualche parte. Da dove proviene questa informazione e dove posso trovarla?
Modifica: non sto chiedendo cosa BLKSSZGET fa in generale, né sto chiedendo in quale intestazione è definito. Sto cercando una fonte definitiva e standardizzata che indichi quali tipi di argomenti dovrebbe prendere e quale dovrebbe essere il suo comportamento per qualsiasi driver che lo implementa.
In particolare, chiedo perché ci sembra tratta di un problema in blkdiscard
in util-linux 2.23 (e 2.24) dove la dimensione del settore viene interrogato in un uint64_t
, ma le alte 32 bit sono intatti dal BLKSSZGET appare in attesa di un numero intero a 32 bit e ciò porta a una dimensione del settore errata, a calcoli di allineamento errati e a errori in blkdiscard
quando deve riuscire. Quindi, prima di inviare una patch, ho bisogno di determinare, con assoluta certezza, se il problema è che blkdiscard
dovrebbe usare un numero intero a 32 bit, o se l'implementazione del driver nel mio kernel dovrebbe usare un numero intero a 64-bit.
Edit 2: Dal momento che siamo in tema, la patch proposto presumendo blkdiscard
non è corretto è:
--- sys-utils/blkdiscard.c-2.23 2013-11-01 18:28:19.270004947 -0400
+++ sys-utils/blkdiscard.c 2013-11-01 18:29:07.334002382 -0400
@@ -71,7 +71,8 @@
{
char *path;
int c, fd, verbose = 0, secure = 0;
- uint64_t end, blksize, secsize, range[2];
+ uint64_t end, blksize, range[2];
+ uint32_t secsize;
struct stat sb;
static const struct option longopts[] = {
@@ -146,8 +147,8 @@
err(EXIT_FAILURE, _("%s: BLKSSZGET ioctl failed"), path);
/* align range to the sector size */
- range[0] = (range[0] + secsize - 1) & ~(secsize - 1);
- range[1] &= ~(secsize - 1);
+ range[0] = (range[0] + (uint64_t)secsize - 1) & ~((uint64_t)secsize - 1);
+ range[1] &= ~((uint64_t)secsize - 1);
/* is the range end behind the end of the device ?*/
end = range[0] + range[1];
applicata a esempio https://www.kernel.org/pub/linux/utils/util-linux/v2.23/.
Grazie, ma so già cosa fa BLKSSZGET. Sto cercando una specifica definitiva del suo comportamento. In particolare, ci vuole un puntatore a un numero intero a 32 o 64 bit come parametro e, cosa più importante, * come fai a sapere *? –
Abbastanza corretto, ne so 0, pensavo che potesse essere d'aiuto; continuerà a scavare. – slm
Dato che alcuni probabilmente sanno di questo, potresti elaborare il tuo Q aggiungendo un po 'di contesto? – slm