diff options
| author | Rajesh <rajesh@gluster.com> | 2011-08-24 12:47:24 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@gluster.com> | 2011-11-11 02:01:28 -0800 | 
| commit | cb9ffbe767b8e5edb30bee95e33ebe9945101250 (patch) | |
| tree | c5edcd6b2f3d1302a36321fa7276ead95782ff12 | |
| parent | 359eee148b2be5aaf9677f61f98b89a50d0f1b88 (diff) | |
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 <amar@gluster.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@gluster.com>
| -rwxr-xr-x | xlators/mount/fuse/utils/mount.glusterfs.in | 61 | 
1 files changed, 60 insertions, 1 deletions
diff --git a/xlators/mount/fuse/utils/mount.glusterfs.in b/xlators/mount/fuse/utils/mount.glusterfs.in index ab11a9788f7..b485a6f724f 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)  | 
