vserver 2.0 rc7
[linux-2.6.git] / include / linux / backing-dev.h
index 3c369c6..f7a1390 100644 (file)
@@ -25,13 +25,39 @@ typedef int (congested_fn)(void *, int);
 struct backing_dev_info {
        unsigned long ra_pages; /* max readahead in PAGE_CACHE_SIZE units */
        unsigned long state;    /* Always use atomic bitops on this */
-       int memory_backed;      /* Cannot clean pages with writepage */
+       unsigned int capabilities; /* Device capabilities */
        congested_fn *congested_fn; /* Function pointer if device is md/dm */
        void *congested_data;   /* Pointer to aux data for congested func */
        void (*unplug_io_fn)(struct backing_dev_info *, struct page *);
        void *unplug_io_data;
 };
 
+
+/*
+ * 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
+ */
+#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_VMFLAGS \
+       (BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP)
+
+#if defined(VM_MAYREAD) && \
+       (BDI_CAP_READ_MAP != VM_MAYREAD || \
+        BDI_CAP_WRITE_MAP != VM_MAYWRITE || \
+        BDI_CAP_EXEC_MAP != VM_MAYEXEC)
+#error please change backing_dev_info::capabilities flags
+#endif
+
 extern struct backing_dev_info default_backing_dev_info;
 void default_unplug_io_fn(struct backing_dev_info *bdi, struct page *page);
 
@@ -62,4 +88,17 @@ static inline int bdi_rw_congested(struct backing_dev_info *bdi)
                                  (1 << BDI_write_congested));
 }
 
+#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))
+
+#define mapping_cap_writeback_dirty(mapping) \
+       bdi_cap_writeback_dirty((mapping)->backing_dev_info)
+
+#define mapping_cap_account_dirty(mapping) \
+       bdi_cap_account_dirty((mapping)->backing_dev_info)
+
+
 #endif         /* _LINUX_BACKING_DEV_H */