/* did file size increase? */
/* (no need for i_size_read(); we caller holds i_mutex */
- if (pos+copied > inode->i_size) {
- i_size_write(inode, pos + copied);
- if ((inode->i_size << 1) >= ci->i_max_size &&
- (ci->i_reported_size << 1) < ci->i_max_size)
- ceph_check_caps(ci, GFP_KERNEL);
- }
+ if (pos+copied > inode->i_size)
+ ceph_inode_set_size(inode, pos);
if (!PageUptodate(page))
SetPageUptodate(page);
if (ret > 0) {
pos += ret;
*offset = pos;
-
- spin_lock(&inode->i_lock);
- if (pos > inode->i_size) {
- inode->i_size = pos;
- inode->i_blocks = (inode->i_size + 512 - 1) >> 9;
- dout(10, "extending file size to %lu\n", pos);
- }
- spin_unlock(&inode->i_lock);
+ if (pos > i_size_read(inode))
+ ceph_inode_set_size(inode, pos);
}
return ret;
}
u64 size = le64_to_cpu(info->size);
int issued;
struct timespec mtime, atime, ctime;
- u64 blocks = size + blksize - 1;
- do_div(blocks, blksize);
+ u64 blocks = (size + blksize - 1) >> blkbits;
dout(30, "fill_inode %p ino %llx by %d.%d sz=%llu mode %o nlink %d\n",
inode, info->ino, inode->i_uid, inode->i_gid,
spin_unlock(&ci->vfs_inode.i_lock);
}
+void ceph_inode_set_size(struct inode *inode, loff_t size)
+{
+ struct ceph_inode_info *ci = ceph_inode(inode);
+
+ spin_lock(&inode->i_lock);
+ dout(20, "set_size %p %llu -> %llu\n", inode, inode->i_size, size);
+ inode->i_size = size;
+ inode->i_blocks = (size + (1 << inode->i_blkbits) - 1) >>
+ inode->i_blkbits;
+
+ if ((size << 1) >= ci->i_max_size &&
+ (ci->i_reported_size << 1) < ci->i_max_size) {
+ spin_unlock(&inode->i_lock);
+ ceph_check_caps(ci, GFP_KERNEL);
+ } else
+ spin_unlock(&inode->i_lock);
+}
+
/*
* called on struct file init and release, to safely track which
* capabilities we want due to currently open files
extern void ceph_check_caps(struct ceph_inode_info *ci, gfp_t gfpmask);
extern void ceph_get_mode(struct ceph_inode_info *ci, int mode);
extern void ceph_put_mode(struct ceph_inode_info *ci, int mode);
+extern void ceph_inode_set_size(struct inode *inode, loff_t size);
extern int ceph_setattr(struct dentry *dentry, struct iattr *attr);
extern int ceph_inode_getattr(struct vfsmount *mnt, struct dentry *dentry,