From: Matthias Koenig Date: Wed, 18 Jul 2007 14:15:46 +0000 (+0200) Subject: disk-utils: let mkfs tools open with O_EXCL X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2018629905d3d881ff3fddf76552b6e79091f2b8;p=util-linux disk-utils: let mkfs tools open with O_EXCL Let mkswap, mkfs.bfs, mkfs.minix open with O_EXCL if used on block devices to prevent writing to the device even if they are busy (mounted). Unfortunately, O_EXCL has zero effect for 2.4 kernels where in-kernel code doesn't use O_EXCL-like access locks. (Tested on RHEL3.) Signed-off-by: Matthias Koenig Signed-off-by: Karel Zak --- diff --git a/disk-utils/mkfs.bfs.c b/disk-utils/mkfs.bfs.c index 8221f3b7..557cde48 100644 --- a/disk-utils/mkfs.bfs.c +++ b/disk-utils/mkfs.bfs.c @@ -170,7 +170,7 @@ main(int argc, char *argv[]) { if (!S_ISBLK(statbuf.st_mode)) fatal(_("%s is not a block special device"), device); - fd = open(device, O_RDWR); + fd = open(device, O_RDWR | O_EXCL); if (fd == -1) { perror(device); fatal(_("cannot open %s"), device); diff --git a/disk-utils/mkfs.minix.c b/disk-utils/mkfs.minix.c index 92a6789a..8a81e7ca 100644 --- a/disk-utils/mkfs.minix.c +++ b/disk-utils/mkfs.minix.c @@ -699,11 +699,14 @@ main(int argc, char ** argv) { tmp += dirsize; *(short *)tmp = 2; strcpy(tmp+2,".badblocks"); - DEV = open(device_name,O_RDWR ); + if (stat(device_name, &statbuf) < 0) + die(_("unable to stat %s")); + if (S_ISBLK(statbuf.st_mode)) + DEV = open(device_name,O_RDWR | O_EXCL); + else + DEV = open(device_name,O_RDWR); if (DEV<0) die(_("unable to open %s")); - if (fstat(DEV,&statbuf)<0) - die(_("unable to stat %s")); if (!S_ISBLK(statbuf.st_mode)) check=0; else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340) diff --git a/disk-utils/mkswap.c b/disk-utils/mkswap.c index 1fd1f185..6af1ff7b 100644 --- a/disk-utils/mkswap.c +++ b/disk-utils/mkswap.c @@ -640,8 +640,16 @@ main(int argc, char ** argv) { usage(); } - DEV = open(device_name,O_RDWR); - if (DEV < 0 || fstat(DEV, &statbuf) < 0) { + if (stat(device_name, &statbuf) < 0) { + perror(device_name); + exit(EXIT_FAILURE); + } + if (S_ISBLK(statbuf.st_mode)) + DEV = open(device_name, O_RDWR | O_EXCL); + else + DEV = open(device_name, O_RDWR); + + if (DEV < 0) { perror(device_name); exit(1); }