Whamcloud - gitweb
b=13698 LL_IOC_RECREATE_FID (1.8)
authorVladimir Saveliev <Vladimir.Saveliev@sun.com>
Sun, 1 Aug 2010 05:21:42 +0000 (09:21 +0400)
committerJohann Lombardi <johann.lombardi@oracle.com>
Mon, 9 Aug 2010 07:17:25 +0000 (09:17 +0200)
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

lustre/include/lustre/lustre_user.h
lustre/llite/file.c

index 864effb..993807e 100644 (file)
@@ -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)
index 39c70c4..2a1f463 100644 (file)
@@ -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: