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