| # |
| # CephFS specific common functions. |
| # |
| |
| # _ceph_create_file_layout <filename> <stripe unit> <stripe count> <object size> |
| # This function creates a new empty file and sets the file layout according to |
| # parameters. It will exit if the file already exists. |
| _ceph_create_file_layout() |
| { |
| local fname=$1 |
| local stripe_unit=$2 |
| local stripe_count=$3 |
| local obj_size=$4 |
| |
| if [ -e $fname ]; then |
| echo "File $fname already exists." |
| _exit 1 |
| fi |
| touch $fname |
| $SETFATTR_PROG -n ceph.file.layout \ |
| -v "stripe_unit=$objsz stripe_count=1 object_size=$objsz" \ |
| $fname |
| } |
| |
| # this test requires to access file capabilities through vxattr 'ceph.caps'. |
| _require_ceph_vxattr_caps() |
| { |
| $GETFATTR_PROG -n "ceph.caps" $TEST_DIR >/dev/null 2>&1 \ |
| || _notrun "ceph.caps vxattr not supported" |
| } |
| |
| _ceph_get_cluster_fsid() |
| { |
| $GETFATTR_PROG --only-values -n "ceph.cluster_fsid" $TEST_DIR 2>/dev/null |
| } |
| |
| _ceph_get_client_id() |
| { |
| $GETFATTR_PROG --only-values -n "ceph.client_id" $TEST_DIR 2>/dev/null |
| } |
| |
| # Get the snapshot directory name from mount options |
| # Defaults to ".snap" if snapdirname option is not set |
| _ceph_get_snapdirname() |
| { |
| local mnt_point=$1 |
| local snapdirname |
| |
| # Extract snapdirname from mount options |
| snapdirname=$(findmnt -n -o OPTIONS "$mnt_point" | grep -o 'snapdirname=[^,]*' | cut -d'=' -f2) |
| |
| # Default to .snap if not set |
| if [ -z "$snapdirname" ]; then |
| echo ".snap" |
| else |
| echo "$snapdirname" |
| fi |
| } |
| |
| # Create a CephFS snapshot |
| # _ceph_create_snapshot <directory_path> <snapshot_name> |
| # Creates a snapshot under <directory_path>/.snap/<snapshot_name> |
| # or <directory_path>/<custom_snapdir>/<snapshot_name> if snapdirname is set |
| _ceph_create_snapshot() |
| { |
| local dir_path=$1 |
| local snap_name=$2 |
| local snapdirname |
| local snapdir |
| local mnt_point |
| |
| if [ -z "$dir_path" ] || [ -z "$snap_name" ]; then |
| echo "Usage: _ceph_create_snapshot <directory_path> <snapshot_name>" |
| return 1 |
| fi |
| |
| # Find the mount point for this directory |
| mnt_point=$(df -P "$dir_path" | tail -1 | awk '{print $NF}') |
| snapdirname=$(_ceph_get_snapdirname "$mnt_point") |
| snapdir="$dir_path/$snapdirname/$snap_name" |
| |
| mkdir "$snapdir" || _fail "Failed to create snapshot $snapdir" |
| echo "$snapdir" |
| } |
| |
| # Remove a CephFS snapshot |
| # _ceph_remove_snapshot <directory_path> <snapshot_name> |
| _ceph_remove_snapshot() |
| { |
| local dir_path=$1 |
| local snap_name=$2 |
| local snapdirname |
| local snapdir |
| local mnt_point |
| |
| if [ -z "$dir_path" ] || [ -z "$snap_name" ]; then |
| echo "Usage: _ceph_remove_snapshot <directory_path> <snapshot_name>" |
| return 1 |
| fi |
| |
| # Find the mount point for this directory |
| mnt_point=$(df -P "$dir_path" | tail -1 | awk '{print $NF}') |
| snapdirname=$(_ceph_get_snapdirname "$mnt_point") |
| snapdir="$dir_path/$snapdirname/$snap_name" |
| |
| rmdir "$snapdir" 2>/dev/null |
| } |
| |
| # this test requires ceph snapshot support |
| _require_ceph_snapshot() |
| { |
| local snapdirname=$(_ceph_get_snapdirname "$TEST_DIR") |
| local test_snapdir="$TEST_DIR/$snapdirname/test_snap_$$" |
| mkdir "$test_snapdir" 2>/dev/null || \ |
| _notrun "Ceph snapshots not supported (requires fs flag 'allow_snaps' and client auth capability 'snap')" |
| rmdir "$test_snapdir" |
| } |