Skip to content

Commit

Permalink
md: rename mddev->write_lock to mddev->lock
Browse files Browse the repository at this point in the history
This lock is used for (slightly) more than helping with writing
superblocks, and it will soon be extended further.  So the
name is inappropriate.

Also, the _irq variant hasn't been needed since 2.6.37 as it is
never taking from interrupt or bh context.

So:
  -rename write_lock to lock
  -document what it protects
  -remove _irq ... except in md_flush_request() as there
     is no wait_event_lock() (with no _irq).  This can be
     cleaned up after appropriate changes to wait.h.

Signed-off-by: NeilBrown <neilb@suse.de>
  • Loading branch information
NeilBrown committed Feb 3, 2015
1 parent ea664c8 commit 85572d7
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 19 deletions.
36 changes: 18 additions & 18 deletions drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,12 +397,12 @@ static void md_submit_flush_data(struct work_struct *ws)

void md_flush_request(struct mddev *mddev, struct bio *bio)
{
spin_lock_irq(&mddev->write_lock);
spin_lock_irq(&mddev->lock);
wait_event_lock_irq(mddev->sb_wait,
!mddev->flush_bio,
mddev->write_lock);
mddev->lock);
mddev->flush_bio = bio;
spin_unlock_irq(&mddev->write_lock);
spin_unlock_irq(&mddev->lock);

INIT_WORK(&mddev->flush_work, submit_flushes);
queue_work(md_wq, &mddev->flush_work);
Expand Down Expand Up @@ -465,7 +465,7 @@ void mddev_init(struct mddev *mddev)
atomic_set(&mddev->active, 1);
atomic_set(&mddev->openers, 0);
atomic_set(&mddev->active_io, 0);
spin_lock_init(&mddev->write_lock);
spin_lock_init(&mddev->lock);
atomic_set(&mddev->flush_pending, 0);
init_waitqueue_head(&mddev->sb_wait);
init_waitqueue_head(&mddev->recovery_wait);
Expand Down Expand Up @@ -2230,7 +2230,7 @@ static void md_update_sb(struct mddev *mddev, int force_change)
return;
}

spin_lock_irq(&mddev->write_lock);
spin_lock(&mddev->lock);

mddev->utime = get_seconds();

Expand Down Expand Up @@ -2287,7 +2287,7 @@ static void md_update_sb(struct mddev *mddev, int force_change)
}

sync_sbs(mddev, nospares);
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);

pr_debug("md: updating %s RAID superblock on device (in sync %d)\n",
mdname(mddev), mddev->in_sync);
Expand Down Expand Up @@ -2326,15 +2326,15 @@ static void md_update_sb(struct mddev *mddev, int force_change)
md_super_wait(mddev);
/* if there was a failure, MD_CHANGE_DEVS was set, and we re-write super */

spin_lock_irq(&mddev->write_lock);
spin_lock(&mddev->lock);
if (mddev->in_sync != sync_req ||
test_bit(MD_CHANGE_DEVS, &mddev->flags)) {
/* have to write it out again */
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);
goto repeat;
}
clear_bit(MD_CHANGE_PENDING, &mddev->flags);
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);
wake_up(&mddev->sb_wait);
if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery))
sysfs_notify(&mddev->kobj, NULL, "sync_completed");
Expand Down Expand Up @@ -3722,7 +3722,7 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
case clean:
if (mddev->pers) {
restart_array(mddev);
spin_lock_irq(&mddev->write_lock);
spin_lock(&mddev->lock);
if (atomic_read(&mddev->writes_pending) == 0) {
if (mddev->in_sync == 0) {
mddev->in_sync = 1;
Expand All @@ -3733,7 +3733,7 @@ array_state_store(struct mddev *mddev, const char *buf, size_t len)
err = 0;
} else
err = -EBUSY;
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);
} else
err = -EINVAL;
break;
Expand Down Expand Up @@ -7102,15 +7102,15 @@ void md_write_start(struct mddev *mddev, struct bio *bi)
if (mddev->safemode == 1)
mddev->safemode = 0;
if (mddev->in_sync) {
spin_lock_irq(&mddev->write_lock);
spin_lock(&mddev->lock);
if (mddev->in_sync) {
mddev->in_sync = 0;
set_bit(MD_CHANGE_CLEAN, &mddev->flags);
set_bit(MD_CHANGE_PENDING, &mddev->flags);
md_wakeup_thread(mddev->thread);
did_change = 1;
}
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);
}
if (did_change)
sysfs_notify_dirent_safe(mddev->sysfs_state);
Expand Down Expand Up @@ -7148,19 +7148,19 @@ int md_allow_write(struct mddev *mddev)
if (!mddev->pers->sync_request)
return 0;

spin_lock_irq(&mddev->write_lock);
spin_lock(&mddev->lock);
if (mddev->in_sync) {
mddev->in_sync = 0;
set_bit(MD_CHANGE_CLEAN, &mddev->flags);
set_bit(MD_CHANGE_PENDING, &mddev->flags);
if (mddev->safemode_delay &&
mddev->safemode == 0)
mddev->safemode = 1;
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);
md_update_sb(mddev, 0);
sysfs_notify_dirent_safe(mddev->sysfs_state);
} else
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);

if (test_bit(MD_CHANGE_PENDING, &mddev->flags))
return -EAGAIN;
Expand Down Expand Up @@ -7688,7 +7688,7 @@ void md_check_recovery(struct mddev *mddev)

if (!mddev->external) {
int did_change = 0;
spin_lock_irq(&mddev->write_lock);
spin_lock(&mddev->lock);
if (mddev->safemode &&
!atomic_read(&mddev->writes_pending) &&
!mddev->in_sync &&
Expand All @@ -7699,7 +7699,7 @@ void md_check_recovery(struct mddev *mddev)
}
if (mddev->safemode == 1)
mddev->safemode = 0;
spin_unlock_irq(&mddev->write_lock);
spin_unlock(&mddev->lock);
if (did_change)
sysfs_notify_dirent_safe(mddev->sysfs_state);
}
Expand Down
8 changes: 7 additions & 1 deletion drivers/md/md.h
Original file line number Diff line number Diff line change
Expand Up @@ -386,7 +386,13 @@ struct mddev {

struct work_struct del_work; /* used for delayed sysfs removal */

spinlock_t write_lock;
/* "lock" protects:
* flush_bio transition from NULL to !NULL
* rdev superblocks, events
* clearing MD_CHANGE_*
* in_sync - and related safemode and MD_CHANGE changes
*/
spinlock_t lock;
wait_queue_head_t sb_wait; /* for waiting on superblock updates */
atomic_t pending_writes; /* number of active superblock writes */

Expand Down

0 comments on commit 85572d7

Please sign in to comment.