struct list_head *tmp;
ENTRY;
+ printk ("down0\n");
obd_down(&obdfs_i2sbi(inode)->osi_list_mutex);
+ printk ("got down0\n");
tmp = obdfs_islist(inode);
if ( list_empty(tmp) ) {
CDEBUG(D_INFO, "no dirty pages for inode %ld\n", inode->i_ino);
+ printk ("up 0a");
obd_up(&obdfs_i2sbi(inode)->osi_list_mutex);
EXIT;
return;
put_page(page);
}
+ printk ("up 0b");
obd_up(&obdfs_i2sbi(inode)->osi_list_mutex);
/* decrement inode reference for page cache */
sbi = list_entry(inode_list, struct obdfs_sb_info, osi_inodes);
+ printk ("down1\n");
obd_down(&sbi->osi_list_mutex);
+ printk ("got down1\n");
if ( list_empty(inode_list) ) {
CDEBUG(D_INFO, "list empty\n");
+ printk ("up 1a\n");
obd_up(&sbi->osi_list_mutex);
EXIT;
return 0;
num_obdos++;
if ( num_io == MAX_IOVEC ) {
+ printk ("up 1b\n");
obd_up(&sbi->osi_list_mutex);
err = obdfs_do_vec_wr(inodes, num_io, num_obdos,
obdos, bufs_per_obdo,
EXIT;
goto ERR;
}
+ printk ("down2\n");
obd_down(&sbi->osi_list_mutex);
+ printk ("got down2\n");
goto again;
}
}
}
BREAK:
+ printk ("up 2\n");
obd_up(&sbi->osi_list_mutex);
/* flush any remaining I/Os */
* Make sure we don't point at the current inode with tmp
* when we re-init the list on the inode, or we will loop.
*/
+ printk ("down3\n");
obd_down(&sbi->osi_list_mutex);
+ printk ("got down3\n");
tmp = inode_list;
while ( (tmp = tmp->prev) != inode_list ) {
struct obdfs_inode_info *ii;
INIT_LIST_HEAD(obdfs_islist(inode));
}
}
+ printk ("up 3\n");
obd_up(&sbi->osi_list_mutex);
CDEBUG(D_INFO, "flushed %ld pages in total\n", total_io);
CDEBUG(D_INFO, "\n");
/* list of dirty inodes, and a mutex to hold while modifying it */
INIT_LIST_HEAD(&sbi->osi_inodes);
- sema_init(&sbi->osi_list_mutex, 1);
+ init_MUTEX (&sbi->osi_list_mutex);
CDEBUG(D_INFO, "\n");
sbi->osi_super = sb;
OPS(sb,disconnect)(ID(sb));
list_del(&sbi->osi_list);
- memset(sbi, 0, sizeof(*sbi));
printk(KERN_INFO "OBDFS: Bye bye.\n");