The FIISFROZEN 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. Signed-off-by: Fernando Luis Vazquez Cao <fernando@xxxxxxxxxxxxx> --- diff -urNp linux-3.0-rc7-orig/block/compat_ioctl.c linux-3.0-rc7/block/compat_ioctl.c --- linux-3.0-rc7-orig/block/compat_ioctl.c 2011-05-19 13:06:34.000000000 +0900 +++ linux-3.0-rc7/block/compat_ioctl.c 2011-07-20 15:20:31.439999983 +0900 @@ -757,6 +757,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.0-rc7-orig/block/ioctl.c linux-3.0-rc7/block/ioctl.c --- linux-3.0-rc7-orig/block/ioctl.c 2011-05-19 13:06:34.000000000 +0900 +++ linux-3.0-rc7/block/ioctl.c 2011-07-20 15:20:22.140020393 +0900 @@ -322,6 +322,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.0-rc7-orig/fs/block_dev.c linux-3.0-rc7/fs/block_dev.c --- linux-3.0-rc7-orig/fs/block_dev.c 2011-07-12 09:55:49.656000005 +0900 +++ linux-3.0-rc7/fs/block_dev.c 2011-07-21 09:40:36.900005798 +0900 @@ -310,6 +310,25 @@ out: } EXPORT_SYMBOL(thaw_bdev); +int isfrozen_bdev(struct block_device *bdev) +{ + int ret; + struct super_block *sb; + + mutex_lock(&bdev->bd_fsfreeze_mutex); + + ret = -EINVAL; + sb = get_active_super(bdev); + if (!sb) + goto out; + ret = isfrozen_super(sb); + deactivate_super(sb); +out: + mutex_unlock(&bdev->bd_fsfreeze_mutex); + + return ret; +} + 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.0-rc7-orig/include/linux/fs.h linux-3.0-rc7/include/linux/fs.h --- linux-3.0-rc7-orig/include/linux/fs.h 2011-07-12 09:55:51.192000002 +0900 +++ linux-3.0-rc7/include/linux/fs.h 2011-07-20 12:27:59.443932676 +0900 @@ -317,6 +317,7 @@ struct inodes_stat_t { #define BLKPBSZGET _IO(0x12,123) #define BLKDISCARDZEROES _IO(0x12,124) #define BLKSECDISCARD _IO(0x12,125) +#define BLKISFROZEN _IOR(0x12,126, int) /* get file system freeze state */ #define BMAP_IOCTL 1 /* obsolete - kept for compatibility */ #define FIBMAP _IO(0x00,1) /* bmap access */ @@ -2036,6 +2039,7 @@ extern int sync_blockdev(struct block_de 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) {} @@ -2051,6 +2055,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