diff --git a/heartbeat/Filesystem b/heartbeat/Filesystem index 61b191064e..a933ae98bd 100755 --- a/heartbeat/Filesystem +++ b/heartbeat/Filesystem @@ -19,6 +19,7 @@ # OCF_RESKEY_run_fsck # OCF_RESKEY_fast_stop # OCF_RESKEY_force_clones +# OCF_RESKEY_quota # #OCF_RESKEY_device : name of block device for the filesystem. e.g. /dev/sda1, /dev/md0 # Or a -U or -L option for mount, or an NFS mount specification @@ -30,6 +31,7 @@ #OCF_RESKEY_fast_stop : fast stop: yes(default)/no #OCF_RESKEY_force_clones : allow running the resource as clone. e.g. local xfs mounts # for each brick in a glusterfs setup +#OCF_RESKEY_quota : enable quotas: auto(default)/none/user/group/both # # # This assumes you want to manage a filesystem on a shared (SCSI) bus, @@ -62,6 +64,8 @@ DFLT_STATUSDIR=".Filesystem_status/" # Variables used by multiple methods HOSTOS=`uname` +QUOTAON=/sbin/quotaon +QUOTAOFF=/sbin/quotaoff # The status file is going to an extra directory, by default # @@ -196,6 +200,20 @@ Only set this to "true" if you know what you are doing! + + +Enable quotas on the filesystem after mounting: + +"auto" : automatically detect if we should enable quotas(default) +"none" : do not enable quotas on this filesystem +"user" : enable user quotas only +"group" : enable group quotas only +"both" : enable both user and group quotas + +enable quotas + + + @@ -541,6 +559,12 @@ Filesystem_start() fi return $OCF_ERR_GENERIC fi + + if [ -n "$quotaopts" ]; then + ocf_run $QUOTAON -v -${quotaopts} $MOUNTPOINT \ + || exit $OCF_ERR_GENERIC + fi + return $OCF_SUCCESS } # end of Filesystem_start @@ -776,6 +800,10 @@ Filesystem_stop() nfs4|nfs|cifs|smbfs) umount_force="-f" ;; esac + if [ -n "$quotaopts" ]; then + ocf_run $QUOTAOFF -v -${quotaopts} $MOUNTPOINT + fi + # Umount all sub-filesystems mounted under $MOUNTPOINT/ too. local timeout for SUB in `list_submounts $MOUNTPOINT` $MOUNTPOINT; do @@ -995,6 +1023,50 @@ set_blockdevice_var() { esac } +autodetect_quota_options() { + OCF_RESKEY_quota=none + user=0 + group=0 + + case $FSTYPE in + ext4|ext3|ext2) ;; + *) return;; + esac + + is_option "usrquota" && user=1 + is_option "quota" && user=1 + is_option "grpquota" && group=1 + + if [ $user -eq 1 -a $group -eq 1 ]; then + OCF_RESKEY_quota=both + elif [ $user -eq 1 ]; then + OCF_RESKEY_quota=user + elif [ $group -eq 1 ]; then + OCF_RESKEY_quota=group + else + OCF_RESKEY_quota=none + fi +} + +check_quota_options() { + quotaopts="" + + if [ -z "$OCF_RESKEY_quota" -o "$OCF_RESKEY_quota" = "auto" ]; then + autodetect_quota_options + fi + + case "$OCF_RESKEY_quota" in + none) ;; + user) quotaopts="u";; + group) quotaopts="g";; + both) quotaopts="ug";; + *) + ocf_log err "quota: $OCF_RESKEY_quota: invalid option" + exit $OCF_ERR_GENERIC + ;; + esac +} + # Check the arguments passed to this script if [ $# -ne 1 ]; then usage @@ -1027,6 +1099,7 @@ if [ x = x"$DEVICE" ]; then fi set_blockdevice_var +check_quota_options # Normalize instance parameters: @@ -1054,6 +1127,11 @@ check_binary $FSCK check_binary $MOUNT check_binary $UMOUNT +if [ -n "$quotaopts" ]; then + check_binary $QUOTAON + check_binary $QUOTAOFF +fi + if [ "$OP" != "monitor" ]; then ocf_log info "Running $OP for $DEVICE on $MOUNTPOINT" fi