lafs_get_block(struct inode *ino, unsigned long index, struct page *p,
int gfp, REFARG)
{
- struct datablock *b;
+ struct datablock *b = NULL;
int bits = PAGE_SHIFT - ino->i_blkbits;
int unlock = !p;
+ if (!p) {
+ p = find_get_page(ino->i_mapping, index >> bits);
+ if (p) {
+ spin_lock(&ino->i_mapping->private_lock);
+ if (PagePrivate(p)) {
+ b = (struct datablock *)p->private;
+ b += index & ((1<<bits)-1);
+ getdref_locked(b, REF);
+ }
+ spin_unlock(&ino->i_mapping->private_lock);
+ page_cache_release(p);
+ p = NULL;
+ }
+ if (b)
+ return b;
+ }
if (!p)
p = find_or_create_page(ino->i_mapping, index>>bits, gfp);
if (!p) {
b += index & ((1<<bits)-1);
getdref_locked(b, REF);
- if (unlock)
+ if (unlock) {
unlock_page(p);
+ page_cache_release(p);
+ }
BUG_ON(b->b.inode != ino);
return b;
}
db->my_inode &&
spin_is_locked(&db->my_inode->i_data.private_lock))
ok = 1;
+ if (spin_is_locked(&b->inode->i_mapping->private_lock))
+ ok = 1;
}
if (test_bit(B_Dirty, &b->flags) || test_bit(B_Realloc, &b->flags))
if (spin_is_locked(&fs_from_inode(b->inode)->lock))