diff options
Diffstat (limited to 'fs/libfs.c')
-rw-r--r-- | fs/libfs.c | 37 |
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 | */ |
893 | int generic_file_fsync(struct file *file, int datasync) | 893 | int 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 | } |
914 | EXPORT_SYMBOL(generic_file_fsync); | 910 | EXPORT_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 | */ | ||
921 | int 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 | } | ||
939 | EXPORT_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 | */ |