From 4143c3bdec2a87319a6c9dee4a589cd41e85dad3 Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Fri, 14 Jan 2022 10:58:59 -0600 Subject: [PATCH] LU-15452 utils: support lctl getattr for osc In lctl:jt_obd_getattr(), support FIDs in addition to OIDs and print whatever valid attributes were returned. Add a supporting OBD_IOC_GETATTR case to osc_iocontrol(). # function lctl_osc_device() { # Find osc device name for file and index. # lctl_osc_device /mnt/lustre/... 42 => lustre-OST002a-osc-ffff89cca1555000 local path="$1" local index="$2" local fsname=$(lfs getname --fsname "$path") local instance=$(lfs getname --instance "$path") printf '%s-OST%04x-osc-%sn' "$fsname" "$index" "$instance" } # lfs getstripe /mnt/lustre/f0 | grep l_ost_idx - 0: { l_ost_idx: 1, l_fid: [0x100010000:0x2:0x0] } - 1: { l_ost_idx: 2, l_fid: [0x100020000:0x2:0x0] } - 0: { l_ost_idx: 3, l_fid: [0x100030000:0x2:0x0] } - 1: { l_ost_idx: 0, l_fid: [0x100000000:0x2:0x0] } # lctl --device $(lctl_osc_device /mnt/lustre 1) getattr '[0x100010000:0x2:0x0]' valid: 0x110000001008fff oi.oi.oi_id: 0x100020000 oi.oi.oi_seq: 0x2 oi.oi_fid: [0x100020000:0x2:0x0] atime: 0 mtime: 1642178551 ctime: 1642178551 size: 0 blocks: 0 blksize: 4194304 mode: 0107666 uid: 0 gid: 0 flags: 2097152 layout_version: 3 projid: 0 data_version: 4294967298 Signed-off-by: John L. Hammond Change-Id: I57d5778e9ac39030ae9477a0979f20b7f7460fc8 Reviewed-on: https://review.whamcloud.com/46131 Tested-by: jenkins Reviewed-by: Alex Zhuravlev Reviewed-by: Bobi Jam Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/osc/osc_request.c | 3 ++ lustre/utils/obd.c | 96 ++++++++++++++++++++++++++++++++++++------------ 2 files changed, 75 insertions(+), 24 deletions(-) diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c index f426f8a..889f72a 100644 --- a/lustre/osc/osc_request.c +++ b/lustre/osc/osc_request.c @@ -3193,6 +3193,9 @@ static int osc_iocontrol(unsigned int cmd, struct obd_export *exp, int len, if (rc > 0) rc = 0; break; + case OBD_IOC_GETATTR: + rc = obd_getattr(NULL, exp, &data->ioc_obdo1); + break; case IOC_OSC_SET_ACTIVE: rc = ptlrpc_set_import_active(obd->u.cli.cl_import, data->ioc_offset); diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index b7a1c23..c43a7cc 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -1876,39 +1876,48 @@ int jt_obd_destroy(int argc, char **argv) return rc; } +static int jt_str_to_ost_id(const char *str, struct ost_id *oi) +{ + __u64 oid; + char *end; + + oid = strtoull(str, &end, 0); + if (*end == '\0') { + /* If str is a single number then assume old echo + * client usage. */ + if (oid >= OBIF_MAX_OID) + return -EINVAL; + + ostid_set_seq_echo(oi); + oi->oi_fid.f_oid = oid; + return 0; + } + + return llapi_fid_parse(str, &oi->oi_fid, NULL); +} + int jt_obd_getattr(int argc, char **argv) { struct obd_ioctl_data data; + struct obdo *oa; char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf; - __u64 objid; - char *end; int rc; if (argc != 2) return CMD_HELP; - objid = strtoull(argv[1], &end, 0); - if (*end) { - fprintf(stderr, "error: %s: objid '%s' is not a number\n", - jt_cmdname(argv[0]), argv[1]); - return CMD_HELP; - } + memset(&data, 0, sizeof(data)); + data.ioc_dev = cur_device; + oa = &data.ioc_obdo1; - if (objid >= OBIF_MAX_OID) { - fprintf(stderr, "error: %s: invalid objid '%s'\n", + rc = jt_str_to_ost_id(argv[1], &oa->o_oi); + if (rc < 0) { + fprintf(stderr, "error: %s: invalid objid of FID '%s'\n", jt_cmdname(argv[0]), argv[1]); return CMD_HELP; } - memset(&data, 0, sizeof(data)); - data.ioc_dev = cur_device; - ostid_set_seq_echo(&data.ioc_obdo1.o_oi); - data.ioc_obdo1.o_oi.oi_fid.f_oid = objid; - /* to help obd filter */ - data.ioc_obdo1.o_mode = 0100644; - data.ioc_obdo1.o_valid = 0xffffffff; - printf("%s: object id %#jx\n", jt_cmdname(argv[0]), - (uintmax_t)ostid_id(&data.ioc_obdo1.o_oi)); + oa->o_valid = OBD_MD_FLID | OBD_MD_FLGROUP; memset(buf, 0, sizeof(rawbuf)); rc = llapi_ioctl_pack(&data, &buf, sizeof(rawbuf)); @@ -1922,12 +1931,51 @@ int jt_obd_getattr(int argc, char **argv) if (rc) { fprintf(stderr, "error: %s: %s\n", jt_cmdname(argv[0]), strerror(rc = errno)); - } else { - printf("%s: object id %ju, mode %o\n", jt_cmdname(argv[0]), - (uintmax_t)ostid_id(&data.ioc_obdo1.o_oi), - data.ioc_obdo1.o_mode); + return rc; } - return rc; + +#define OP4(bits, name, format, value) \ + do { \ + if ((oa->o_valid & (bits)) == (bits)) \ + printf("%s: "format"\n", (name), value); \ + } while (0) + +#define OPM(bits, member, format) \ + OP4(bits, #member, format, (uintmax_t)(oa->o_ ## member)) + +#define OPO(bits, member) OPM(bits, member, "%#jo") +#define OPU(bits, member) OPM(bits, member, "%ju") +#define OPX(bits, member) OPM(bits, member, "%#jx") + + OPX(0, valid); + OPX(OBD_MD_FLID | OBD_MD_FLGROUP, oi.oi.oi_id); + OPX(OBD_MD_FLID | OBD_MD_FLGROUP, oi.oi.oi_seq); + OP4(OBD_MD_FLID | OBD_MD_FLGROUP, "oi.oi_fid", DFID, PFID(&oa->o_oi.oi_fid)); + OPU(OBD_MD_FLATIME, atime); + OPU(OBD_MD_FLMTIME, mtime); + OPU(OBD_MD_FLCTIME, ctime); + OPU(OBD_MD_FLSIZE, size); + OPU(OBD_MD_FLBLOCKS, blocks); + OPU(OBD_MD_FLBLKSZ, blksize); + OPO(OBD_MD_FLMODE | OBD_MD_FLTYPE, mode); + OPU(OBD_MD_FLUID, uid); + OPU(OBD_MD_FLGID, gid); + OPU(OBD_MD_FLFLAGS, flags); + OPU(OBD_MD_FLNLINK, nlink); + OPX(OBD_MD_FLPARENT | OBD_MD_FLFID, parent_seq); + OPX(OBD_MD_FLPARENT | OBD_MD_FLFID, parent_oid); + OPX(OBD_MD_FLPARENT | OBD_MD_FLFID, parent_ver); + OPU(OBD_MD_LAYOUT_VERSION, layout_version); + OPU(OBD_MD_FLGRANT, grant); + OPU(OBD_MD_FLPROJID, projid); + OPU(OBD_MD_FLDATAVERSION, data_version); +#undef OP4 +#undef OPM +#undef OPO +#undef OPU +#undef OPX + + return 0; } int jt_obd_test_getattr(int argc, char **argv) -- 1.8.3.1