28 #include <asm/uaccess.h>
30 #include <linux/errno.h>
32 #include <linux/time.h>
33 #include <linux/stat.h>
34 #include <linux/string.h>
52 indirect_blocks =
ptrs,
53 double_blocks = (1 << (ptrs_bits * 2));
57 UFSD(
"ptrs=uspi->s_apb = %d,double_blocks=%ld \n",ptrs,double_blocks);
58 if (i_block < direct_blocks) {
59 offsets[n++] = i_block;
60 }
else if ((i_block -= direct_blocks) < indirect_blocks) {
62 offsets[n++] = i_block;
63 }
else if ((i_block -= indirect_blocks) < double_blocks) {
65 offsets[n++] = i_block >> ptrs_bits;
66 offsets[n++] = i_block & (ptrs - 1);
67 }
else if (((i_block -= double_blocks) >> (ptrs_bits * 2)) <
ptrs) {
69 offsets[n++] = i_block >> (ptrs_bits * 2);
70 offsets[n++] = (i_block >> ptrs_bits) & (ptrs - 1);
71 offsets[n++] = i_block & (ptrs - 1);
83 static u64 ufs_frag_map(
struct inode *inode,
sector_t frag,
bool needs_lock)
91 int depth = ufs_block_to_path(inode, frag >> uspi->
s_fpbshift, offsets);
95 unsigned flags = UFS_SB(sb)->s_flags;
98 UFSD(
": frag = %llu depth = %d\n", (
unsigned long long)frag,
depth);
99 UFSD(
": uspi->s_fpbshift = %d ,uspi->s_apbmask = %x, mask=%llx\n",
101 (
unsigned long long)mask);
117 struct buffer_head *bh;
120 bh = sb_bread(sb, uspi->
s_sbbase + fs32_to_cpu(sb, block)+(n>>shift));
137 struct buffer_head *bh;
141 temp = (
u64)(uspi->
s_sbbase) + fs64_to_cpu(sb, u2_block);
142 bh = sb_bread(sb, temp +(
u64) (n>>shift));
150 temp = (
u64)uspi->
s_sbbase + fs64_to_cpu(sb, u2_block);
172 static struct buffer_head *
173 ufs_inode_getfrag(
struct inode *inode,
u64 fragment,
174 sector_t new_fragment,
unsigned int required,
int *
err,
175 long *
phys,
int *
new,
struct page *locked_page)
180 struct buffer_head *
result;
181 unsigned blockoff, lastblockoff;
185 UFSD(
"ENTER, ino %lu, fragment %llu, new_fragment %llu, required %u, "
186 "metadata %d\n", inode->
i_ino, (
unsigned long long)fragment,
187 (
unsigned long long)new_fragment, required, !phys);
196 p = ufs_get_direct_data_ptr(uspi, ufsi, block);
201 tmp = ufs_data_ptr_to_cpu(sb, p);
204 if (tmp && fragment < lastfrag) {
206 result = sb_getblk(sb, uspi->
s_sbbase + tmp + blockoff);
207 if (tmp == ufs_data_ptr_to_cpu(sb, p)) {
208 UFSD(
"EXIT, result %llu\n",
209 (
unsigned long long)tmp + blockoff);
215 *phys = uspi->
s_sbbase + tmp + blockoff;
225 if (lastblock < block) {
230 p2 = ufs_get_direct_data_ptr(uspi, ufsi, lastblock);
232 ufs_data_ptr_to_cpu(sb, p2),
233 uspi->
s_fpb - lastblockoff,
244 tmp = ufs_data_ptr_to_cpu(sb,
245 ufs_get_direct_data_ptr(uspi, ufsi,
248 goal = tmp + uspi->
s_fpb;
250 goal, required + blockoff,
253 }
else if (lastblock == block) {
258 (blockoff - lastblockoff),
259 ufs_data_ptr_to_cpu(sb, p),
260 required + (blockoff - lastblockoff),
261 err, phys !=
NULL ? locked_page :
NULL);
267 tmp = ufs_data_ptr_to_cpu(sb,
268 ufs_get_direct_data_ptr(uspi, ufsi, block - 1));
270 goal = tmp + uspi->
s_fpb;
273 goal, uspi->
s_fpb, err,
277 if ((!blockoff && ufs_data_ptr_to_cpu(sb, p)) ||
285 result = sb_getblk(sb, uspi->
s_sbbase + tmp + blockoff);
287 *phys = uspi->
s_sbbase + tmp + blockoff;
296 mark_inode_dirty(inode);
297 UFSD(
"EXIT, result %llu\n", (
unsigned long long)tmp + blockoff);
329 static struct buffer_head *
330 ufs_inode_getblock(
struct inode *inode,
struct buffer_head *bh,
332 long *phys,
int *
new,
struct page *locked_page)
336 struct buffer_head *
result;
344 UFSD(
"ENTER, ino %lu, fragment %llu, new_fragment %llu, metadata %d\n",
345 inode->
i_ino, (
unsigned long long)fragment,
346 (
unsigned long long)new_fragment, !phys);
351 if (!buffer_uptodate(bh)) {
354 if (!buffer_uptodate(bh))
358 p = (
__fs64 *)bh->b_data + block;
362 tmp = ufs_data_ptr_to_cpu(sb, p);
365 result = sb_getblk(sb, uspi->
s_sbbase + tmp + blockoff);
366 if (tmp == ufs_data_ptr_to_cpu(sb, p))
371 *phys = uspi->
s_sbbase + tmp + blockoff;
377 (tmp = fs64_to_cpu(sb, ((
__fs64 *)bh->b_data)[block-1])) :
378 (tmp = fs32_to_cpu(sb, ((
__fs32 *)bh->b_data)[block-1]))))
379 goal = tmp + uspi->
s_fpb;
381 goal = bh->b_blocknr + uspi->
s_fpb;
383 uspi->
s_fpb, err, locked_page);
385 if (ufs_data_ptr_to_cpu(sb, p))
392 result = sb_getblk(sb, uspi->
s_sbbase + tmp + blockoff);
394 *phys = uspi->
s_sbbase + tmp + blockoff;
402 mark_inode_dirty(inode);
403 UFSD(
"result %llu\n", (
unsigned long long)tmp + blockoff);
420 struct buffer_head * bh;
427 phys64 = ufs_frag_map(inode, fragment, needs_lock);
428 UFSD(
"phys64 = %llu\n", (
unsigned long long)phys64);
430 map_bh(bh_result, sb, phys64);
444 UFSD(
"ENTER, ino %lu, fragment %llu\n", inode->
i_ino, (
unsigned long long)fragment);
457 #define GET_INODE_DATABLOCK(x) \
458 ufs_inode_getfrag(inode, x, fragment, 1, &err, &phys, &new,\
460 #define GET_INODE_PTR(x) \
461 ufs_inode_getfrag(inode, x, fragment, uspi->s_fpb, &err, NULL, NULL,\
463 #define GET_INDIRECT_DATABLOCK(x) \
464 ufs_inode_getblock(inode, bh, x, fragment, \
465 &err, &phys, &new, bh_result->b_page)
466 #define GET_INDIRECT_PTR(x) \
467 ufs_inode_getblock(inode, bh, x, fragment, \
468 &err, NULL, NULL, NULL)
492 #undef GET_INODE_DATABLOCK
494 #undef GET_INDIRECT_DATABLOCK
495 #undef GET_INDIRECT_PTR
501 set_buffer_new(bh_result);
502 map_bh(bh_result, sb, phys);
530 loff_t
pos,
unsigned len,
unsigned flags,
531 struct page **pagep,
void **fsdata)
538 loff_t isize = mapping->
host->i_size;
539 if (pos + len > isize)
552 .readpage = ufs_readpage,
553 .writepage = ufs_writepage,
554 .write_begin = ufs_write_begin,
559 static void ufs_set_inode_ops(
struct inode *inode)
593 ufs_error (sb,
"ufs_read_inode",
"inode %lu has zero nlink\n", inode->
i_ino);
600 i_uid_write(inode, ufs_get_inode_uid(sb, ufs_inode));
601 i_gid_write(inode, ufs_get_inode_gid(sb, ufs_inode));
634 UFSD(
"Reading ufs2 inode, ino %lu\n", inode->
i_ino);
641 ufs_error (sb,
"ufs_read_inode",
"inode %lu has zero nlink\n", inode->
i_ino);
648 i_uid_write(inode, fs32_to_cpu(sb, ufs2_inode->
ui_uid));
649 i_gid_write(inode, fs32_to_cpu(sb, ufs2_inode->
ui_gid));
681 struct buffer_head * bh;
685 UFSD(
"ENTER, ino %lu\n", ino);
687 if (ino < UFS_ROOTINO || ino > (uspi->
s_ncg * uspi->
s_ipg)) {
688 ufs_warning(sb,
"ufs_read_inode",
"bad inode number (%lu)\n",
690 return ERR_PTR(-
EIO);
703 ufs_warning(sb,
"ufs_read_inode",
"unable to read inode %lu\n",
708 struct ufs2_inode *ufs2_inode = (
struct ufs2_inode *)bh->b_data;
710 err = ufs2_read_inode(inode,
713 struct ufs_inode *ufs_inode = (
struct ufs_inode *)bh->b_data;
715 err = ufs1_read_inode(inode,
727 ufs_set_inode_ops(inode);
737 return ERR_PTR(-
EIO);
740 static void ufs1_update_inode(
struct inode *inode,
struct ufs_inode *ufs_inode)
748 ufs_set_inode_uid(sb, ufs_inode, i_uid_read(inode));
749 ufs_set_inode_gid(sb, ufs_inode, i_gid_read(inode));
780 memset (ufs_inode, 0,
sizeof(
struct ufs_inode));
783 static void ufs2_update_inode(
struct inode *inode,
struct ufs2_inode *ufs_inode)
792 ufs_inode->
ui_uid = cpu_to_fs32(sb, i_uid_read(inode));
793 ufs_inode->
ui_gid = cpu_to_fs32(sb, i_gid_read(inode));
819 memset (ufs_inode, 0,
sizeof(
struct ufs2_inode));
823 static int ufs_update_inode(
struct inode * inode,
int do_sync)
827 struct buffer_head * bh;
833 ufs_warning (sb,
"ufs_read_inode",
"bad inode number (%lu)\n", inode->
i_ino);
839 ufs_warning (sb,
"ufs_read_inode",
"unable to read inode %lu\n", inode->
i_ino);
843 struct ufs2_inode *ufs2_inode = (
struct ufs2_inode *)bh->b_data;
845 ufs2_update_inode(inode,
848 struct ufs_inode *ufs_inode = (
struct ufs_inode *) bh->b_data;
873 return ufs_update_inode (inode, 1);
888 mark_inode_dirty(inode);
889 ufs_update_inode(inode,
IS_SYNC(inode));
890 old_i_size = inode->
i_size;