From 928f0409dfa1273e1542418d7156853ce0c03e04 Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Sat, 24 Aug 2024 23:37:48 +0800 Subject: [PATCH] LU-18212 ioctl: LL_IOC_FID2MDTIDX on server mount point add LL_IOC_FID2MDTIDX ioctl support on server's mount point. Signed-off-by: Alex Zhuravlev Change-Id: If3c8c96e75573b812688686a331a38250826cd05 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/56339 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/include/obd.h | 1 + lustre/osd-ldiskfs/osd_handler.c | 37 +++++++++++++++++++++++++++++++++++++ lustre/target/tgt_mount.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) diff --git a/lustre/include/obd.h b/lustre/include/obd.h index 58e1160..faebcf6 100644 --- a/lustre/include/obd.h +++ b/lustre/include/obd.h @@ -853,6 +853,7 @@ static inline bool obd_mdt_recovery_abort(struct obd_device *obd) #define KEY_CACHE_LRU_SHRINK "cache_lru_shrink" #define KEY_OSP_CONNECTED "osp_connected" +#define KEY_FID2IDX "fid2idx" #define KEY_UNEVICT_CACHE_SHRINK "unevict_cache_shrink" diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 4892f1b..54d369e 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -8889,6 +8889,42 @@ static int osd_health_check(const struct lu_env *env, struct obd_device *obd) return (osd->od_mnt == NULL || sb->s_flags & SB_RDONLY); } +static int osd_get_info(const struct lu_env *env, struct obd_export *exp, + __u32 keylen, void *key, __u32 *vallen, void *val) +{ + struct osd_device *osd; + int rc = -EINVAL; + + ENTRY; + + if (!exp->exp_obd) { + CDEBUG(D_IOCTL, "invalid client export %p\n", exp); + RETURN(-EINVAL); + } + osd = osd_dev(exp->exp_obd->obd_lu_dev); + + if (KEY_IS(KEY_FID2IDX)) { + struct lu_seq_range range; + struct lu_fid fid; + + if (osd_seq_site(osd)->ss_server_fld == NULL) + RETURN(-EINPROGRESS); + + LASSERT(*vallen = sizeof(struct lu_fid)); + memcpy(&fid, val, sizeof(struct lu_fid)); + + fld_range_set_any(&range); + + rc = osd_fld_lookup(env, osd, fid_seq(&fid), &range); + if (rc == 0) { + memcpy(val, &range, sizeof(range)); + *vallen = sizeof(range); + } + } + + RETURN(rc); +} + /* * lprocfs legacy support. */ @@ -8897,6 +8933,7 @@ static const struct obd_ops osd_obd_device_ops = { .o_connect = osd_obd_connect, .o_disconnect = osd_obd_disconnect, .o_health_check = osd_health_check, + .o_get_info = osd_get_info, }; static ssize_t delayed_unlink_mb_show(struct kobject *kobj, diff --git a/lustre/target/tgt_mount.c b/lustre/target/tgt_mount.c index beefbbf..c62d76e 100644 --- a/lustre/target/tgt_mount.c +++ b/lustre/target/tgt_mount.c @@ -49,6 +49,7 @@ #ifdef HAVE_FSMAP_H #include #endif +#include #include #include @@ -2009,6 +2010,40 @@ static long server_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) struct inode *root_inode; int err = -ENOTTY; + if (cmd == LL_IOC_FID2MDTIDX) { + union { + struct lu_seq_range range; + struct lu_fid fid; + } u; + struct lu_env *env; + int len; + + if (copy_from_user(&u.fid, (struct lu_fid __user *)arg, + sizeof(u.fid))) + RETURN(-EFAULT); + + OBD_ALLOC_PTR(env); + if (env == NULL) + return -ENOMEM; + err = lu_env_init(env, LCT_DT_THREAD); + if (err) + GOTO(out, err = -ENOMEM); + + /* XXX: check for size */ + len = sizeof(struct lu_fid); + err = obd_get_info(env, lsi->lsi_osd_exp, sizeof(KEY_FID2IDX), + KEY_FID2IDX, &len, &u.fid); + if (err == 0) { + err = -EINVAL; + if (u.range.lsr_flags & LU_SEQ_RANGE_MDT) + err = u.range.lsr_index; + } + lu_env_fini(env); +out: + OBD_FREE_PTR(env); + return err; + } + if (!is_cmd_supported(cmd)) return err; -- 1.8.3.1