From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fernando Luis Vazquez Cao Subject: [PATCH 2/2] fsfreeze: add BLKISFROZEN ioctl Date: Thu, 21 Jul 2011 11:41:57 +0900 Message-ID: <1311216117.2763.29.camel@nausicaa> References: <1311215535.2763.20.camel@nausicaa> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 7bit Cc: Christoph Hellwig , Eric Sandeen , Josef Bacik , linux-fsdevel@vger.kernel.org To: Al Viro Return-path: Received: from serv2.oss.ntt.co.jp ([222.151.198.100]:43301 "EHLO serv2.oss.ntt.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751990Ab1GUCl7 (ORCPT ); Wed, 20 Jul 2011 22:41:59 -0400 In-Reply-To: <1311215535.2763.20.camel@nausicaa> Sender: linux-fsdevel-owner@vger.kernel.org List-ID: 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 --- 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;