From mboxrd@z Thu Jan 1 00:00:00 1970 From: Fernando Luis Vazquez Cao Subject: [PATCH 1/2] fsfreeze: add FIISFROZEN ioctl Date: Thu, 21 Jul 2011 11:36:52 +0900 Message-ID: <1311215812.2763.24.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]:43205 "EHLO serv2.oss.ntt.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751660Ab1GUCgy (ORCPT ); Wed, 20 Jul 2011 22:36:54 -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 a mounted filesystem. Signed-off-by: Fernando Luis Vazquez Cao --- diff -urNp linux-3.0-rc7-orig/fs/compat_ioctl.c linux-3.0-rc7/fs/compat_ioctl.c --- linux-3.0-rc7-orig/fs/compat_ioctl.c 2011-05-19 13:06:34.000000000 +0900 +++ linux-3.0-rc7/fs/compat_ioctl.c 2011-07-20 15:33:40.615998033 +0900 @@ -883,6 +883,7 @@ COMPATIBLE_IOCTL(FIGETBSZ) /* 'X' - originally XFS but some now in the VFS */ COMPATIBLE_IOCTL(FIFREEZE) COMPATIBLE_IOCTL(FITHAW) +COMPATIBLE_IOCTL(FIISFROZEN) COMPATIBLE_IOCTL(KDGETKEYCODE) COMPATIBLE_IOCTL(KDSETKEYCODE) COMPATIBLE_IOCTL(KDGKBTYPE) diff -urNp linux-3.0-rc7-orig/fs/ioctl.c linux-3.0-rc7/fs/ioctl.c --- linux-3.0-rc7-orig/fs/ioctl.c 2011-05-19 13:06:34.000000000 +0900 +++ linux-3.0-rc7/fs/ioctl.c 2011-07-20 12:23:06.124003192 +0900 @@ -536,6 +536,16 @@ static int ioctl_fsthaw(struct file *fil return thaw_super(sb); } +static int ioctl_fs_isfrozen(struct file *filp) +{ + struct super_block *sb = filp->f_path.dentry->d_inode->i_sb; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + return isfrozen_super(sb); +} + /* * When you add any new common ioctls to the switches above and below * please update compat_sys_ioctl() too. @@ -585,6 +595,12 @@ int do_vfs_ioctl(struct file *filp, unsi error = ioctl_fsthaw(filp); break; + case FIISFROZEN: + error = ioctl_fs_isfrozen(filp); + if (error >= 0) + return put_user(error, (int __user *)arg); + break; + case FS_IOC_FIEMAP: return ioctl_fiemap(filp, arg); diff -urNp linux-3.0-rc7-orig/fs/super.c linux-3.0-rc7/fs/super.c --- linux-3.0-rc7-orig/fs/super.c 2011-07-12 09:55:50.804000002 +0900 +++ linux-3.0-rc7/fs/super.c 2011-07-19 17:45:56.816155171 +0900 @@ -1057,3 +1057,8 @@ out: return 0; } EXPORT_SYMBOL(thaw_super); + +int isfrozen_super(struct super_block *sb) +{ + return sb->s_frozen > SB_UNFROZEN ? 1:0; +} 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 @@ -324,6 +325,7 @@ struct inodes_stat_t { #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ #define FITHAW _IOWR('X', 120, int) /* Thaw */ #define FITRIM _IOWR('X', 121, struct fstrim_range) /* Trim */ +#define FIISFROZEN _IOR('X', 122, int) /* get sb freeze state */ #define FS_IOC_GETFLAGS _IOR('f', 1, long) #define FS_IOC_SETFLAGS _IOW('f', 2, long) @@ -1882,6 +1884,7 @@ extern int fd_statfs(int, struct kstatfs extern int statfs_by_dentry(struct dentry *, struct kstatfs *); extern int freeze_super(struct super_block *super); extern int thaw_super(struct super_block *super); +extern int isfrozen_super(struct super_block *sb); extern int current_umask(void);