193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o/*
293d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o * getsectsize.c --- get the sector size of a device.
3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
493d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o * Copyright (C) 1995, 1995 Theodore Ts'o.
593d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o * Copyright (C) 2003 VMware, Inc.
693d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o *
793d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o * %Begin-Header%
8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library
9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2.
1093d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o * %End-Header%
1193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o */
1293d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
1393d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#define _LARGEFILE_SOURCE
1493d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#define _LARGEFILE64_SOURCE
1593d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
1693d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include <stdio.h>
1793d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#if HAVE_UNISTD_H
1893d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include <unistd.h>
1993d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#endif
2093d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#if HAVE_ERRNO_H
2193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include <errno.h>
2293d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#endif
2393d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include <fcntl.h>
2493d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#ifdef HAVE_LINUX_FD_H
2593d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include <sys/ioctl.h>
2693d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include <linux/fd.h>
2793d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#endif
2893d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
29bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#if defined(__linux__) && defined(_IO)
30bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#if !defined(BLKSSZGET)
3193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#define BLKSSZGET  _IO(0x12,104)/* get block device sector size */
3293d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#endif
33bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#if !defined(BLKPBSZGET)
34bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#define BLKPBSZGET _IO(0x12,123)/* get block physical sector size */
35bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#endif
36bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#endif
3793d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
3893d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include "ext2_fs.h"
3993d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#include "ext2fs.h"
4093d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
4193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o/*
42bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o * Returns the logical sector size of a device
4393d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o */
4493d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'oerrcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize)
4593d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o{
4693d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o	int	fd;
4793d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
48e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	fd = ext2fs_open_file(file, O_RDONLY, 0);
4993d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o	if (fd < 0)
5093d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o		return errno;
5193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
5293d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#ifdef BLKSSZGET
5393d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o	if (ioctl(fd, BLKSSZGET, sectsize) >= 0) {
5493d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o		close(fd);
5593d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o		return 0;
5693d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o	}
5793d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o#endif
5893d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o	*sectsize = 0;
5993d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o	close(fd);
6093d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o	return 0;
6193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o}
62bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o
63bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o/*
64e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * Return desired alignment for direct I/O
65e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */
66e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallint ext2fs_get_dio_alignment(int fd)
67e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall{
68e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	int align = 0;
69e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
70e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef BLKSSZGET
71e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (ioctl(fd, BLKSSZGET, &align) < 0)
72e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		align = 0;
73e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
74e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
75e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef _SC_PAGESIZE
76e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (align <= 0)
77e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		align = sysconf(_SC_PAGESIZE);
78e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
79e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#ifdef HAVE_GETPAGESIZE
80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (align <= 0)
81e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		align = getpagesize();
82e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#endif
83e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	if (align <= 0)
84e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall		align = 4096;
85e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	return align;
87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall}
88e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
89e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/*
90bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o * Returns the physical sector size of a device
91bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o */
92bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'oerrcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize)
93bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o{
94bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o	int	fd;
95bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o
96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	fd = ext2fs_open_file(file, O_RDONLY, 0);
97bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o	if (fd < 0)
98bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o		return errno;
99bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o
100bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#ifdef BLKPBSZGET
101bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o	if (ioctl(fd, BLKPBSZGET, sectsize) >= 0) {
102bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o		close(fd);
103bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o		return 0;
104bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o	}
105bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o#endif
106bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o	*sectsize = 0;
107bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o	close(fd);
108bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o	return 0;
109bb1158b92ed8a12ab9e9317ca6ddd97bc12447d3Theodore Ts'o}
110