--- util-linux/blkid.c
+++ util-linux/blkid.c
@@ -28,24 +28,46 @@
 //kbuild:lib-$(CONFIG_BLKID) += blkid.o
 
 //usage:#define blkid_trivial_usage
-//usage:       "[BLOCKDEV]..."
+//usage:       "[-O offset] [BLOCKDEV]..."
 //usage:#define blkid_full_usage "\n\n"
-//usage:       "Print UUIDs of all filesystems"
+//usage:       "Print UUIDs of given/all filesystems"
+//usage:     "\n	-O	Probe at the given offset"
 
 #include "libbb.h"
 #include "volume_id.h"
 
 int blkid_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int blkid_main(int argc UNUSED_PARAM, char **argv)
+int blkid_main(int argc, char **argv)
 {
+	unsigned long long offset = 0;
+	unsigned opt;
+	char *opt_O;
+	enum {
+		OPT_O = (1 << 0)
+	};
+
 	int part_found = 0;
 	int scan_devices = 1;
 
-	while (*++argv) {
+	opt_complementary = "O--O"; // -O is allowed to occur at most once
+	opt = getopt32(argv, "O:", &opt_O);
+	argc -= optind;
+	argv += optind;
+
+	if (opt & OPT_O) {
+		offset = xatoull(opt_O);
+		if (argc == 0) {
+			bb_error_msg_and_die("-O requires at least one BLOCKDEV to be provided");
+			return 1;
+		}
+	}
+
+	while (*argv) {
 		/* Note: bogus device names don't cause any error messages */
-		if (add_to_uuid_cache(*argv))
+		if (add_to_uuid_cache(*argv, (uint64_t)offset))
 			part_found = 1; // at least data for one partition found
 		scan_devices = 0;
+		++argv;
 	}
 
 	// show all partitions only, if blkid called without arguments or if uuidCache not empty
--- include/volume_id.h
+++ include/volume_id.h
@@ -28,4 +28,4 @@
  *    *fsname is replaced if device with such UUID or LABEL is found
  */
 int resolve_mount_spec(char **fsname);
-int add_to_uuid_cache(const char *device);
+int add_to_uuid_cache(const char *device, uint64_t off);
--- util-linux/volume_id/volume_id_internal.h
+++ util-linux/volume_id/volume_id_internal.h
@@ -86,7 +86,7 @@
 };
 
 struct volume_id* FAST_FUNC volume_id_open_node(int fd);
-int FAST_FUNC volume_id_probe_all(struct volume_id *id, /*uint64_t off,*/ uint64_t size);
+int FAST_FUNC volume_id_probe_all(struct volume_id *id, uint64_t off, uint64_t size);
 void FAST_FUNC free_volume_id(struct volume_id *id);
 
 /* util.h */
@@ -152,7 +152,7 @@
 
 //int FAST_FUNC volume_id_probe_intel_software_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size);
 
-int FAST_FUNC volume_id_probe_linux_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size);
+int FAST_FUNC volume_id_probe_linux_raid(struct volume_id *id, uint64_t off, uint64_t size);
 
 //int FAST_FUNC volume_id_probe_lsi_mega_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size);
 
@@ -169,27 +169,27 @@
 
 /* FS */
 
-int FAST_FUNC volume_id_probe_bcache(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_bcache(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_btrfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_btrfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_cramfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_cramfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_ext(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_ext(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_vfat(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_vfat(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off);
 
 //int FAST_FUNC volume_id_probe_hpfs(struct volume_id *id /*,uint64_t off*/);
 
-int FAST_FUNC volume_id_probe_iso9660(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_iso9660(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_jfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_luks(struct volume_id *id, uint64_t off);
 
 //int FAST_FUNC volume_id_probe_mac_partition_map(struct volume_id *id /*,uint64_t off*/);
 
@@ -197,30 +197,30 @@
 
 //int FAST_FUNC volume_id_probe_msdos_part_table(struct volume_id *id /*,uint64_t off*/);
 
-int FAST_FUNC volume_id_probe_f2fs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_f2fs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_nilfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_nilfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_ntfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_ntfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_exfat(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_exfat(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_ocfs2(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_ocfs2(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_reiserfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_reiserfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_romfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_romfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_squashfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_squashfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_sysv(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_udf(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_udf(struct volume_id *id, uint64_t off);
 
 //int FAST_FUNC volume_id_probe_ufs(struct volume_id *id /*,uint64_t off*/);
 
-int FAST_FUNC volume_id_probe_xfs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_xfs(struct volume_id *id, uint64_t off);
 
-int FAST_FUNC volume_id_probe_ubifs(struct volume_id *id /*,uint64_t off*/);
+int FAST_FUNC volume_id_probe_ubifs(struct volume_id *id, uint64_t off);
 
 POP_SAVED_FUNCTION_VISIBILITY
--- util-linux/volume_id/volume_id.c
+++ util-linux/volume_id/volume_id.c
@@ -47,8 +47,8 @@
 #define ENABLE_FEATURE_VOLUMEID_UFS           0
 
 
-typedef int FAST_FUNC (*raid_probe_fptr)(struct volume_id *id, /*uint64_t off,*/ uint64_t size);
-typedef int FAST_FUNC (*probe_fptr)(struct volume_id *id /*, uint64_t off*/);
+typedef int FAST_FUNC (*raid_probe_fptr)(struct volume_id *id, uint64_t off, uint64_t size);
+typedef int FAST_FUNC (*probe_fptr)(struct volume_id *id, uint64_t off);
 
 static const raid_probe_fptr raid1[] = {
 #if ENABLE_FEATURE_VOLUMEID_LINUXRAID
@@ -173,14 +173,14 @@
 #endif
 };
 
-int FAST_FUNC volume_id_probe_all(struct volume_id *id, /*uint64_t off,*/ uint64_t size)
+int FAST_FUNC volume_id_probe_all(struct volume_id *id, uint64_t off, uint64_t size)
 {
 	unsigned i;
 
 	/* probe for raid first, cause fs probes may be successful on raid members */
 	if (size) {
 		for (i = 0; i < ARRAY_SIZE(raid1); i++) {
-			if (raid1[i](id, /*off,*/ size) == 0)
+			if (raid1[i](id, off, size) == 0)
 				goto ret;
 			if (id->error)
 				goto ret;
@@ -188,7 +188,7 @@
 	}
 
 	for (i = 0; i < ARRAY_SIZE(raid2); i++) {
-		if (raid2[i](id /*,off*/) == 0)
+		if (raid2[i](id, off) == 0)
 			goto ret;
 		if (id->error)
 			goto ret;
@@ -196,7 +196,7 @@
 
 	/* signature in the first block, only small buffer needed */
 	for (i = 0; i < ARRAY_SIZE(fs1); i++) {
-		if (fs1[i](id /*,off*/) == 0)
+		if (fs1[i](id, off) == 0)
 			goto ret;
 		if (id->error)
 			goto ret;
@@ -206,7 +206,7 @@
 	volume_id_get_buffer(id, 0, SB_BUFFER_SIZE);
 
 	for (i = 0; i < ARRAY_SIZE(fs2); i++) {
-		if (fs2[i](id /*,off*/) == 0)
+		if (fs2[i](id, off) == 0)
 			goto ret;
 		if (id->error)
 			goto ret;
--- util-linux/volume_id/get_devname.c
+++ util-linux/volume_id/get_devname.c
@@ -25,13 +25,14 @@
 	char *label;
 	char *uc_uuid; /* prefix makes it easier to grep for */
 	IF_FEATURE_BLKID_TYPE(const char *type;)
+	uint64_t off;
 } *uuidCache;
 
 #if !ENABLE_FEATURE_BLKID_TYPE
-#define get_label_uuid(fd, label, uuid, type) \
-	get_label_uuid(fd, label, uuid)
-#define uuidcache_addentry(device, label, uuid, type) \
-	uuidcache_addentry(device, label, uuid)
+#define get_label_uuid(fd, label, uuid, type, off) \
+	get_label_uuid(fd, label, uuid, off)
+#define uuidcache_addentry(device, label, uuid, type, off) \
+	uuidcache_addentry(device, label, uuid, off)
 #endif
 
 /* Returns !0 on error.
@@ -39,7 +40,7 @@
  * (and they can't be NULL, although they can be "").
  * NB: closes fd. */
 static int
-get_label_uuid(int fd, char **label, char **uuid, const char **type)
+get_label_uuid(int fd, char **label, char **uuid, const char **type, uint64_t off)
 {
 	int rv = 1;
 	uint64_t size;
@@ -51,7 +52,7 @@
 	if (ioctl(/*vid->*/fd, BLKGETSIZE64, &size) != 0)
 		size = 0;
 
-	if (volume_id_probe_all(vid, /*0,*/ size) != 0)
+	if (volume_id_probe_all(vid, off, size) != 0)
 		goto ret;
 
 	if (vid->label[0] != '\0' || vid->uuid[0] != '\0'
@@ -76,7 +77,7 @@
 
 /* NB: we take ownership of (malloc'ed) label and uuid */
 static void
-uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uuid, const char *type)
+uuidcache_addentry(char *device, /*int major, int minor,*/ char *label, char *uuid, const char *type, uint64_t off)
 {
 	struct uuidCache_s *last;
 
@@ -95,6 +96,7 @@
 	last->label = label;
 	last->uc_uuid = uuid;
 	IF_FEATURE_BLKID_TYPE(last->type = type;)
+	last->off = off;
 }
 
 /* If get_label_uuid() on device_name returns success,
@@ -122,7 +124,7 @@
 	if (major(statbuf->st_rdev) == 2)
 		return TRUE;
 
-	add_to_uuid_cache(device);
+	add_to_uuid_cache(device, (uint64_t)0);
 
 	return TRUE;
 }
@@ -234,7 +236,10 @@
 
 	uc = uuidcache_init(scan_devices);
 	while (uc) {
-		printf("%s:", uc->device);
+		if (uc->off != 0)
+			printf("%s@%llu:", uc->device, uc->off);
+		else
+			printf("%s:", uc->device);
 		if (uc->label[0])
 			printf(" LABEL=\"%s\"", uc->label);
 		if (uc->uc_uuid[0])
@@ -248,7 +253,7 @@
 	}
 }
 
-int add_to_uuid_cache(const char *device)
+int add_to_uuid_cache(const char *device, uint64_t off)
 {
 	char *uuid = uuid; /* for compiler */
 	char *label = label;
@@ -262,9 +267,9 @@
 		return 0;
 
 	/* get_label_uuid() closes fd in all cases (success & failure) */
-	if (get_label_uuid(fd, &label, &uuid, &type) == 0) {
+	if (get_label_uuid(fd, &label, &uuid, &type, off) == 0) {
 		/* uuidcache_addentry() takes ownership of all four params */
-		uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, uuid, type);
+		uuidcache_addentry(xstrdup(device), /*ma, mi,*/ label, uuid, type, off);
 		return 1;
 	}
 	return 0;
--- util-linux/volume_id/bcache.c
+++ util-linux/volume_id/bcache.c
@@ -87,11 +87,11 @@
 /* magic string offset within super block */
 #define BCACHE_SB_MAGIC_OFF offsetof (struct bcache_super_block, magic)
 
-int FAST_FUNC volume_id_probe_bcache(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_bcache(struct volume_id *id, uint64_t off)
 {
 	struct bcache_super_block *sb;
 
-	sb = volume_id_get_buffer(id, BCACHE_SB_OFF, sizeof(*sb));
+	sb = volume_id_get_buffer(id, off + BCACHE_SB_OFF, sizeof(*sb));
 	if (sb == NULL)
 		return -1;
 
--- util-linux/volume_id/btrfs.c
+++ util-linux/volume_id/btrfs.c
@@ -85,20 +85,20 @@
 	// ...
 } PACKED;
 
-int FAST_FUNC volume_id_probe_btrfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_btrfs(struct volume_id *id, uint64_t _off)
 {
 	// btrfs has superblocks at 64K, 64M and 256G
 	// minimum btrfs size is 256M
 	// so we never step out the device if we analyze
 	// the first and the second superblocks
 	struct btrfs_super_block *sb;
-	unsigned off = 64;
+	uint64_t off = 64;
 
 	while (off < 64*1024*1024) {
 		off *= 1024;
-		dbg("btrfs: probing at offset 0x%x", off);
+		dbg("btrfs: probing at offset 0x%x", _off + off);
 
-		sb = volume_id_get_buffer(id, off, sizeof(*sb));
+		sb = volume_id_get_buffer(id, _off + off, sizeof(*sb));
 		if (sb == NULL)
 			return -1;
 
--- util-linux/volume_id/cramfs.c
+++ util-linux/volume_id/cramfs.c
@@ -42,9 +42,8 @@
 	uint8_t		name[16];
 } PACKED;
 
-int FAST_FUNC volume_id_probe_cramfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_cramfs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct cramfs_super *cs;
 
 	dbg("probing at offset 0x%llx", (unsigned long long) off);
--- util-linux/volume_id/exfat.c
+++ util-linux/volume_id/exfat.c
@@ -73,7 +73,7 @@
 		} PACKED type;
 } PACKED;
 
-int FAST_FUNC volume_id_probe_exfat(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_exfat(struct volume_id *id, uint64_t off)
 {
 	struct exfat_super_block *sb;
 	struct exfat_dir_entry *de;
@@ -84,8 +84,8 @@
 	unsigned	need_lbl_guid;
 
 	// Primary super block
-	dbg("exFAT: probing at offset 0x%x", EXFAT_SB_OFFSET);
-	sb = volume_id_get_buffer(id, EXFAT_SB_OFFSET, sizeof(*sb));
+	dbg("exFAT: probing at offset 0x%x", off + EXFAT_SB_OFFSET);
+	sb = volume_id_get_buffer(id, off + EXFAT_SB_OFFSET, sizeof(*sb));
 
 	if (!sb)
 		return -1;
@@ -96,7 +96,7 @@
 	sector_sz = 1 << sb->bytes_per_sector;
 	cluster_sz = sector_sz << sb->sectors_per_cluster;
 	// There are no clusters 0 and 1, so the first cluster is 2.
-	root_dir_off = (uint64_t)EXFAT_SB_OFFSET +
+	root_dir_off = off + EXFAT_SB_OFFSET +
 		// Hmm... should we cast sector_sz/cluster_sz to uint64_t?
 		(le32_to_cpu(sb->cluster_heap_offset)) * sector_sz +
 		(le32_to_cpu(sb->root_dir) - 2) * cluster_sz;
--- util-linux/volume_id/ext.c
+++ util-linux/volume_id/ext.c
@@ -30,9 +30,8 @@
 
 #define EXT_SUPERBLOCK_OFFSET			0x400
 
-int FAST_FUNC volume_id_probe_ext(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_ext(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct ext2_super_block *es;
 
 	dbg("ext: probing at offset 0x%llx", (unsigned long long) off);
--- util-linux/volume_id/f2fs.c
+++ util-linux/volume_id/f2fs.c
@@ -64,13 +64,13 @@
 } PACKED;
 
 
-int FAST_FUNC volume_id_probe_f2fs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_f2fs(struct volume_id *id, uint64_t off)
 {
 	struct f2fs_super_block *sb;
 
 	// Go for primary super block (ignore second sb)
-	dbg("f2fs: probing at offset 0x%x", F2FS_SB1_OFFSET);
-	sb = volume_id_get_buffer(id, F2FS_SB1_OFFSET, sizeof(*sb));
+	dbg("f2fs: probing at offset 0x%x", off + F2FS_SB1_OFFSET);
+	sb = volume_id_get_buffer(id, off + F2FS_SB1_OFFSET, sizeof(*sb));
 
 	if (!sb)
 		return -1;
--- util-linux/volume_id/fat.c
+++ util-linux/volume_id/fat.c
@@ -126,9 +126,8 @@
 	return NULL;
 }
 
-int FAST_FUNC volume_id_probe_vfat(struct volume_id *id /*,uint64_t fat_partition_off*/)
+int FAST_FUNC volume_id_probe_vfat(struct volume_id *id, uint64_t fat_partition_off)
 {
-#define fat_partition_off ((uint64_t)0)
 	struct vfat_super_block *vs;
 	struct vfat_dir_entry *dir;
 	uint16_t sector_size_bytes;
--- util-linux/volume_id/hfs.c
+++ util-linux/volume_id/hfs.c
@@ -159,9 +159,8 @@
 	volume_id_set_uuid(id, uuid, UUID_DCE);
 }
 
-int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_hfs_hfsplus(struct volume_id *id, uint64_t off)
 {
-	uint64_t off = 0;
 	unsigned blocksize;
 	unsigned cat_block;
 	unsigned ext_block_start;
--- util-linux/volume_id/iso9660.c
+++ util-linux/volume_id/iso9660.c
@@ -54,9 +54,8 @@
 	uint8_t		version;
 } PACKED;
 
-int FAST_FUNC volume_id_probe_iso9660(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_iso9660(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	uint8_t *buf;
 	struct iso_volume_descriptor *is;
 	struct high_sierra_volume_descriptor *hs;
--- util-linux/volume_id/jfs.c
+++ util-linux/volume_id/jfs.c
@@ -42,9 +42,8 @@
 
 #define JFS_SUPERBLOCK_OFFSET			0x8000
 
-int FAST_FUNC volume_id_probe_jfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_jfs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct jfs_super_block *js;
 
 	dbg("probing at offset 0x%llx", (unsigned long long) off);
--- util-linux/volume_id/linux_raid.c
+++ util-linux/volume_id/linux_raid.c
@@ -49,10 +49,9 @@
 #define MD_RESERVED_BYTES		0x10000
 #define MD_MAGIC			0xa92b4efc
 
-int FAST_FUNC volume_id_probe_linux_raid(struct volume_id *id /*,uint64_t off*/, uint64_t size)
+int FAST_FUNC volume_id_probe_linux_raid(struct volume_id *id, uint64_t off, uint64_t size)
 {
 	typedef uint32_t aliased_uint32_t FIX_ALIASING;
-#define off ((uint64_t)0)
 	uint64_t sboff;
 	uint8_t uuid[16];
 	struct mdp_super_block *mdp;
--- util-linux/volume_id/linux_swap.c
+++ util-linux/volume_id/linux_swap.c
@@ -38,9 +38,8 @@
 
 #define LARGEST_PAGESIZE			0x4000
 
-int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_linux_swap(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct swap_header_v1_2 *sw;
 	const uint8_t *buf;
 	unsigned page;
--- util-linux/volume_id/luks.c
+++ util-linux/volume_id/luks.c
@@ -87,9 +87,8 @@
 		1 : -1];
 };
 
-int FAST_FUNC volume_id_probe_luks(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_luks(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct luks_phdr *header;
 
 	header = volume_id_get_buffer(id, off, sizeof(*header));
--- util-linux/volume_id/nilfs.c
+++ util-linux/volume_id/nilfs.c
@@ -85,14 +85,14 @@
 /* 0xF8 */	// ...
 } PACKED;
 
-int FAST_FUNC volume_id_probe_nilfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_nilfs(struct volume_id *id, uint64_t off)
 {
 	struct nilfs2_super_block *sb;
 
 	// Primary super block
-	dbg("nilfs: probing at offset 0x%x", NILFS_SB1_OFFSET);
+	dbg("nilfs: probing at offset 0x%x", off + NILFS_SB1_OFFSET);
 
-	sb = volume_id_get_buffer(id, NILFS_SB1_OFFSET, sizeof(*sb));
+	sb = volume_id_get_buffer(id, off + NILFS_SB1_OFFSET, sizeof(*sb));
 
 	if (sb == NULL)
 		return -1;
--- util-linux/volume_id/ntfs.c
+++ util-linux/volume_id/ntfs.c
@@ -91,9 +91,8 @@
 #define MFT_RECORD_ATTR_OBJECT_ID		0x40
 #define MFT_RECORD_ATTR_END			0xffffffffu
 
-int FAST_FUNC volume_id_probe_ntfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_ntfs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	unsigned sector_size;
 	unsigned cluster_size;
 	uint64_t mft_cluster;
--- util-linux/volume_id/ocfs2.c
+++ util-linux/volume_id/ocfs2.c
@@ -87,9 +87,8 @@
 	uint8_t		s_uuid[OCFS2_VOL_UUID_LEN];	/* 128-bit uuid */
 } PACKED;
 
-int FAST_FUNC volume_id_probe_ocfs2(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_ocfs2(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct ocfs2_super_block *os;
 
 	dbg("probing at offset 0x%llx", (unsigned long long) off);
--- util-linux/volume_id/reiserfs.c
+++ util-linux/volume_id/reiserfs.c
@@ -55,9 +55,8 @@
 #define REISERFS1_SUPERBLOCK_OFFSET		0x2000
 #define REISERFS_SUPERBLOCK_OFFSET		0x10000
 
-int FAST_FUNC volume_id_probe_reiserfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_reiserfs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct reiserfs_super_block *rs;
 	struct reiser4_super_block *rs4;
 
--- util-linux/volume_id/romfs.c
+++ util-linux/volume_id/romfs.c
@@ -34,9 +34,8 @@
 	uint8_t name[];
 } PACKED;
 
-int FAST_FUNC volume_id_probe_romfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_romfs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct romfs_super *rfs;
 
 	dbg("probing at offset 0x%llx", (unsigned long long) off);
--- util-linux/volume_id/squashfs.c
+++ util-linux/volume_id/squashfs.c
@@ -29,9 +29,8 @@
 */
 } PACKED;
 
-int FAST_FUNC volume_id_probe_squashfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_squashfs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct squashfs_superblock *sb;
 
 	dbg("SquashFS: probing at offset 0x%llx", (unsigned long long) off);
--- util-linux/volume_id/sysv.c
+++ util-linux/volume_id/sysv.c
@@ -89,9 +89,8 @@
 #define XENIX_MAGIC				0x2b5544
 #define SYSV_MAX_BLOCKSIZE			0x800
 
-int FAST_FUNC volume_id_probe_sysv(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_sysv(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct sysv_super *vs;
 	struct xenix_super *xs;
 	unsigned boff;
--- util-linux/volume_id/ubifs.c
+++ util-linux/volume_id/ubifs.c
@@ -103,9 +103,8 @@
 */
 } PACKED;
 
-int FAST_FUNC volume_id_probe_ubifs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_ubifs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct ubifs_sb_node *sb;
 
 	dbg("UBIFS: probing at offset 0x%llx", (unsigned long long) off);
--- util-linux/volume_id/udf.c
+++ util-linux/volume_id/udf.c
@@ -62,9 +62,8 @@
 
 #define UDF_VSD_OFFSET			0x8000
 
-int FAST_FUNC volume_id_probe_udf(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_udf(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct volume_descriptor *vd;
 	struct volume_structure_descriptor *vsd;
 	unsigned bs;
--- util-linux/volume_id/xfs.c
+++ util-linux/volume_id/xfs.c
@@ -42,9 +42,8 @@
 	uint64_t	fdblocks;
 } PACKED;
 
-int FAST_FUNC volume_id_probe_xfs(struct volume_id *id /*,uint64_t off*/)
+int FAST_FUNC volume_id_probe_xfs(struct volume_id *id, uint64_t off)
 {
-#define off ((uint64_t)0)
 	struct xfs_super_block *xs;
 
 	dbg("probing at offset 0x%llx", (unsigned long long) off);
