Skip to contentSkip to conversation

xfstests: standard way of handling loop devices

DISCUSSION Tomas Racek 2 participants 3 messages Aug 9, 2012 – Aug 13, 2012 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

Hi,

I am currently working on tests that check FITRIM implementation (251, 260 and one new I'm writing now) and I want to use loopback device as fallback if $SCRATCH_DEV doesn't support discard. Has anybody been working on some xfstests' standard way of creating/destroying loop devices?

I could do with something as simple as this (in common.rc):

_create_loop_device()

{
        size=${1}
        dev=`losetup -f`
        file="$TEST_DIR/$(basename $dev).fs"
        truncate -s $size $file || _fail "Cannot create image file $file"
        losetup $dev $file || _fail "Cannot associate $file with $dev"
        echo $dev
}

_destroy_loop_device()

{
        dev=${1}
        umount $dev 2>&1
        file=`losetup -a | grep $dev | sed -n "s/.*(\(.*\))$/\1/p"`
        losetup -d $dev && rm -f $file || _fail "Cannot destroy loop device"
}

Do you think it's sufficient or do you have different opinion on handling this?

Thanks for comments!

Tomas

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs

#2 lore raw
Quoted 5 lines · Tomas Racek

Hi,

I am currently working on tests that check FITRIM implementation (251, 260 and one new I'm writing now) and I want to use loopback device as fallback if $SCRATCH_DEV doesn't support discard. Has anybody been working on some xfstests' standard way of creating/destroying loop devices?

I could do with something as simple as this (in common.rc):

Probably a good idea given the random failures we get with loopback device unmounting due to the racy unmount-based automatic device destruction.

Quoted 6 lines

_create_loop_device()

{
        size=${1}
        dev=`losetup -f`
        file="$TEST_DIR/$(basename $dev).fs"

That won't work - we create loop devices with files on the scratch device, too, and some tests create more than one. This is also racy in that two threads could both get then same next free loopback device, but I'm not sure we care about that case very much.

Quoted 1 line
        truncate -s $size $file || _fail "Cannot create image file $file"

It's better to use xfs_io that introduce new external tool dependencies.

Quoted 8 lines
        losetup $dev $file || _fail "Cannot associate $file with $dev"
        echo $dev
}

_destroy_loop_device()

{
        dev=${1}
        umount $dev 2>&1

If unmount fails, what then?

Quoted 2 lines
        file=`losetup -a | grep $dev | sed -n "s/.*(\(.*\))$/\1/p"`
        losetup -d $dev && rm -f $file || _fail "Cannot destroy loop device"

And if unmount destroys the loop device automatically? That will fail the test, right?

Also, what happens if we unmount the filesystem first so we can run consistency checks on the image before we destroy it?

I'd suggest that it is the test's responsibility to create, mount, unmount, check and destroy the image file as those vary from test to test. Hence a better idea is to just use an image path/device API. i.e:

_create_loop_device()

{
	file=$1
        dev=`losetup -f`
        losetup $dev $file || _fail "Cannot associate $file with $dev"
        echo $dev
}

_destroy_loop_device()

{
	dev=$1
	losetup -d $dev || _fail "Cannot destroy loop device"
}

Cheers,

Dave.

Signature · 7 lines
Dave Chinner
[email protected]

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs
#3 lore raw
Quoted 16 lines · Tomas Racek
Quoted 9 lines

Hi,

I am currently working on tests that check FITRIM implementation (251, 260 and one new I'm writing now) and I want to use loopback device as fallback if $SCRATCH_DEV doesn't support discard. Has anybody been working on some xfstests' standard way of creating/destroying loop devices?

I could do with something as simple as this (in common.rc):

Probably a good idea given the random failures we get with loopback device unmounting due to the racy unmount-based automatic device destruction.

Quoted 1 line
Quoted 8 lines
Quoted 5 lines

_create_loop_device()

{
        size=${1}
        dev=`losetup -f`
        file="$TEST_DIR/$(basename $dev).fs"

That won't work - we create loop devices with files on the scratch device, too, and some tests create more than one. This is also racy

I've missed that...

Quoted 8 lines

in that two threads could both get then same next free loopback device, but I'm not sure we care about that case very much.

Quoted 2 lines
        truncate -s $size $file || _fail "Cannot create image file
        $file"

It's better to use xfs_io that introduce new external tool dependencies.

OK.

Quoted 11 lines
Quoted 10 lines
        losetup $dev $file || _fail "Cannot associate $file with
        $dev"
        echo $dev
}

_destroy_loop_device()

{
        dev=${1}
        umount $dev 2>&1
Quoted 8 lines

If unmount fails, what then?

Quoted 3 lines
        file=`losetup -a | grep $dev | sed -n "s/.*(\(.*\))$/\1/p"`
        losetup -d $dev && rm -f $file || _fail "Cannot destroy
        loop device"

And if unmount destroys the loop device automatically? That will fail the test, right?

I wasn't aware of that. I've always used the two-step approach:

losetup /dev/loopX file
mount /dev/loopX mntpoint

and subsequent umount never destroyed loop device in my case. I tried to use only

mount file mntpoint

which then resulted in behaviour you described. Is this the rule or is some other magic in that?

Quoted 7 lines

Also, what happens if we unmount the filesystem first so we can run consistency checks on the image before we destroy it?

I'd suggest that it is the test's responsibility to create, mount, unmount, check and destroy the image file as those vary from test to test. Hence a better idea is to just use an image path/device API. i.e:

Thanks for useful comments, I appreciate that.

Tomas

Quoted 16 lines

_create_loop_device()

{
	file=$1
        dev=`losetup -f`
        losetup $dev $file || _fail "Cannot associate $file with
        $dev"
        echo $dev
}

_destroy_loop_device()

{
	dev=$1
	losetup -d $dev || _fail "Cannot destroy loop device"
}
Quoted 7 lines

Cheers,

Dave.
--
Dave Chinner
[email protected]

_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs