summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMing Lei2015-11-17 15:32:48 +0100
committerKarel Zak2015-11-19 11:27:36 +0100
commitfaeef4d2e9d5e38bed57846ba903009990f24422 (patch)
treeedeabbde252963bc44bc4e1e18eeccd76159fc6a
parentlosetup: support ioctl cmd of LOOP_SET_DIRECT_IO (diff)
downloadkernel-qcow2-util-linux-faeef4d2e9d5e38bed57846ba903009990f24422.tar.gz
kernel-qcow2-util-linux-faeef4d2e9d5e38bed57846ba903009990f24422.tar.xz
kernel-qcow2-util-linux-faeef4d2e9d5e38bed57846ba903009990f24422.zip
losetup: support list direct io
So that user can see if DIO is set for current loop device. Signed-off-by: Ming Lei <tom.leiming@gmail.com>
-rw-r--r--include/loopdev.h2
-rw-r--r--lib/loopdev.c22
-rw-r--r--sys-utils/losetup.c6
3 files changed, 30 insertions, 0 deletions
diff --git a/include/loopdev.h b/include/loopdev.h
index 9a7f6ba69..18ca41fe8 100644
--- a/include/loopdev.h
+++ b/include/loopdev.h
@@ -40,6 +40,7 @@ enum {
LO_FLAGS_USE_AOPS = 2,
LO_FLAGS_AUTOCLEAR = 4, /* kernel >= 2.6.25 */
LO_FLAGS_PARTSCAN = 8, /* kernel >= 3.2 */
+ LO_FLAGS_DIRECT_IO = 16, /* kernel >= 4.2 */
};
#define LO_NAME_SIZE 64
@@ -181,6 +182,7 @@ extern int loopcxt_get_encrypt_type(struct loopdev_cxt *lc, uint32_t *type);
extern const char *loopcxt_get_crypt_name(struct loopdev_cxt *lc);
extern int loopcxt_is_autoclear(struct loopdev_cxt *lc);
extern int loopcxt_is_readonly(struct loopdev_cxt *lc);
+extern int loopcxt_is_dio(struct loopdev_cxt *lc);
extern int loopcxt_is_partscan(struct loopdev_cxt *lc);
extern int loopcxt_find_by_backing_file(struct loopdev_cxt *lc,
const char *filename,
diff --git a/lib/loopdev.c b/lib/loopdev.c
index ff99dd444..54c620048 100644
--- a/lib/loopdev.c
+++ b/lib/loopdev.c
@@ -955,6 +955,28 @@ int loopcxt_is_readonly(struct loopdev_cxt *lc)
/*
* @lc: context
+ *
+ * Returns: 1 if the dio flags is set.
+ */
+int loopcxt_is_dio(struct loopdev_cxt *lc)
+{
+ struct sysfs_cxt *sysfs = loopcxt_get_sysfs(lc);
+
+ if (sysfs) {
+ int fl;
+ if (sysfs_read_int(sysfs, "loop/dio", &fl) == 0)
+ return fl;
+ }
+ if (loopcxt_ioctl_enabled(lc)) {
+ struct loop_info64 *lo = loopcxt_get_info(lc);
+ if (lo)
+ return lo->lo_flags & LO_FLAGS_DIRECT_IO;
+ }
+ return 0;
+}
+
+/*
+ * @lc: context
* @st: backing file stat or NULL
* @backing_file: filename
* @offset: offset
diff --git a/sys-utils/losetup.c b/sys-utils/losetup.c
index 68f777798..918c34da6 100644
--- a/sys-utils/losetup.c
+++ b/sys-utils/losetup.c
@@ -49,6 +49,7 @@ enum {
COL_PARTSCAN,
COL_RO,
COL_SIZELIMIT,
+ COL_DIO,
};
/* basic output flags */
@@ -74,6 +75,7 @@ static struct colinfo infos[] = {
[COL_RO] = { "RO", 1, SCOLS_FL_RIGHT, N_("read-only device")},
[COL_SIZELIMIT] = { "SIZELIMIT", 5, SCOLS_FL_RIGHT, N_("size limit of the file in bytes")},
[COL_MAJMIN] = { "MAJ:MIN", 3, 0, N_("loop device major:minor number")},
+ [COL_DIO] = { "DIO", 1, SCOLS_FL_RIGHT, N_("access backing file with direct-io")},
};
static int columns[ARRAY_SIZE(infos) * 2] = {-1};
@@ -271,6 +273,9 @@ static int set_scols_data(struct loopdev_cxt *lc, struct libscols_line *ln)
case COL_RO:
p = loopcxt_is_readonly(lc) ? "1" : "0";
break;
+ case COL_DIO:
+ p = loopcxt_is_dio(lc) ? "1" : "0";
+ break;
case COL_PARTSCAN:
p = loopcxt_is_partscan(lc) ? "1" : "0";
break;
@@ -599,6 +604,7 @@ int main(int argc, char **argv)
columns[ncolumns++] = COL_AUTOCLR;
columns[ncolumns++] = COL_RO;
columns[ncolumns++] = COL_BACK_FILE;
+ columns[ncolumns++] = COL_DIO;
}
if (act == A_FIND_FREE && optind < argc) {