[Drbd-dev] Re: DRBD IOCTLs nicht 64bit clean...
Lars Ellenberg
Lars.Ellenberg at linbit.com
Thu Oct 21 01:26:26 CEST 2004
resent to the list just so this is in the archives, too.
lge
/ 2004-10-18 18:41:00 +0200
\ Lars Ellenberg:
> na dann, ran...
> es ind ja nicht mehr viele.
> gnaugenommen nur eben dieser.
> alle anderen benutzen doch sowieso structs, und die sind doch sowieso
> all u32/u64, oder täusch ich mich da jetzt?
hm.
eigentlich ist doch ein "int" immer 32 bit gross,
auch auf einer 64 bit box. interessant sind also nur pointer und longs.
und enums, wenn da der basistyp nicht klar ist.
#define DRBD_IOCTL_GET_VERSION _IOR( DRBD_IOCTL_LETTER, 0x00, int )
hat bisher immer funktioniert.
wenn kernel_int == userspace_int == 32bit, sollte das auch immer so sein.
#define DRBD_IOCTL_SET_STATE _IOW( DRBD_IOCTL_LETTER, 0x02, Drbd_State )
enum, allerdings nur kleine werte.
falls basistyp "long" ist, und long einmal 64, einmal 32 hat,
könnte das obere "wort" ignoriert werden... muss man mal nachlesen.
#define DRBD_IOCTL_SET_DISK_CONFIG _IOW( DRBD_IOCTL_LETTER, 0x06, struct ioctl_disk_config )
struct disk_config {
IN int lower_device;
IN __u64 disk_size;
IN enum io_error_handler on_io_error;
IN int meta_device;
IN int meta_index;
};
likely alignment problems...
ich neheme jetzt mal an, dass enums basistyp int sind, und dass ints
immer 32bit sind. dann sollte entweder __packed__ dabei stehen,
oder besser:
struct disk_config {
IN __u64 disk_size;
IN enum io_error_handler on_io_error;
IN int lower_device;
IN int meta_device;
IN int meta_index;
};
#define DRBD_IOCTL_SET_NET_CONFIG _IOW( DRBD_IOCTL_LETTER, 0x07, struct ioctl_net_config )
struct net_config {
#define MAX_SOCK_ADDR 128 /* 108 for Unix domain -
16 for IP, 16 for IPX,
24 for IPv6,
about 80 for AX.25
must be at least one bigger than
the AF_UNIX size (see net/unix/af_unix.c
:unix_mkname()).
*/
IN char my_addr[MAX_SOCK_ADDR];
IN int my_addr_len;
==> alignment problem <<==
IN char other_addr[MAX_SOCK_ADDR];
IN int other_addr_len;
IN int timeout; // deci seconds
IN int wire_protocol;
IN int try_connect_int; /* seconds */
IN int ping_int; /* seconds */
IN int max_epoch_size;
IN int max_buffers;
IN int sndbuf_size; /* socket send buffer size */
IN unsigned int ko_count;
IN enum disconnect_handler on_disconnect;
};
#define DRBD_IOCTL_UNCONFIG_NET _IO ( DRBD_IOCTL_LETTER, 0x08 )
egal
#define DRBD_IOCTL_GET_CONFIG _IOW( DRBD_IOCTL_LETTER, 0x0A, struct ioctl_get_config )
möglicherweise schlecht aligned, bin jetzt zu faul genau zu schauen ...
#define DRBD_IOCTL_INVALIDATE _IO ( DRBD_IOCTL_LETTER, 0x0D )
#define DRBD_IOCTL_INVALIDATE_REM _IO ( DRBD_IOCTL_LETTER, 0x0E )
egal
#define DRBD_IOCTL_SET_SYNC_CONFIG _IOW( DRBD_IOCTL_LETTER, 0x0F, struct ioctl_syncer_config )
struct syncer_config {
int rate; /* KB/sec */
int use_csums; /* use checksum based syncing*/
int skip;
int group;
int al_extents;
};
sollte passen. evtl. alignment problem in zusammen gesetzten
structs wie get_config...
#define DRBD_IOCTL_SET_DISK_SIZE _IOW( DRBD_IOCTL_LETTER, 0x10, unsigned int )
sollte passen, aber lieber explizit __u32
#define DRBD_IOCTL_WAIT_CONNECT _IOR( DRBD_IOCTL_LETTER, 0x11, struct ioctl_wait )
#define DRBD_IOCTL_WAIT_SYNC _IOR( DRBD_IOCTL_LETTER, 0x12, struct ioctl_wait )
struct ioctl_wait {
IN int wfc_timeout;
IN int degr_wfc_timeout;
OUT int ret_code;
};
sollte passen. evtl. alignment problem in zusammen gesetzten
structs wie get_config...
#define DRBD_IOCTL_UNCONFIG_DISK _IO ( DRBD_IOCTL_LETTER, 0x13 )
egal
#define DRBD_IOCTL_SET_STATE_FLAGS _IOW( DRBD_IOCTL_LETTER, 0x14, Drbd_State )
enum. siehe SET_STATE
More information about the drbd-dev
mailing list