[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [dm-devel] More dm-crypt patches



Am Sa, den 03.01.2004 schrieb Joe Thornber um 11:47:

> > I've folded my last changes on dm-crypt into a patchset (like Joe does).
> 
> Excellent, this makes my job a lot easier.  I presume you found the
> 'pm' tool on my webpage ?

Yes, I've seen that, looks nice. But I actually didn't use it for this.
I did play a lot with the source and kept some copies from time to time.
I then used these copies to track my changes and clean them up.

Sometimes I find out that I've got very long shell commands in my bash
history (which grow over time) and I then decide to turm them into a
useful script. I always had some that dealt with your patchsets and so I
ended up with my own little tool. ;)

Well, keeping a copy of the whole kernel around for every change isn't
really an option. I'll always use what comes in handy.

BTW: If you're interested in a tool that creates large BIOs, I've
attached a small test program that uses Direct-IO. It doesn't actually
write something useful, just some random memory.

bio-test <device> <sector> [<offset>]

If you use it on top of a striped target with large and odd sector
numbers and offsets you'll end up having all kind of BIOs, not just the
usual page sized ones with only a single bvec.

#define _GNU_SOURCE
#define _FILE_OFFSET_BITS	64

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>

#define SECTOR_SHIFT	9

int main(int argc, char **argv)
{
	int f, r;
	unsigned long size;
	unsigned long bufsize;
	unsigned int pagesize;
	off_t offset;
	char *endptr;
	char *buffer;

	if (argc < 3)
		return 1;

	size = strtol(argv[2], &endptr, 10);
	if (*endptr || !size || size > 4096)
		return 1;
	size <<= SECTOR_SHIFT;
	bufsize = (size + pagesize - 1) & ~(pagesize - 1);

	if (argc >= 4) {
		offset = (off_t)strtoll(argv[3], &endptr, 10);
		if (*endptr)
			return 1;
		offset <<= SECTOR_SHIFT;
	} else
		offset = 0;

	f = open(argv[1], O_WRONLY | O_DIRECT | O_SYNC);
	if (f < 0) {
		perror("fopen");
		return 1;
	}

	if (offset) {
		if (lseek(f, offset, SEEK_SET) != offset) {
			perror("lseek");
			return 1;
		}
	}

	buffer = mmap(NULL, bufsize, PROT_READ | PROT_WRITE,
	              MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
	if (!buffer) {
		perror("mmap");
		close(f);
		return 1;
	}

	r = write(f, buffer, size);

	munmap(buffer, bufsize);
	close(f);

	if (r < 0) {
		perror("write");
		return 1;
	}

	printf("Result: %d\n", r);

	return 0;
}

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]