Whamcloud - gitweb
LU-15452 utils: support lctl getattr for osc 31/46131/3
authorJohn L. Hammond <jhammond@whamcloud.com>
Fri, 14 Jan 2022 16:58:59 +0000 (10:58 -0600)
committerOleg Drokin <green@whamcloud.com>
Mon, 31 Jan 2022 01:34:23 +0000 (01:34 +0000)
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 <jhammond@whamcloud.com>
Change-Id: I57d5778e9ac39030ae9477a0979f20b7f7460fc8
Reviewed-on: https://review.whamcloud.com/46131
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osc/osc_request.c
lustre/utils/obd.c

index f426f8a..889f72a 100644 (file)
@@ -3193,6 +3193,9 @@ static int osc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                if (rc > 0)
                        rc = 0;
                break;
                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);
        case IOC_OSC_SET_ACTIVE:
                rc = ptlrpc_set_import_active(obd->u.cli.cl_import,
                                              data->ioc_offset);
index b7a1c23..c43a7cc 100644 (file)
@@ -1876,39 +1876,48 @@ int jt_obd_destroy(int argc, char **argv)
        return rc;
 }
 
        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;
 int jt_obd_getattr(int argc, char **argv)
 {
        struct obd_ioctl_data data;
+       struct obdo *oa;
        char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
        char rawbuf[MAX_IOC_BUFLEN], *buf = rawbuf;
-       __u64 objid;
-       char *end;
        int rc;
 
        if (argc != 2)
                return CMD_HELP;
 
        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;
        }
 
                        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));
 
        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));
        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)
 }
 
 int jt_obd_test_getattr(int argc, char **argv)