Пример #1
0
        public override StorApiStatus CreateVolume(CreateVolumeData data)
        {
            StorApiStatus storApiStatus = StorApiStatusEnum.STOR_NO_ERROR;
            byte          mvstatus      = 0;

            MvApi.MvApi.Create_LD_Param create_LD_Param = default(MvApi.MvApi.Create_LD_Param);
            int num = 0;

            create_LD_Param.RaidMode             = MarvellUtil.ToMarvellRaidLevel(data.level);
            create_LD_Param.RoundingScheme       = 0;
            create_LD_Param.InitializationOption = 0;
            create_LD_Param.CachePolicy          = (byte)(data.writeCache ? 0 : 1);
            create_LD_Param.StripeBlockSize      = (short)data.stripeSize;
            create_LD_Param.HDIDs = new short[128];
            foreach (Drive drive in data.drives)
            {
                if (num >= 128)
                {
                    return(StorApiStatusEnum.STOR_INVALID_PARAM);
                }
                create_LD_Param.HDIDs[num] = ((MarvellDrive)drive).MvId;
                num++;
            }
            create_LD_Param.HDCount = (byte)num;
            create_LD_Param.Name    = new byte[16];
            byte[] bytes = Encoding.ASCII.GetBytes(data.name);
            if (bytes.Length >= 16)
            {
                return(StorApiStatusEnum.STOR_INVALID_PARAM);
            }
            bytes.CopyTo(create_LD_Param.Name, 0);
            lock (MarvellUtil.mvApiLock)
            {
                try
                {
                    mvstatus = MvApi.MvApi.MV_LD_Create(this.AdapterId, ref create_LD_Param);
                }
                catch (Exception ex)
                {
                    Logger.Warn("MV_LD_Create exception: {0}", new object[]
                    {
                        ex
                    });
                    return(StorApiStatusEnum.STOR_API_ERROR);
                }
            }
            return(MarvellUtil.ToStorApiStatus(mvstatus));
        }
Пример #2
0
        public override StorApiStatus Migrate(RaidLevel newLevel, List <Drive> newDrives)
        {
            StorApiStatus storApiStatus = StorApiStatusEnum.STOR_NO_ERROR;
            byte          b             = 0;

            MvApi.MvApi.Create_LD_Param   create_LD_Param   = default(MvApi.MvApi.Create_LD_Param);
            MvApi.MvApi.LD_Config_Request ld_Config_Request = default(MvApi.MvApi.LD_Config_Request);
            int num = 0;

            ld_Config_Request.header.Init();
            ld_Config_Request.header.requestType       = 2;
            ld_Config_Request.header.startingIndexOrId = this.mvid;
            ld_Config_Request.header.numRequested      = 1;
            lock (MarvellUtil.mvApiLock)
            {
                try
                {
                    b = MvApi.MvApi.MV_LD_GetConfig(((MarvellController)this.controller).AdapterId, ref ld_Config_Request);
                }
                catch (Exception ex)
                {
                    Logger.Warn("MV_LD_GetConfig exception: {0}", new object[]
                    {
                        ex
                    });
                    return(StorApiStatusEnum.STOR_API_ERROR);
                }
                if (b != 0)
                {
                    storApiStatus = MarvellUtil.ToStorApiStatus(b);
                    storApiStatus.internalIntData = (int)b;
                    Logger.Warn("MV_LD_GetConfig failed: {0}", new object[]
                    {
                        b
                    });
                    return(storApiStatus);
                }
                string @string = Encoding.ASCII.GetString(ld_Config_Request.ldConfig[0].Name);
                create_LD_Param.LDID                 = this.MvId;
                create_LD_Param.RaidMode             = MarvellUtil.ToMarvellRaidLevel(newLevel);
                create_LD_Param.RoundingScheme       = 0;
                create_LD_Param.InitializationOption = 0;
                create_LD_Param.HDIDs                = new short[128];
                foreach (Drive drive in this.drives)
                {
                    if (num >= 128)
                    {
                        storApiStatus = StorApiStatusEnum.STOR_INVALID_PARAM;
                        return(storApiStatus);
                    }
                    create_LD_Param.HDIDs[num] = ((MarvellDrive)drive).MvId;
                    num++;
                }
                foreach (Drive drive2 in newDrives)
                {
                    if (num >= 128)
                    {
                        storApiStatus = StorApiStatusEnum.STOR_INVALID_PARAM;
                        return(storApiStatus);
                    }
                    create_LD_Param.HDIDs[num] = ((MarvellDrive)drive2).MvId;
                    num++;
                }
                create_LD_Param.HDCount = (byte)num;
                create_LD_Param.Name    = new byte[16];
                ld_Config_Request.ldConfig[0].Name.CopyTo(create_LD_Param.Name, 0);
                Logger.Debug("Migrate parameter: LD={0}, RAID={1}, HDCount={2}, HD={3}, Name={4}", new object[]
                {
                    create_LD_Param.LDID,
                    create_LD_Param.RaidMode,
                    create_LD_Param.HDCount,
                    string.Join <short>(" ", create_LD_Param.HDIDs.ToList <short>().GetRange(0, (int)create_LD_Param.HDCount)),
                    @string
                });
                try
                {
                    b = MvApi.MvApi.MV_LD_StartMigration(((MarvellController)this.controller).AdapterId, ref create_LD_Param);
                }
                catch (Exception ex2)
                {
                    Logger.Warn("MV_LD_StartMigration exception: {0}", new object[]
                    {
                        ex2
                    });
                    return(StorApiStatusEnum.STOR_API_ERROR);
                }
                if (b != 0)
                {
                    storApiStatus = MarvellUtil.ToStorApiStatus(b);
                    storApiStatus.internalIntData = (int)b;
                    Logger.Warn("MV_LD_StartMigration failed: {0}", new object[]
                    {
                        b
                    });
                }
            }
            return(storApiStatus);
        }