The BLKISFROZEN ioctl can be use by HA and monitoring software to check the freeze state of the filesystem sitting on top of a block device. This will not work for filesystems that can handle multiple devices, i.e. btrfs. Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Cc: Dave Chinner <dchinner@xxxxxxxxxx> Signed-off-by: Fernando Luis Vazquez Cao <fernando@xxxxxxxxxxxxx> --- diff -urNp linux-3.5-rc5-orig/block/compat_ioctl.c linux-3.5-rc5/block/compat_ioctl.c --- linux-3.5-rc5-orig/block/compat_ioctl.c 2012-05-21 07:29:13.000000000 +0900 +++ linux-3.5-rc5/block/compat_ioctl.c 2012-07-06 14:12:06.641994024 +0900 @@ -746,6 +746,13 @@ long compat_blkdev_ioctl(struct file *fi case BLKTRACETEARDOWN: /* compatible */ ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg)); return ret; + case BLKISFROZEN: + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + ret = isfrozen_bdev(bdev); + if (ret >= 0) + return compat_put_int(arg, ret); + return ret; default: if (disk->fops->compat_ioctl) ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg); diff -urNp linux-3.5-rc5-orig/block/ioctl.c linux-3.5-rc5/block/ioctl.c --- linux-3.5-rc5-orig/block/ioctl.c 2012-05-21 07:29:13.000000000 +0900 +++ linux-3.5-rc5/block/ioctl.c 2012-07-06 14:12:06.641994024 +0900 @@ -343,6 +343,13 @@ int blkdev_ioctl(struct block_device *bd case BLKTRACETEARDOWN: ret = blk_trace_ioctl(bdev, cmd, (char __user *) arg); break; + case BLKISFROZEN: + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + ret = isfrozen_bdev(bdev); + if (ret >= 0) + return put_int(arg, ret); + return ret; default: ret = __blkdev_driver_ioctl(bdev, mode, cmd, arg); } diff -urNp linux-3.5-rc5-orig/fs/block_dev.c linux-3.5-rc5/fs/block_dev.c --- linux-3.5-rc5-orig/fs/block_dev.c 2012-07-06 12:27:27.082025564 +0900 +++ linux-3.5-rc5/fs/block_dev.c 2012-07-06 14:20:04.593990972 +0900 @@ -327,6 +327,11 @@ out: } EXPORT_SYMBOL(thaw_bdev); +int isfrozen_bdev(struct block_device *bdev) +{ + return bdev->bd_fsfreeze_count > 0; +} + static int blkdev_writepage(struct page *page, struct writeback_control *wbc) { return block_write_full_page(page, blkdev_get_block, wbc); diff -urNp linux-3.5-rc5-orig/include/linux/fs.h linux-3.5-rc5/include/linux/fs.h --- linux-3.5-rc5-orig/include/linux/fs.h 2012-07-06 14:09:55.841988821 +0900 +++ linux-3.5-rc5/include/linux/fs.h 2012-07-06 14:12:06.641994024 +0900 @@ -333,6 +333,7 @@ struct inodes_stat_t { #define BLKDISCARDZEROES _IO(0x12,124) #define BLKSECDISCARD _IO(0x12,125) #define BLKROTATIONAL _IO(0x12,126) +#define BLKISFROZEN _IOR(0x12,127, int) /* get file system freeze state */ #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ #define FIBMAP _IO(0x00,1) /* bmap access */ @@ -2101,6 +2102,7 @@ extern void kill_bdev(struct block_devic extern struct super_block *freeze_bdev(struct block_device *); extern void emergency_thaw_all(void); extern int thaw_bdev(struct block_device *bdev, struct super_block *sb); +extern int isfrozen_bdev(struct block_device *bdev); extern int fsync_bdev(struct block_device *); #else static inline void bd_forget(struct inode *inode) {} @@ -2117,6 +2119,11 @@ static inline int thaw_bdev(struct block { return 0; } + +static int isfrozen_bdev(struct block_device *bdev) +{ + return 0; +} #endif extern int sync_filesystem(struct super_block *); extern const struct file_operations def_blk_fops; -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html