|
|
|
[PATCH 7/8] fsfreeze: add block device ioctl to check freeze state | |
| [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] | |
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: Jan Kara <jack@xxxxxxx>
Cc: Dave Chinner <dchinner@xxxxxxxxxx>
Signed-off-by: Fernando Luis Vazquez Cao <fernando@xxxxxxxxxxxxx>
---
diff -urNp vfs-orig/block/compat_ioctl.c vfs/block/compat_ioctl.c
--- vfs-orig/block/compat_ioctl.c 2012-07-04 18:57:54.000000000 +0900
+++ vfs/block/compat_ioctl.c 2012-07-12 17:29:01.608639153 +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 vfs-orig/block/ioctl.c vfs/block/ioctl.c
--- vfs-orig/block/ioctl.c 2012-07-04 18:57:54.000000000 +0900
+++ vfs/block/ioctl.c 2012-07-12 17:29:01.608639153 +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 vfs-orig/fs/block_dev.c vfs/fs/block_dev.c
--- vfs-orig/fs/block_dev.c 2012-07-12 17:11:42.480606884 +0900
+++ vfs/fs/block_dev.c 2012-07-12 17:29:01.616637572 +0900
@@ -329,6 +329,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 vfs-orig/include/linux/fs.h vfs/include/linux/fs.h
--- vfs-orig/include/linux/fs.h 2012-07-12 17:28:15.556654469 +0900
+++ vfs/include/linux/fs.h 2012-07-12 17:29:01.616637572 +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 */
@@ -2112,6 +2113,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) {}
@@ -2128,6 +2130,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
[Linux Ext4 Filesystem] [Ecryptfs] [AutoFS] [Kernel Newbies] [Share Photos] [Security] [Netfilter] [Bugtraq] [Photo] [Yosemite] [Yosemite News] [MIPS Linux] [ARM Linux] [Linux Security] [Linux Cachefs] [Reiser Filesystem] [Linux RAID] [Samba] [Video 4 Linux] [Device Mapper] [CEPH Filesystem]
![]() |