Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 30372
b: refs/heads/master
c: acc55e2
h: refs/heads/master
v: v3
  • Loading branch information
NeilBrown authored and Linus Torvalds committed Jun 26, 2006
1 parent 07c9893 commit 0975283
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 27 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0cdd02cabd86b5d547f882005e23a93929f0ace9
refs/heads/master: acc55e220166a5ad898e66ad6153fd62eaaac76d
8 changes: 1 addition & 7 deletions trunk/drivers/md/bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -625,7 +625,6 @@ static void drain_write_queues(struct bitmap *bitmap)
static void bitmap_file_put(struct bitmap *bitmap)
{
struct file *file;
struct inode *inode;
unsigned long flags;

spin_lock_irqsave(&bitmap->lock, flags);
Expand All @@ -637,13 +636,8 @@ static void bitmap_file_put(struct bitmap *bitmap)

bitmap_file_unmap(bitmap);

if (file) {
inode = file->f_mapping->host;
spin_lock(&inode->i_lock);
atomic_set(&inode->i_writecount, 1); /* allow writes again */
spin_unlock(&inode->i_lock);
if (file)
fput(file);
}
}


Expand Down
49 changes: 30 additions & 19 deletions trunk/drivers/md/md.c
Original file line number Diff line number Diff line change
Expand Up @@ -2877,6 +2877,32 @@ static int restart_array(mddev_t *mddev)
return err;
}

/* similar to deny_write_access, but accounts for our holding a reference
* to the file ourselves */
static int deny_bitmap_write_access(struct file * file)
{
struct inode *inode = file->f_mapping->host;

spin_lock(&inode->i_lock);
if (atomic_read(&inode->i_writecount) > 1) {
spin_unlock(&inode->i_lock);
return -ETXTBSY;
}
atomic_set(&inode->i_writecount, -1);
spin_unlock(&inode->i_lock);

return 0;
}

static void restore_bitmap_write_access(struct file *file)
{
struct inode *inode = file->f_mapping->host;

spin_lock(&inode->i_lock);
atomic_set(&inode->i_writecount, 1);
spin_unlock(&inode->i_lock);
}

static int do_md_stop(mddev_t * mddev, int ro)
{
int err = 0;
Expand Down Expand Up @@ -2940,7 +2966,7 @@ static int do_md_stop(mddev_t * mddev, int ro)

bitmap_destroy(mddev);
if (mddev->bitmap_file) {
atomic_set(&mddev->bitmap_file->f_dentry->d_inode->i_writecount, 1);
restore_bitmap_write_access(mddev->bitmap_file);
fput(mddev->bitmap_file);
mddev->bitmap_file = NULL;
}
Expand Down Expand Up @@ -3544,23 +3570,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
return err;
}

/* similar to deny_write_access, but accounts for our holding a reference
* to the file ourselves */
static int deny_bitmap_write_access(struct file * file)
{
struct inode *inode = file->f_mapping->host;

spin_lock(&inode->i_lock);
if (atomic_read(&inode->i_writecount) > 1) {
spin_unlock(&inode->i_lock);
return -ETXTBSY;
}
atomic_set(&inode->i_writecount, -1);
spin_unlock(&inode->i_lock);

return 0;
}

static int set_bitmap_file(mddev_t *mddev, int fd)
{
int err;
Expand Down Expand Up @@ -3608,8 +3617,10 @@ static int set_bitmap_file(mddev_t *mddev, int fd)
mddev->pers->quiesce(mddev, 0);
}
if (fd < 0) {
if (mddev->bitmap_file)
if (mddev->bitmap_file) {
restore_bitmap_write_access(mddev->bitmap_file);
fput(mddev->bitmap_file);
}
mddev->bitmap_file = NULL;
}

Expand Down

0 comments on commit 0975283

Please sign in to comment.