struct obdo *oa;
struct inode * inode = NULL;
ino_t ino;
- int err;
-
+
ENTRY;
if (dentry->d_name.len > EXT2_NAME_LEN)
return ERR_PTR(-ENAMETOOLONG);
}
inode = iget4(dir->i_sb, ino, NULL, oa);
+ obdo_free(oa);
- if (!inode) {
- obdo_free(oa);
+ if (!inode)
return ERR_PTR(-EACCES);
- }
-
- err = IOPS(inode, getattr)(IID(inode), oa);
- if (err) {
- printk(__FUNCTION__ ": obd_getattr fails (%d)\n", err);
- } else {
-#ifdef CHECK_SIZE
- if (inode->i_size != oa->o_size)
- CDEBUG(D_SUPER, "update %Ld size to %Ld\n",
- inode->i_size, oa->o_size);
-#endif
- obdfs_set_size (inode, oa->o_size);
- }
- obdo_free(oa);
negative:
d_add(dentry, inode);
err = IOPS(inode, brw)(rw, IID(inode), num_obdo, &oa, &bufs_per_obdo,
&page, &count, &offset, &flags);
if ( !err )
- obdfs_set_size (inode, oa->o_size); /* copy o_blocks to i_blocks */
-
-
+ obdfs_to_inode(inode, oa); /* copy o_blocks to i_blocks */
obdo_free(oa);
EXIT;
--num_obdos;
CDEBUG(D_INFO, "free obdo %ld\n",(long)obdos[num_obdos]->o_id);
/* copy o_blocks to i_blocks */
- obdfs_set_size (inodes[num_obdos], obdos[num_obdos]->o_size);
+ obdfs_to_inode(inodes[num_obdos], obdos[num_obdos]);
obdo_free(obdos[num_obdos]);
}
CDEBUG(D_INFO, "obdo_free done\n");
int rc;
struct inode *inode = page->mapping->host;
loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
- // XXX test with synchronous writes
- rc = obdfs_do_writepage(page, 1);
+ rc = obdfs_do_writepage(page, 0);
kunmap(page);
if (pos > inode->i_size) {
- obdfs_set_size (inode, pos);
+ inode->i_size = pos;
obdfs_change_inode(inode);
}
return 0;
EXIT;
return;
}
-
- obdfs_set_size (inode, inode->i_size);
oa = obdo_alloc();
if ( !oa ) {
/* XXX This would give an inconsistent FS, so deal with it as
char *version = NULL;
int devno;
int err;
+ unsigned long blocksize;
+ unsigned long blocksize_bits;
unsigned long root_ino;
int scratch;
struct obdo *oa;
sbi->osi_super = sb;
CDEBUG(D_INFO, "\n");
+ err = sbi->osi_ops->o_get_info(&sbi->osi_conn, strlen("blocksize"),
+ "blocksize", &scratch,
+ (void *)&blocksize);
+ if ( err ) {
+ printk("getinfo call to drive failed (blocksize)\n");
+ EXIT;
+ goto ERR;
+ }
+
+ CDEBUG(D_INFO, "\n");
+ err = sbi->osi_ops->o_get_info(&sbi->osi_conn, strlen("blocksize_bits"),
+ "blocksize_bits", &scratch,
+ (void *)&blocksize_bits);
+ if ( err ) {
+ printk("getinfo call to drive failed (blocksize_bits)\n");
+ EXIT;
+ goto ERR;
+ }
+
+ CDEBUG(D_INFO, "\n");
err = sbi->osi_ops->o_get_info(&sbi->osi_conn, strlen("root_ino"),
"root_ino", &scratch, (void *)&root_ino);
if ( err ) {
}
CDEBUG(D_INFO, "\n");
- sb->s_blocksize = PAGE_SIZE;
- sb->s_blocksize_bits = (unsigned char)PAGE_SHIFT;
+ sb->s_blocksize = blocksize;
+ sb->s_blocksize_bits = (unsigned char)blocksize_bits;
sb->s_magic = OBDFS_SUPER_MAGIC;
sb->s_op = &obdfs_super_operations;
}
CDEBUG(D_INFO, "obdfs_read_super: sbdev %d, rootino: %ld, dev %s, "
- "minor: %d, blocksize: %ld, blocksize bits %d\n",
+ "minor: %d, blocksize: %ld, blocksize bits %ld\n",
sb->s_dev, root->i_ino, device, MINOR(devno),
- sb->s_blocksize, sb->s_blocksize_bits);
+ blocksize, blocksize_bits);
sb->s_root = d_alloc_root(root);
list_add(&sbi->osi_list, &obdfs_super_list);
OBD_FREE(device, strlen(device) + 1);
return;
}
- oa->o_valid = OBD_MD_FLNOTOBD & ~(mask | OBD_MD_FLSIZE | OBD_MD_FLBLOCKS);
+ oa->o_valid = OBD_MD_FLNOTOBD & (~mask);
obdfs_from_inode(oa, inode);
err = IOPS(inode, setattr)(IID(inode), oa);
int obdfs_setattr(struct dentry *de, struct iattr *attr)
{
struct inode *inode = de->d_inode;
- struct obdo *oa, ooa;
+ struct obdo *oa;
int err;
ENTRY;
inode_copy_attr(inode, attr);
oa->o_id = inode->i_ino;
obdo_from_iattr(oa, attr);
-
- memcpy (&ooa, oa, sizeof (ooa));
- err = IOPS(inode, getattr)(IID(inode), &ooa);
- if (err) {
- printk(__FUNCTION__ ": obd_getattr fails (%d)\n", err);
- } else {
-#ifdef CHECK_SIZE
- if (oa->o_size != ooa.o_size) {
- printk(__FUNCTION__ ": oa->o_size %Ld != ooa.o_size %Ld\n",
- oa->o_size, ooa.o_size);
- }
-#endif
- }
-
- oa->o_valid &= ~(OBD_MD_FLSIZE | OBD_MD_FLBLOCKS);
err = IOPS(inode, setattr)(IID(inode), oa);
if ( err )
struct obdo *oa = opaque;
ENTRY;
- obdfs_to_inode(inode, oa);
+ obdfs_to_inode(inode, oa);
INIT_LIST_HEAD(obdfs_iplist(inode)); /* list of dirty pages on inode */
INIT_LIST_HEAD(obdfs_islist(inode)); /* list of inodes in superblock */