md.c (35bfc52187f6df8779d0f1cebdb52b7f797baf4e) md.c (b03e0ccb5ab9df3efbe51c87843a1ffbecbafa1f)
1/*
2 md.c : Multiple Devices driver for Linux
3 Copyright (C) 1998, 1999, 2000 Ingo Molnar
4
5 completely rewritten, based on the MD driver code from Marc Zyngier
6
7 Changes:
8

--- 4832 unchanged lines hidden (view full) ---

4841suspend_lo_show(struct mddev *mddev, char *page)
4842{
4843 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo);
4844}
4845
4846static ssize_t
4847suspend_lo_store(struct mddev *mddev, const char *buf, size_t len)
4848{
1/*
2 md.c : Multiple Devices driver for Linux
3 Copyright (C) 1998, 1999, 2000 Ingo Molnar
4
5 completely rewritten, based on the MD driver code from Marc Zyngier
6
7 Changes:
8

--- 4832 unchanged lines hidden (view full) ---

4841suspend_lo_show(struct mddev *mddev, char *page)
4842{
4843 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_lo);
4844}
4845
4846static ssize_t
4847suspend_lo_store(struct mddev *mddev, const char *buf, size_t len)
4848{
4849 unsigned long long old, new;
4849 unsigned long long new;
4850 int err;
4851
4852 err = kstrtoull(buf, 10, &new);
4853 if (err < 0)
4854 return err;
4855 if (new != (sector_t)new)
4856 return -EINVAL;
4857
4858 err = mddev_lock(mddev);
4859 if (err)
4860 return err;
4861 err = -EINVAL;
4862 if (mddev->pers == NULL ||
4863 mddev->pers->quiesce == NULL)
4864 goto unlock;
4850 int err;
4851
4852 err = kstrtoull(buf, 10, &new);
4853 if (err < 0)
4854 return err;
4855 if (new != (sector_t)new)
4856 return -EINVAL;
4857
4858 err = mddev_lock(mddev);
4859 if (err)
4860 return err;
4861 err = -EINVAL;
4862 if (mddev->pers == NULL ||
4863 mddev->pers->quiesce == NULL)
4864 goto unlock;
4865 old = mddev->suspend_lo;
4865 mddev_suspend(mddev);
4866 mddev->suspend_lo = new;
4866 mddev->suspend_lo = new;
4867 if (new >= old) {
4868 /* Shrinking suspended region */
4869 wake_up(&mddev->sb_wait);
4870 mddev->pers->quiesce(mddev, 2);
4871 } else {
4872 /* Expanding suspended region - need to wait */
4873 mddev_suspend(mddev);
4874 mddev_resume(mddev);
4875 }
4867 mddev_resume(mddev);
4868
4876 err = 0;
4877unlock:
4878 mddev_unlock(mddev);
4879 return err ?: len;
4880}
4881static struct md_sysfs_entry md_suspend_lo =
4882__ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store);
4883
4884static ssize_t
4885suspend_hi_show(struct mddev *mddev, char *page)
4886{
4887 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi);
4888}
4889
4890static ssize_t
4891suspend_hi_store(struct mddev *mddev, const char *buf, size_t len)
4892{
4869 err = 0;
4870unlock:
4871 mddev_unlock(mddev);
4872 return err ?: len;
4873}
4874static struct md_sysfs_entry md_suspend_lo =
4875__ATTR(suspend_lo, S_IRUGO|S_IWUSR, suspend_lo_show, suspend_lo_store);
4876
4877static ssize_t
4878suspend_hi_show(struct mddev *mddev, char *page)
4879{
4880 return sprintf(page, "%llu\n", (unsigned long long)mddev->suspend_hi);
4881}
4882
4883static ssize_t
4884suspend_hi_store(struct mddev *mddev, const char *buf, size_t len)
4885{
4893 unsigned long long old, new;
4886 unsigned long long new;
4894 int err;
4895
4896 err = kstrtoull(buf, 10, &new);
4897 if (err < 0)
4898 return err;
4899 if (new != (sector_t)new)
4900 return -EINVAL;
4901
4902 err = mddev_lock(mddev);
4903 if (err)
4904 return err;
4905 err = -EINVAL;
4887 int err;
4888
4889 err = kstrtoull(buf, 10, &new);
4890 if (err < 0)
4891 return err;
4892 if (new != (sector_t)new)
4893 return -EINVAL;
4894
4895 err = mddev_lock(mddev);
4896 if (err)
4897 return err;
4898 err = -EINVAL;
4906 if (mddev->pers == NULL ||
4907 mddev->pers->quiesce == NULL)
4899 if (mddev->pers == NULL)
4908 goto unlock;
4900 goto unlock;
4909 old = mddev->suspend_hi;
4901
4902 mddev_suspend(mddev);
4910 mddev->suspend_hi = new;
4903 mddev->suspend_hi = new;
4911 if (new <= old) {
4912 /* Shrinking suspended region */
4913 wake_up(&mddev->sb_wait);
4914 mddev->pers->quiesce(mddev, 2);
4915 } else {
4916 /* Expanding suspended region - need to wait */
4917 mddev_suspend(mddev);
4918 mddev_resume(mddev);
4919 }
4904 mddev_resume(mddev);
4905
4920 err = 0;
4921unlock:
4922 mddev_unlock(mddev);
4923 return err ?: len;
4924}
4925static struct md_sysfs_entry md_suspend_hi =
4926__ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store);
4927

--- 4406 unchanged lines hidden ---
4906 err = 0;
4907unlock:
4908 mddev_unlock(mddev);
4909 return err ?: len;
4910}
4911static struct md_sysfs_entry md_suspend_hi =
4912__ATTR(suspend_hi, S_IRUGO|S_IWUSR, suspend_hi_show, suspend_hi_store);
4913

--- 4406 unchanged lines hidden ---