#!/bin/bash # # Copyright (C) 2024 Masatake YAMATO # # This file is part of util-linux. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This file is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # TS_TOPDIR="${0%/*}/../.." TS_DESC="inotify on btrfs" . "$TS_TOPDIR"/functions.sh ts_init "$*" ts_skip_nonroot ts_check_test_command "$TS_CMD_LSFD" ts_check_test_command "$TS_CMD_FINDMNT" ts_check_prog "stat" ts_check_prog "sed" ts_check_prog "mkfs.btrfs" ts_check_prog "dd" ts_cd "$TS_OUTDIR" IMG=img.btrfs MNTPNT=mntpnt mkdir -p $MNTPNT dd if=/dev/zero of=$IMG bs=114294784 count=1 status=none if ! mkfs.btrfs -q $IMG; then ts_skip "failed to make a btrfs image: $IMG" fi if ! mount $IMG $MNTPNT; then ts_skip "failed to mount a btrfs image, $IMG to $MNTPNT" fi trap "umount $MNTPNT; rm -f $IMG" EXIT if ! touch $MNTPNT/fstab; then ts_skip "failed to touch a file on a btrfs filesystem: $MNTPNT/fstab" fi PID= FD=3 ROOT="$(stat -c %i $MNTPNT)"@"$($TS_CMD_FINDMNT --raw --noheadings -oMAJ:MIN --target $MNTPNT)" FSTAB="$(stat -c %i $MNTPNT/fstab)"@"$($TS_CMD_FINDMNT --raw --noheadings -oMAJ:MIN --target $MNTPNT/fstab)" { coproc MKFDS { "$TS_HELPER_MKFDS" inotify $FD dir=$MNTPNT file=$MNTPNT/fstab; } if read -u ${MKFDS[0]} PID; then EXPR='(PID == '"${PID}"') and (FD == '"$FD"')' INODES_RAW=$(${TS_CMD_LSFD} --raw -n -o INOTIFY.INODES.RAW -Q "${EXPR}") echo "INOTIFY.INODES.RAW": $? if [[ "$INODES_RAW" == "${FSTAB}"'\x0a'"${ROOT}" ]]; then echo "INOTIFY.INODES.RAW" == FSTAB'\x0a'ROOT else echo "INOTIFY.INODES.RAW": "$INODES_RAW" echo "FSTAB": "$FSTAB" echo "ROOT": "$ROOT" fi INODES_RAW_JSON=$(${TS_CMD_LSFD} -J --raw -n -o INOTIFY.INODES.RAW -Q "${EXPR}") echo "INOTIFY.INODES.RAW (JSON)": $? EXPECTED_JSON=$(cat<&"${MKFDS[1]}" fi wait "${MKFDS_PID}" } > "$TS_OUTPUT" 2>&1 ts_finalize