Line data Source code
1 : #include "clusterautoconfig.h"
2 :
3 : #include <stdio.h>
4 : #include <stdlib.h>
5 : #include <string.h>
6 : #include <stdint.h>
7 : #include <inttypes.h>
8 : #include <sys/types.h>
9 : #include <sys/stat.h>
10 : #include <fcntl.h>
11 : #include <unistd.h>
12 : #include <errno.h>
13 : #include <sys/ioctl.h>
14 : #include <sys/mount.h>
15 :
16 : #include "libgfs2.h"
17 :
18 : #ifndef BLKROGET
19 : #define BLKROGET _IO(0x12, 94) /* ro */
20 : #endif
21 : #ifndef BLKRAGET
22 : #define BLKRAGET _IO(0x12, 99) /* ra_pages */
23 : #endif
24 : #ifndef BLKSSZGET
25 : #define BLKSSZGET _IO(0x12,104) /* logical_block_size */
26 : #endif
27 : #ifndef BLKBSZGET
28 : #define BLKBSZGET _IOR(0x12, 112, size_t) /* soft_block_size */
29 : #endif
30 : #ifndef BLKIOMIN
31 : #define BLKIOMIN _IO(0x12,120) /* minimum_io_size */
32 : #endif
33 : #ifndef BLKIOOPT
34 : #define BLKIOOPT _IO(0x12,121) /* optimal_io_size */
35 : #endif
36 : #ifndef BLKALIGNOFF
37 : #define BLKALIGNOFF _IO(0x12,122) /* alignment_offset */
38 : #endif
39 : #ifndef BLKPBSZGET
40 : #define BLKPBSZGET _IO(0x12,123) /* physical_block_size */
41 : #endif
42 :
43 4530 : int lgfs2_get_dev_info(int fd, struct lgfs2_dev_info *i)
44 : {
45 : int ret;
46 4530 : int ro = 0;
47 : off_t off;
48 :
49 4530 : memset(i, 0, sizeof(*i));
50 :
51 4530 : ret = fstat(fd, &i->stat);
52 4530 : if (ret < 0)
53 0 : return ret;
54 :
55 4530 : switch (i->stat.st_mode & S_IFMT) {
56 4530 : case S_IFREG:
57 4530 : i->size = i->stat.st_size;
58 4530 : ret = fcntl(fd, F_GETFL, 0);
59 4530 : if ((ret & O_ACCMODE) == O_RDONLY)
60 42 : i->readonly = 1;
61 4530 : i->io_optimal_size = i->stat.st_blksize;
62 4530 : goto size_check;
63 0 : case S_IFBLK:
64 0 : break;
65 0 : default:
66 0 : errno = ENOTBLK;
67 0 : return -1;
68 : }
69 :
70 0 : ioctl(fd, BLKRAGET, &i->ra_pages);
71 0 : ioctl(fd, BLKBSZGET, &i->soft_block_size);
72 0 : ioctl(fd, BLKSSZGET, &i->logical_block_size);
73 0 : ioctl(fd, BLKIOMIN, &i->io_min_size);
74 0 : ioctl(fd, BLKIOOPT, &i->io_optimal_size);
75 0 : ioctl(fd, BLKPBSZGET, &i->physical_block_size);
76 0 : ioctl(fd, BLKALIGNOFF, &i->io_align_offset);
77 0 : ioctl(fd, BLKROGET, &ro);
78 0 : if (ro)
79 0 : i->readonly = 1;
80 0 : off = lseek(fd, 0, SEEK_END);
81 0 : if (off < 0)
82 0 : return -1;
83 0 : i->size = off;
84 :
85 4530 : size_check:
86 4530 : if (i->size < (1 << 20)) {
87 0 : errno = ENOSPC;
88 0 : return -1;
89 : }
90 :
91 4530 : return 0;
92 : }
93 :
94 : /**
95 : * fix_device_geometry - round off address and lengths and convert to FS blocks
96 : * @sdp: The super block
97 : *
98 : */
99 :
100 4475 : void lgfs2_fix_device_geometry(struct lgfs2_sbd *sdp)
101 : {
102 4475 : struct lgfs2_device *device = &sdp->device;
103 :
104 4475 : device->length = sdp->dinfo.size / sdp->sd_bsize;
105 4475 : }
|