#include "swab.h"
#include "util.h"
+#undef UFS_UTILS_DEBUG
+
+#ifdef UFS_UTILS_DEBUG
+#define UFSD(x) printk("(%s, %d), %s: ", __FILE__, __LINE__, __FUNCTION__); printk x;
+#else
+#define UFSD(x)
+#endif
+
+
struct ufs_buffer_head * _ubh_bread_ (struct ufs_sb_private_info * uspi,
struct super_block *sb, u64 fragment, u64 size)
{
count = size >> uspi->s_fshift;
if (count <= 0 || count > UFS_MAXFRAG)
return NULL;
- USPI_UBH(uspi)->fragment = fragment;
- USPI_UBH(uspi)->count = count;
+ USPI_UBH->fragment = fragment;
+ USPI_UBH->count = count;
for (i = 0; i < count; i++)
- if (!(USPI_UBH(uspi)->bh[i] = sb_bread(sb, fragment + i)))
+ if (!(USPI_UBH->bh[i] = sb_bread(sb, fragment + i)))
goto failed;
for (; i < UFS_MAXFRAG; i++)
- USPI_UBH(uspi)->bh[i] = NULL;
- return USPI_UBH(uspi);
+ USPI_UBH->bh[i] = NULL;
+ return USPI_UBH;
failed:
for (j = 0; j < i; j++)
- brelse (USPI_UBH(uspi)->bh[j]);
+ brelse (USPI_UBH->bh[j]);
return NULL;
}
void ubh_brelse_uspi (struct ufs_sb_private_info * uspi)
{
unsigned i;
- if (!USPI_UBH(uspi))
+ if (!USPI_UBH)
return;
- for ( i = 0; i < USPI_UBH(uspi)->count; i++ ) {
- brelse (USPI_UBH(uspi)->bh[i]);
- USPI_UBH(uspi)->bh[i] = NULL;
+ for ( i = 0; i < USPI_UBH->count; i++ ) {
+ brelse (USPI_UBH->bh[i]);
+ USPI_UBH->bh[i] = NULL;
}
}
}
}
-void ubh_ll_rw_block(int rw, struct ufs_buffer_head *ubh)
+void ubh_ll_rw_block (int rw, unsigned nr, struct ufs_buffer_head * ubh[])
{
+ unsigned i;
if (!ubh)
return;
-
- ll_rw_block(rw, ubh->count, ubh->bh);
+ for ( i = 0; i < nr; i++ )
+ ll_rw_block (rw, ubh[i]->count, ubh[i]->bh);
}
void ubh_wait_on_buffer (struct ufs_buffer_head * ubh)
wait_on_buffer (ubh->bh[i]);
}
+unsigned ubh_max_bcount (struct ufs_buffer_head * ubh)
+{
+ unsigned i;
+ unsigned max = 0;
+ if (!ubh)
+ return 0;
+ for ( i = 0; i < ubh->count; i++ )
+ if ( atomic_read(&ubh->bh[i]->b_count) > max )
+ max = atomic_read(&ubh->bh[i]->b_count);
+ return max;
+}
+
void ubh_bforget (struct ufs_buffer_head * ubh)
{
unsigned i;
else
ufsi->i_u1.i_data[0] = fs32;
}
-
-/**
- * ufs_get_locked_page() - locate, pin and lock a pagecache page, if not exist
- * read it from disk.
- * @mapping: the address_space to search
- * @index: the page index
- *
- * Locates the desired pagecache page, if not exist we'll read it,
- * locks it, increments its reference
- * count and returns its address.
- *
- */
-
-struct page *ufs_get_locked_page(struct address_space *mapping,
- pgoff_t index)
-{
- struct page *page;
-
- page = find_lock_page(mapping, index);
- if (!page) {
- page = read_cache_page(mapping, index,
- (filler_t*)mapping->a_ops->readpage,
- NULL);
-
- if (IS_ERR(page)) {
- printk(KERN_ERR "ufs_change_blocknr: "
- "read_cache_page error: ino %lu, index: %lu\n",
- mapping->host->i_ino, index);
- goto out;
- }
-
- lock_page(page);
-
- if (unlikely(page->mapping == NULL)) {
- /* Truncate got there first */
- unlock_page(page);
- page_cache_release(page);
- page = NULL;
- goto out;
- }
-
- if (!PageUptodate(page) || PageError(page)) {
- unlock_page(page);
- page_cache_release(page);
-
- printk(KERN_ERR "ufs_change_blocknr: "
- "can not read page: ino %lu, index: %lu\n",
- mapping->host->i_ino, index);
-
- page = ERR_PTR(-EIO);
- }
- }
-out:
- return page;
-}