From cb9ffbe767b8e5edb30bee95e33ebe9945101250 Mon Sep 17 00:00:00 2001 From: Rajesh Date: Wed, 24 Aug 2011 12:47:24 +0530 Subject: mount/fuse: check for recursive mounts Adding check_recursive_mount() in mount.glusterfs.in to check if mount point is in the lineage of any brick path. Gracefully fails if mount point leads to recursive mount. Change-Id: Iedc4cd767d241c8e256181e472c0815f3831a316 BUG: 2003 Reviewed-on: http://review.gluster.com/314 Reviewed-by: Amar Tumballi Tested-by: Gluster Build System Reviewed-by: Anand Avati --- xlators/mount/fuse/utils/mount.glusterfs.in | 61 ++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) (limited to 'xlators/mount/fuse/utils') diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index ab11a9788..b485a6f72 100755 --- a/xlators/mount/fuse/utils/mount.glusterfs.in +++ b/xlators/mount/fuse/utils/mount.glusterfs.in @@ -149,7 +149,7 @@ start_glusterfs () cmd_line1=$(echo "$cmd_line1 $mount_point"); $cmd_line1 - inode=$(stat -c %i $mount_point 2>/dev/null); + inode=$(stat -c %i $mount_point 2>/dev/null); # this is required if the stat returns error if [ -z "$inode" ]; then inode="0"; @@ -178,6 +178,63 @@ mount.glusterfs --version" } +# check for recursive mounts. i.e, mounting over an existing brick +check_recursive_mount () +{ + if [ $2 = "/" ]; then + echo Cannot mount over root; + exit 2; + fi + # GFID check first + # remove trailing / from mount point + mnt_dir=${2%/}; + + # check whether getfattr exists + which getfattr > /dev/null; + if [ $? -ne 0 ]; then + return; + fi + + getfattr -n trusted.gfid $mnt_dir 2>/dev/null | grep -iq "trusted.gfid="; + if [ $? -eq 0 ]; then + echo "ERROR: $mnt_dir is in use as a brick of a gluster volume"; + exit 2; + fi + + # check if the mount point is a brick's parent directory + brick_path=(`cat /etc/glusterd/vols/*/bricks/* | grep ^path | cut -d "=" -f 2`); + root_inode=`stat -Lc %i /`; + root_dev=`stat -Lc %d /`; + mnt_inode=`stat -Lc %i $mnt_dir`; + mnt_dev=`stat -Lc %d $mnt_dir`; + for brick in "$brick_path"; + do + # evaluate brick path to see if this is local, if non-local, skip iteration + ls $brick > /dev/null 2>&1; + if [ $? -ne 0 ]; then + continue; + fi + getfattr -n trusted.gfid "$brick" 2>/dev/null | grep -iq "trusted.gfid="; + if [ $? -ne 0 ]; then + continue; + else + # brick is local + while [ 1 ]; + do + tmp_brick="$brick"; + brick="$brick"/..; + brick_dev=`stat -Lc %d $brick`; + brick_inode=`stat -Lc %i $brick`; + if [ "$mnt_inode" -eq "$brick_inode" -a "$mnt_dev" -eq "$brick_dev" ]; then + echo ERROR: $mnt_dir is a parent of the brick $tmp_brick; + exit 2; + fi + [ "$root_inode" -ne "$brick_inode" -o "$root_dev" -ne "$brick_dev" ] || break; + done; + fi + done; +} + main () { helper=$(echo "$@" | sed -n 's/.*\--[ ]*\([^ ]*\).*/\1/p'); @@ -274,6 +331,8 @@ main () exit 0; fi + check_recursive_mount "$@"; + fs_options=$(echo "$fs_options,$new_fs_options"); # Append fuse.glusterfs to PRUNEFS variable in updatedb.conf(5). updatedb(8) -- cgit