|
@@ -913,6 +913,35 @@ int generic_file_fsync(struct file *file, int datasync)
|
|
|
}
|
|
|
EXPORT_SYMBOL(generic_file_fsync);
|
|
|
|
|
|
+/**
|
|
|
+ * generic_check_addressable - Check addressability of file system
|
|
|
+ * @blocksize_bits: log of file system block size
|
|
|
+ * @num_blocks: number of blocks in file system
|
|
|
+ *
|
|
|
+ * Determine whether a file system with @num_blocks blocks (and a
|
|
|
+ * block size of 2**@blocksize_bits) is addressable by the sector_t
|
|
|
+ * and page cache of the system. Return 0 if so and -EFBIG otherwise.
|
|
|
+ */
|
|
|
+int generic_check_addressable(unsigned blocksize_bits, u64 num_blocks)
|
|
|
+{
|
|
|
+ u64 last_fs_block = num_blocks - 1;
|
|
|
+
|
|
|
+ if (unlikely(num_blocks == 0))
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ if ((blocksize_bits < 9) || (blocksize_bits > PAGE_CACHE_SHIFT))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if ((last_fs_block >
|
|
|
+ (sector_t)(~0ULL) >> (blocksize_bits - 9)) ||
|
|
|
+ (last_fs_block >
|
|
|
+ (pgoff_t)(~0ULL) >> (PAGE_CACHE_SHIFT - blocksize_bits))) {
|
|
|
+ return -EFBIG;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(generic_check_addressable);
|
|
|
+
|
|
|
/*
|
|
|
* No-op implementation of ->fsync for in-memory filesystems.
|
|
|
*/
|