diff options
Diffstat (limited to 'fs/logfs/readwrite.c')
| -rw-r--r-- | fs/logfs/readwrite.c | 14 | 
1 files changed, 13 insertions, 1 deletions
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index 7a23b3e7c0a..bff40253dfb 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c @@ -18,6 +18,7 @@   */  #include "logfs.h"  #include <linux/sched.h> +#include <linux/slab.h>  static u64 adjust_bix(u64 bix, level_t level)  { @@ -1594,7 +1595,6 @@ int logfs_delete(struct inode *inode, pgoff_t index,  	return ret;  } -/* Rewrite cannot mark the inode dirty but has to write it immediatly. */  int logfs_rewrite_block(struct inode *inode, u64 bix, u64 ofs,  		gc_level_t gc_level, long flags)  { @@ -1611,6 +1611,18 @@ int logfs_rewrite_block(struct inode *inode, u64 bix, u64 ofs,  		if (level != 0)  			alloc_indirect_block(inode, page, 0);  		err = logfs_write_buf(inode, page, flags); +		if (!err && shrink_level(gc_level) == 0) { +			/* Rewrite cannot mark the inode dirty but has to +			 * write it immediatly. +			 * Q: Can't we just create an alias for the inode +			 * instead?  And if not, why not? +			 */ +			if (inode->i_ino == LOGFS_INO_MASTER) +				logfs_write_anchor(inode->i_sb); +			else { +				err = __logfs_write_inode(inode, flags); +			} +		}  	}  	logfs_put_write_page(page);  	return err;  | 
