aboutsummaryrefslogtreecommitdiffstats
path: root/fs/libfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/libfs.c')
-rw-r--r--fs/libfs.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/fs/libfs.c b/fs/libfs.c
index 0a9da95317f..304a5132ca2 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -255,7 +255,7 @@ int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *den
255 255
256 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; 256 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
257 inc_nlink(inode); 257 inc_nlink(inode);
258 atomic_inc(&inode->i_count); 258 ihold(inode);
259 dget(dentry); 259 dget(dentry);
260 d_instantiate(dentry, inode); 260 d_instantiate(dentry, inode);
261 return 0; 261 return 0;
@@ -892,10 +892,6 @@ EXPORT_SYMBOL_GPL(generic_fh_to_parent);
892 */ 892 */
893int generic_file_fsync(struct file *file, int datasync) 893int generic_file_fsync(struct file *file, int datasync)
894{ 894{
895 struct writeback_control wbc = {
896 .sync_mode = WB_SYNC_ALL,
897 .nr_to_write = 0, /* metadata-only; caller takes care of data */
898 };
899 struct inode *inode = file->f_mapping->host; 895 struct inode *inode = file->f_mapping->host;
900 int err; 896 int err;
901 int ret; 897 int ret;
@@ -906,13 +902,42 @@ int generic_file_fsync(struct file *file, int datasync)
906 if (datasync && !(inode->i_state & I_DIRTY_DATASYNC)) 902 if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
907 return ret; 903 return ret;
908 904
909 err = sync_inode(inode, &wbc); 905 err = sync_inode_metadata(inode, 1);
910 if (ret == 0) 906 if (ret == 0)
911 ret = err; 907 ret = err;
912 return ret; 908 return ret;
913} 909}
914EXPORT_SYMBOL(generic_file_fsync); 910EXPORT_SYMBOL(generic_file_fsync);
915 911
912/**
913 * generic_check_addressable - Check addressability of file system
914 * @blocksize_bits: log of file system block size
915 * @num_blocks: number of blocks in file system
916 *
917 * Determine whether a file system with @num_blocks blocks (and a
918 * block size of 2**@blocksize_bits) is addressable by the sector_t
919 * and page cache of the system. Return 0 if so and -EFBIG otherwise.
920 */
921int generic_check_addressable(unsigned blocksize_bits, u64 num_blocks)
922{
923 u64 last_fs_block = num_blocks - 1;
924 u64 last_fs_page =
925 last_fs_block >> (PAGE_CACHE_SHIFT - blocksize_bits);
926
927 if (unlikely(num_blocks == 0))
928 return 0;
929
930 if ((blocksize_bits < 9) || (blocksize_bits > PAGE_CACHE_SHIFT))
931 return -EINVAL;
932
933 if ((last_fs_block > (sector_t)(~0ULL) >> (blocksize_bits - 9)) ||
934 (last_fs_page > (pgoff_t)(~0ULL))) {
935 return -EFBIG;
936 }
937 return 0;
938}
939EXPORT_SYMBOL(generic_check_addressable);
940
916/* 941/*
917 * No-op implementation of ->fsync for in-memory filesystems. 942 * No-op implementation of ->fsync for in-memory filesystems.
918 */ 943 */