diff options
Diffstat (limited to 'fs/logfs/file.c')
-rw-r--r-- | fs/logfs/file.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/fs/logfs/file.c b/fs/logfs/file.c index 370f367a933e..4dd0f7c06e39 100644 --- a/fs/logfs/file.c +++ b/fs/logfs/file.c | |||
@@ -161,7 +161,17 @@ static int logfs_writepage(struct page *page, struct writeback_control *wbc) | |||
161 | 161 | ||
162 | static void logfs_invalidatepage(struct page *page, unsigned long offset) | 162 | static void logfs_invalidatepage(struct page *page, unsigned long offset) |
163 | { | 163 | { |
164 | move_page_to_btree(page); | 164 | struct logfs_block *block = logfs_block(page); |
165 | |||
166 | if (block->reserved_bytes) { | ||
167 | struct super_block *sb = page->mapping->host->i_sb; | ||
168 | struct logfs_super *super = logfs_super(sb); | ||
169 | |||
170 | super->s_dirty_pages -= block->reserved_bytes; | ||
171 | block->ops->free_block(sb, block); | ||
172 | BUG_ON(bitmap_weight(block->alias_map, LOGFS_BLOCK_FACTOR)); | ||
173 | } else | ||
174 | move_page_to_btree(page); | ||
165 | BUG_ON(PagePrivate(page) || page->private); | 175 | BUG_ON(PagePrivate(page) || page->private); |
166 | } | 176 | } |
167 | 177 | ||
@@ -209,13 +219,11 @@ int logfs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
209 | } | 219 | } |
210 | } | 220 | } |
211 | 221 | ||
212 | int logfs_fsync(struct file *file, struct dentry *dentry, int datasync) | 222 | int logfs_fsync(struct file *file, int datasync) |
213 | { | 223 | { |
214 | struct super_block *sb = dentry->d_inode->i_sb; | 224 | struct super_block *sb = file->f_mapping->host->i_sb; |
215 | struct logfs_super *super = logfs_super(sb); | ||
216 | 225 | ||
217 | /* FIXME: write anchor */ | 226 | logfs_write_anchor(sb); |
218 | super->s_devops->sync(sb); | ||
219 | return 0; | 227 | return 0; |
220 | } | 228 | } |
221 | 229 | ||
@@ -224,15 +232,19 @@ static int logfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
224 | struct inode *inode = dentry->d_inode; | 232 | struct inode *inode = dentry->d_inode; |
225 | int err = 0; | 233 | int err = 0; |
226 | 234 | ||
227 | if (attr->ia_valid & ATTR_SIZE) | 235 | err = inode_change_ok(inode, attr); |
236 | if (err) | ||
237 | return err; | ||
238 | |||
239 | if (attr->ia_valid & ATTR_SIZE) { | ||
228 | err = logfs_truncate(inode, attr->ia_size); | 240 | err = logfs_truncate(inode, attr->ia_size); |
229 | attr->ia_valid &= ~ATTR_SIZE; | 241 | if (err) |
242 | return err; | ||
243 | } | ||
230 | 244 | ||
231 | if (!err) | 245 | setattr_copy(inode, attr); |
232 | err = inode_change_ok(inode, attr); | 246 | mark_inode_dirty(inode); |
233 | if (!err) | 247 | return 0; |
234 | err = inode_setattr(inode, attr); | ||
235 | return err; | ||
236 | } | 248 | } |
237 | 249 | ||
238 | const struct inode_operations logfs_reg_iops = { | 250 | const struct inode_operations logfs_reg_iops = { |