]> Pileus Git - ~andy/linux/blobdiff - include/linux/dcache.h
VFS: Put a small type field into struct dentry::d_flags
[~andy/linux] / include / linux / dcache.h
index 716c3760ee3970908577ccdb4ea32fa0275d7e33..57e87e749a484cbf09a2f9f21fac3d3f52574df9 100644 (file)
@@ -169,13 +169,13 @@ struct dentry_operations {
  */
 
 /* d_flags entries */
-#define DCACHE_OP_HASH         0x0001
-#define DCACHE_OP_COMPARE      0x0002
-#define DCACHE_OP_REVALIDATE   0x0004
-#define DCACHE_OP_DELETE       0x0008
-#define DCACHE_OP_PRUNE         0x0010
+#define DCACHE_OP_HASH                 0x00000001
+#define DCACHE_OP_COMPARE              0x00000002
+#define DCACHE_OP_REVALIDATE           0x00000004
+#define DCACHE_OP_DELETE               0x00000008
+#define DCACHE_OP_PRUNE                        0x00000010
 
-#define        DCACHE_DISCONNECTED     0x0020
+#define        DCACHE_DISCONNECTED             0x00000020
      /* This dentry is possibly not currently connected to the dcache tree, in
       * which case its parent will either be itself, or will have this flag as
       * well.  nfsd will not use a dentry with this bit set, but will first
@@ -186,30 +186,38 @@ struct dentry_operations {
       * dentry into place and return that dentry rather than the passed one,
       * typically using d_splice_alias. */
 
-#define DCACHE_REFERENCED      0x0040  /* Recently used, don't discard. */
-#define DCACHE_RCUACCESS       0x0080  /* Entry has ever been RCU-visible */
+#define DCACHE_REFERENCED              0x00000040 /* Recently used, don't discard. */
+#define DCACHE_RCUACCESS               0x00000080 /* Entry has ever been RCU-visible */
 
-#define DCACHE_CANT_MOUNT      0x0100
-#define DCACHE_GENOCIDE                0x0200
-#define DCACHE_SHRINK_LIST     0x0400
+#define DCACHE_CANT_MOUNT              0x00000100
+#define DCACHE_GENOCIDE                        0x00000200
+#define DCACHE_SHRINK_LIST             0x00000400
 
-#define DCACHE_OP_WEAK_REVALIDATE      0x0800
+#define DCACHE_OP_WEAK_REVALIDATE      0x00000800
 
-#define DCACHE_NFSFS_RENAMED   0x1000
+#define DCACHE_NFSFS_RENAMED           0x00001000
      /* this dentry has been "silly renamed" and has to be deleted on the last
       * dput() */
-#define DCACHE_COOKIE          0x2000  /* For use by dcookie subsystem */
-#define DCACHE_FSNOTIFY_PARENT_WATCHED 0x4000
+#define DCACHE_COOKIE                  0x00002000 /* For use by dcookie subsystem */
+#define DCACHE_FSNOTIFY_PARENT_WATCHED 0x00004000
      /* Parent inode is watched by some fsnotify listener */
 
-#define DCACHE_MOUNTED         0x10000 /* is a mountpoint */
-#define DCACHE_NEED_AUTOMOUNT  0x20000 /* handle automount on this dir */
-#define DCACHE_MANAGE_TRANSIT  0x40000 /* manage transit from this dirent */
+#define DCACHE_DENTRY_KILLED           0x00008000
+
+#define DCACHE_MOUNTED                 0x00010000 /* is a mountpoint */
+#define DCACHE_NEED_AUTOMOUNT          0x00020000 /* handle automount on this dir */
+#define DCACHE_MANAGE_TRANSIT          0x00040000 /* manage transit from this dirent */
 #define DCACHE_MANAGED_DENTRY \
        (DCACHE_MOUNTED|DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT)
 
-#define DCACHE_LRU_LIST                0x80000
-#define DCACHE_DENTRY_KILLED   0x100000
+#define DCACHE_LRU_LIST                        0x00080000
+
+#define DCACHE_ENTRY_TYPE              0x00700000
+#define DCACHE_MISS_TYPE               0x00000000 /* Negative dentry */
+#define DCACHE_DIRECTORY_TYPE          0x00100000 /* Normal directory */
+#define DCACHE_AUTODIR_TYPE            0x00200000 /* Lookupless directory (presumed automount) */
+#define DCACHE_SYMLINK_TYPE            0x00300000 /* Symlink */
+#define DCACHE_FILE_TYPE               0x00400000 /* Other file type */
 
 extern seqlock_t rename_lock;
 
@@ -394,6 +402,61 @@ static inline bool d_mountpoint(const struct dentry *dentry)
        return dentry->d_flags & DCACHE_MOUNTED;
 }
 
+/*
+ * Directory cache entry type accessor functions.
+ */
+static inline void __d_set_type(struct dentry *dentry, unsigned type)
+{
+       dentry->d_flags = (dentry->d_flags & ~DCACHE_ENTRY_TYPE) | type;
+}
+
+static inline void __d_clear_type(struct dentry *dentry)
+{
+       __d_set_type(dentry, DCACHE_MISS_TYPE);
+}
+
+static inline void d_set_type(struct dentry *dentry, unsigned type)
+{
+       spin_lock(&dentry->d_lock);
+       __d_set_type(dentry, type);
+       spin_unlock(&dentry->d_lock);
+}
+
+static inline unsigned __d_entry_type(const struct dentry *dentry)
+{
+       return dentry->d_flags & DCACHE_ENTRY_TYPE;
+}
+
+static inline bool d_is_directory(const struct dentry *dentry)
+{
+       return __d_entry_type(dentry) == DCACHE_DIRECTORY_TYPE;
+}
+
+static inline bool d_is_autodir(const struct dentry *dentry)
+{
+       return __d_entry_type(dentry) == DCACHE_AUTODIR_TYPE;
+}
+
+static inline bool d_is_symlink(const struct dentry *dentry)
+{
+       return __d_entry_type(dentry) == DCACHE_SYMLINK_TYPE;
+}
+
+static inline bool d_is_file(const struct dentry *dentry)
+{
+       return __d_entry_type(dentry) == DCACHE_FILE_TYPE;
+}
+
+static inline bool d_is_negative(const struct dentry *dentry)
+{
+       return __d_entry_type(dentry) == DCACHE_MISS_TYPE;
+}
+
+static inline bool d_is_positive(const struct dentry *dentry)
+{
+       return !d_is_negative(dentry);
+}
+
 extern int sysctl_vfs_cache_pressure;
 
 static inline unsigned long vfs_pressure_ratio(unsigned long val)