diff -urN nbd/nbd-client.c nbd-patched/nbd-client.c --- nbd/nbd-client.c 2002-03-25 04:44:18.000000000 -0700 +++ nbd-patched/nbd-client.c 2003-06-25 08:57:49.280300439 -0600 @@ -22,6 +22,7 @@ #include #include #include +#include #define MY_NAME "nbd_client" #ifndef __GNUC__ @@ -62,7 +63,7 @@ unsigned long size; char buf[256] = "\0\0\0\0\0\0\0\0\0"; int blocksize=1024; - char *hostname; + char *hostname, *nbdname; int swap=0; logging(); @@ -117,10 +118,11 @@ if (argc==0) goto errmsg; sock = opennet(hostname, port); - nbd = open(argv[0], O_RDWR); + nbdname = argv[0]; + nbd = open(nbdname, O_RDWR); if (nbd < 0) err("Can not open NBD: %m"); - ++argv; --argc; /* skip device */ + ++argv; --argc; /* skip device command line argument */ if (argc>1) goto errmsg; if (argc!=0) swap=1; @@ -182,10 +184,18 @@ err("Ioctl/1 failed: %m\n"); } #endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) + close(nbd); + nbd = open(nbdname, O_RDWR); + if (nbd < 0) + err("Can not re-open NBD: %m"); +#endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74)) ioctl(nbd, NBD_CLEAR_SOCK); if (ioctl(nbd, NBD_SET_SOCK, sock) < 0) err("Ioctl/2 failed: %m\n"); +#endif #ifndef SO_SWAPPING if (swap) @@ -202,14 +212,23 @@ if (fork()) exit(0); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74)) if (ioctl(nbd, NBD_DO_IT) < 0) fprintf(stderr, "Kernel call returned: %m"); else fprintf(stderr, "Kernel call returned."); +#else + if (ioctl(nbd, NBD_DO_IT, sock) < 0) + fprintf(stderr, "Kernel call returned: %m"); + else + fprintf(stderr, "Kernel call returned."); +#endif printf("Closing: que, "); ioctl(nbd, NBD_CLEAR_QUE); +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,74)) printf("sock, "); ioctl(nbd, NBD_CLEAR_SOCK); +#endif printf("done\n"); return 0; }