From: Vladimir Saveliev Date: Sun, 1 Aug 2010 05:21:42 +0000 (+0400) Subject: b=13698 LL_IOC_RECREATE_FID (1.8) X-Git-Tag: v1_8_4_50~12 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=a159f4f8058cdf473a714d81b9f0cc71365931df;p=fs%2Flustre-release.git b=13698 LL_IOC_RECREATE_FID (1.8) 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 864effb..993807e 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -115,6 +115,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) diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 39c70c4..2a1f463 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -2190,12 +2190,11 @@ 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_gr gr, + obd_count ost_idx) { struct ll_inode_info *lli = ll_i2info(inode); struct obd_export *exp = ll_i2obdexp(inode); - struct ll_recreate_obj ucreatp; struct obd_trans_info oti = { 0 }; struct obdo *oa = NULL; int lsm_size; @@ -2203,14 +2202,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); - - rc = copy_from_user(&ucreatp, (struct ll_recreate_obj *)arg, - sizeof(struct ll_recreate_obj)); - if (rc) { - RETURN(-EFAULT); - } OBDO_ALLOC(oa); if (oa == NULL) RETURN(-ENOMEM); @@ -2226,8 +2217,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_nlink = ucreatp.lrc_ost_idx; + oa->o_id = id; + oa->o_gr = gr; + oa->o_nlink = ost_idx; oa->o_flags |= OBD_FL_RECREATE_OBJS; oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS; obdo_from_inode(oa, inode, OBD_MD_FLTYPE | OBD_MD_FLATIME | @@ -2244,6 +2236,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 (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 (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) @@ -2914,7 +2941,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: