From: Vladimir Saveliev Date: Sat, 17 Jul 2010 00:14:12 +0000 (+0400) Subject: b=13698 LL_IOC_RECREATE_FID X-Git-Tag: 2.0.0.51~17 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=942a9ad2fb230abe2290ae08aad748b5a58c9148;ds=sidebyside b=13698 LL_IOC_RECREATE_FID define new ioctl for object replicate it uses IDIF FID instead of truct ll_recreate_obj old LL_IOC_RECREATE is kept for compatibility i=andreas.dilger i=di.wang --- diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index e949fe1..06ea33e 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -122,6 +122,7 @@ struct obd_statfs { #define LL_IOC_LOV_GETSTRIPE _IOW ('f', 155, long) #define LL_IOC_LOV_SETEA _IOW ('f', 156, long) #define LL_IOC_RECREATE_OBJ _IOW ('f', 157, long) +#define LL_IOC_RECREATE_FID _IOW ('f', 157, struct lu_fid) #define LL_IOC_GROUP_LOCK _IOW ('f', 158, long) #define LL_IOC_GROUP_UNLOCK _IOW ('f', 159, long) #define LL_IOC_QUOTACHECK _IOW ('f', 160, int) @@ -226,7 +227,6 @@ struct lov_user_mds_data_v3 { struct ll_recreate_obj { __u64 lrc_id; - __u64 lrc_seq; __u32 lrc_ost_idx; }; diff --git a/lustre/llite/file.c b/lustre/llite/file.c index af88693..f2a8d14 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -1198,11 +1198,10 @@ static ssize_t ll_file_splice_read(struct file *in_file, loff_t *ppos, } #endif -static int ll_lov_recreate_obj(struct inode *inode, struct file *file, - unsigned long arg) +static int ll_lov_recreate(struct inode *inode, obd_id id, obd_seq seq, + obd_count ost_idx) { struct obd_export *exp = ll_i2dtexp(inode); - struct ll_recreate_obj ucreatp; struct obd_trans_info oti = { 0 }; struct obdo *oa = NULL; int lsm_size; @@ -1210,13 +1209,6 @@ static int ll_lov_recreate_obj(struct inode *inode, struct file *file, struct lov_stripe_md *lsm, *lsm2; ENTRY; - if (!cfs_capable(CFS_CAP_SYS_ADMIN)) - RETURN(-EPERM); - - if (cfs_copy_from_user(&ucreatp, (struct ll_recreate_obj *)arg, - sizeof(struct ll_recreate_obj))) - RETURN(-EFAULT); - OBDO_ALLOC(oa); if (oa == NULL) RETURN(-ENOMEM); @@ -1232,9 +1224,9 @@ static int ll_lov_recreate_obj(struct inode *inode, struct file *file, if (lsm2 == NULL) GOTO(out, rc = -ENOMEM); - oa->o_id = ucreatp.lrc_id; - oa->o_seq = ucreatp.lrc_seq; - oa->o_nlink = ucreatp.lrc_ost_idx; + oa->o_id = id; + oa->o_seq = seq; + oa->o_nlink = ost_idx; oa->o_flags |= OBD_FL_RECREATE_OBJS; oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS | OBD_MD_FLGROUP; obdo_from_inode(oa, inode, &ll_i2info(inode)->lli_fid, OBD_MD_FLTYPE | @@ -1250,6 +1242,41 @@ out: return rc; } +static int ll_lov_recreate_obj(struct inode *inode, unsigned long arg) +{ + struct ll_recreate_obj ucreat; + ENTRY; + + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) + RETURN(-EPERM); + + if (cfs_copy_from_user(&ucreat, (struct ll_recreate_obj *)arg, + sizeof(struct ll_recreate_obj))) + RETURN(-EFAULT); + + RETURN(ll_lov_recreate(inode, ucreat.lrc_id, 0, + ucreat.lrc_ost_idx)); +} + +static int ll_lov_recreate_fid(struct inode *inode, unsigned long arg) +{ + struct lu_fid fid; + obd_id id; + obd_count ost_idx; + ENTRY; + + if (!cfs_capable(CFS_CAP_SYS_ADMIN)) + RETURN(-EPERM); + + if (cfs_copy_from_user(&fid, (struct lu_fid *)arg, + sizeof(struct lu_fid))) + RETURN(-EFAULT); + + id = fid_oid(&fid) | ((fid_seq(&fid) & 0xffff) << 32); + ost_idx = (fid_seq(&fid) >> 16) & 0xffff; + RETURN(ll_lov_recreate(inode, id, 0, ost_idx)); +} + int ll_lov_setstripe_ea_info(struct inode *inode, struct file *file, int flags, struct lov_user_md *lum, int lum_size) { @@ -1747,7 +1774,9 @@ int ll_file_ioctl(struct inode *inode, struct file *file, unsigned int cmd, case LL_IOC_LOV_GETSTRIPE: RETURN(ll_lov_getstripe(inode, arg)); case LL_IOC_RECREATE_OBJ: - RETURN(ll_lov_recreate_obj(inode, file, arg)); + RETURN(ll_lov_recreate_obj(inode, arg)); + case LL_IOC_RECREATE_FID: + RETURN(ll_lov_recreate_fid(inode, arg)); case FSFILT_IOC_FIEMAP: RETURN(ll_ioctl_fiemap(inode, arg)); case FSFILT_IOC_GETFLAGS: