|
@@ -12,6 +12,7 @@
|
|
#include <linux/log2.h>
|
|
#include <linux/log2.h>
|
|
#include <linux/proportions.h>
|
|
#include <linux/proportions.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/kernel.h>
|
|
|
|
+#include <linux/fs.h>
|
|
#include <asm/atomic.h>
|
|
#include <asm/atomic.h>
|
|
|
|
|
|
struct page;
|
|
struct page;
|
|
@@ -151,22 +152,43 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Flags in backing_dev_info::capability
|
|
* Flags in backing_dev_info::capability
|
|
- * - The first two flags control whether dirty pages will contribute to the
|
|
|
|
- * VM's accounting and whether writepages() should be called for dirty pages
|
|
|
|
- * (something that would not, for example, be appropriate for ramfs)
|
|
|
|
- * - These flags let !MMU mmap() govern direct device mapping vs immediate
|
|
|
|
- * copying more easily for MAP_PRIVATE, especially for ROM filesystems
|
|
|
|
|
|
+ *
|
|
|
|
+ * The first three flags control whether dirty pages will contribute to the
|
|
|
|
+ * VM's accounting and whether writepages() should be called for dirty pages
|
|
|
|
+ * (something that would not, for example, be appropriate for ramfs)
|
|
|
|
+ *
|
|
|
|
+ * WARNING: these flags are closely related and should not normally be
|
|
|
|
+ * used separately. The BDI_CAP_NO_ACCT_AND_WRITEBACK combines these
|
|
|
|
+ * three flags into a single convenience macro.
|
|
|
|
+ *
|
|
|
|
+ * BDI_CAP_NO_ACCT_DIRTY: Dirty pages shouldn't contribute to accounting
|
|
|
|
+ * BDI_CAP_NO_WRITEBACK: Don't write pages back
|
|
|
|
+ * BDI_CAP_NO_ACCT_WB: Don't automatically account writeback pages
|
|
|
|
+ *
|
|
|
|
+ * These flags let !MMU mmap() govern direct device mapping vs immediate
|
|
|
|
+ * copying more easily for MAP_PRIVATE, especially for ROM filesystems.
|
|
|
|
+ *
|
|
|
|
+ * BDI_CAP_MAP_COPY: Copy can be mapped (MAP_PRIVATE)
|
|
|
|
+ * BDI_CAP_MAP_DIRECT: Can be mapped directly (MAP_SHARED)
|
|
|
|
+ * BDI_CAP_READ_MAP: Can be mapped for reading
|
|
|
|
+ * BDI_CAP_WRITE_MAP: Can be mapped for writing
|
|
|
|
+ * BDI_CAP_EXEC_MAP: Can be mapped for execution
|
|
*/
|
|
*/
|
|
-#define BDI_CAP_NO_ACCT_DIRTY 0x00000001 /* Dirty pages shouldn't contribute to accounting */
|
|
|
|
-#define BDI_CAP_NO_WRITEBACK 0x00000002 /* Don't write pages back */
|
|
|
|
-#define BDI_CAP_MAP_COPY 0x00000004 /* Copy can be mapped (MAP_PRIVATE) */
|
|
|
|
-#define BDI_CAP_MAP_DIRECT 0x00000008 /* Can be mapped directly (MAP_SHARED) */
|
|
|
|
-#define BDI_CAP_READ_MAP 0x00000010 /* Can be mapped for reading */
|
|
|
|
-#define BDI_CAP_WRITE_MAP 0x00000020 /* Can be mapped for writing */
|
|
|
|
-#define BDI_CAP_EXEC_MAP 0x00000040 /* Can be mapped for execution */
|
|
|
|
|
|
+#define BDI_CAP_NO_ACCT_DIRTY 0x00000001
|
|
|
|
+#define BDI_CAP_NO_WRITEBACK 0x00000002
|
|
|
|
+#define BDI_CAP_MAP_COPY 0x00000004
|
|
|
|
+#define BDI_CAP_MAP_DIRECT 0x00000008
|
|
|
|
+#define BDI_CAP_READ_MAP 0x00000010
|
|
|
|
+#define BDI_CAP_WRITE_MAP 0x00000020
|
|
|
|
+#define BDI_CAP_EXEC_MAP 0x00000040
|
|
|
|
+#define BDI_CAP_NO_ACCT_WB 0x00000080
|
|
|
|
+
|
|
#define BDI_CAP_VMFLAGS \
|
|
#define BDI_CAP_VMFLAGS \
|
|
(BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP)
|
|
(BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP)
|
|
|
|
|
|
|
|
+#define BDI_CAP_NO_ACCT_AND_WRITEBACK \
|
|
|
|
+ (BDI_CAP_NO_WRITEBACK | BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_ACCT_WB)
|
|
|
|
+
|
|
#if defined(VM_MAYREAD) && \
|
|
#if defined(VM_MAYREAD) && \
|
|
(BDI_CAP_READ_MAP != VM_MAYREAD || \
|
|
(BDI_CAP_READ_MAP != VM_MAYREAD || \
|
|
BDI_CAP_WRITE_MAP != VM_MAYWRITE || \
|
|
BDI_CAP_WRITE_MAP != VM_MAYWRITE || \
|
|
@@ -206,17 +228,32 @@ void clear_bdi_congested(struct backing_dev_info *bdi, int rw);
|
|
void set_bdi_congested(struct backing_dev_info *bdi, int rw);
|
|
void set_bdi_congested(struct backing_dev_info *bdi, int rw);
|
|
long congestion_wait(int rw, long timeout);
|
|
long congestion_wait(int rw, long timeout);
|
|
|
|
|
|
-#define bdi_cap_writeback_dirty(bdi) \
|
|
|
|
- (!((bdi)->capabilities & BDI_CAP_NO_WRITEBACK))
|
|
|
|
|
|
|
|
-#define bdi_cap_account_dirty(bdi) \
|
|
|
|
- (!((bdi)->capabilities & BDI_CAP_NO_ACCT_DIRTY))
|
|
|
|
|
|
+static inline bool bdi_cap_writeback_dirty(struct backing_dev_info *bdi)
|
|
|
|
+{
|
|
|
|
+ return !(bdi->capabilities & BDI_CAP_NO_WRITEBACK);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static inline bool bdi_cap_account_dirty(struct backing_dev_info *bdi)
|
|
|
|
+{
|
|
|
|
+ return !(bdi->capabilities & BDI_CAP_NO_ACCT_DIRTY);
|
|
|
|
+}
|
|
|
|
|
|
-#define mapping_cap_writeback_dirty(mapping) \
|
|
|
|
- bdi_cap_writeback_dirty((mapping)->backing_dev_info)
|
|
|
|
|
|
+static inline bool bdi_cap_account_writeback(struct backing_dev_info *bdi)
|
|
|
|
+{
|
|
|
|
+ /* Paranoia: BDI_CAP_NO_WRITEBACK implies BDI_CAP_NO_ACCT_WB */
|
|
|
|
+ return !(bdi->capabilities & (BDI_CAP_NO_ACCT_WB |
|
|
|
|
+ BDI_CAP_NO_WRITEBACK));
|
|
|
|
+}
|
|
|
|
|
|
-#define mapping_cap_account_dirty(mapping) \
|
|
|
|
- bdi_cap_account_dirty((mapping)->backing_dev_info)
|
|
|
|
|
|
+static inline bool mapping_cap_writeback_dirty(struct address_space *mapping)
|
|
|
|
+{
|
|
|
|
+ return bdi_cap_writeback_dirty(mapping->backing_dev_info);
|
|
|
|
+}
|
|
|
|
|
|
|
|
+static inline bool mapping_cap_account_dirty(struct address_space *mapping)
|
|
|
|
+{
|
|
|
|
+ return bdi_cap_account_dirty(mapping->backing_dev_info);
|
|
|
|
+}
|
|
|
|
|
|
#endif /* _LINUX_BACKING_DEV_H */
|
|
#endif /* _LINUX_BACKING_DEV_H */
|