]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - include/linux/kernfs.h
Merge branch 'parisc-5.5-1' of git://git.kernel.org/pub/scm/linux/kernel/git/deller...
[linux.git] / include / linux / kernfs.h
index 936b61bd504e45848444ae67bc218466379e8b7a..dded2e5a9f425902b85dcd0300c9cb3c4977e554 100644 (file)
@@ -104,21 +104,6 @@ struct kernfs_elem_attr {
        struct kernfs_node      *notify_next;   /* for kernfs_notify() */
 };
 
-/* represent a kernfs node */
-union kernfs_node_id {
-       struct {
-               /*
-                * blktrace will export this struct as a simplified 'struct
-                * fid' (which is a big data struction), so userspace can use
-                * it to find kernfs node. The layout must match the first two
-                * fields of 'struct fid' exactly.
-                */
-               u32             ino;
-               u32             generation;
-       };
-       u64                     id;
-};
-
 /*
  * kernfs_node - the building block of kernfs hierarchy.  Each and every
  * kernfs node is represented by single kernfs_node.  Most fields are
@@ -155,7 +140,12 @@ struct kernfs_node {
 
        void                    *priv;
 
-       union kernfs_node_id    id;
+       /*
+        * 64bit unique ID.  On 64bit ino setups, id is the ino.  On 32bit,
+        * the low 32bits are ino and upper generation.
+        */
+       u64                     id;
+
        unsigned short          flags;
        umode_t                 mode;
        struct kernfs_iattrs    *iattr;
@@ -187,7 +177,8 @@ struct kernfs_root {
 
        /* private fields, do not use outside kernfs proper */
        struct idr              ino_idr;
-       u32                     next_generation;
+       u32                     last_id_lowbits;
+       u32                     id_highbits;
        struct kernfs_syscall_ops *syscall_ops;
 
        /* list of kernfs_super_info of this root, protected by kernfs_mutex */
@@ -291,6 +282,34 @@ static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)
        return kn->flags & KERNFS_TYPE_MASK;
 }
 
+static inline ino_t kernfs_id_ino(u64 id)
+{
+       /* id is ino if ino_t is 64bit; otherwise, low 32bits */
+       if (sizeof(ino_t) >= sizeof(u64))
+               return id;
+       else
+               return (u32)id;
+}
+
+static inline u32 kernfs_id_gen(u64 id)
+{
+       /* gen is fixed at 1 if ino_t is 64bit; otherwise, high 32bits */
+       if (sizeof(ino_t) >= sizeof(u64))
+               return 1;
+       else
+               return id >> 32;
+}
+
+static inline ino_t kernfs_ino(struct kernfs_node *kn)
+{
+       return kernfs_id_ino(kn->id);
+}
+
+static inline ino_t kernfs_gen(struct kernfs_node *kn)
+{
+       return kernfs_id_gen(kn->id);
+}
+
 /**
  * kernfs_enable_ns - enable namespace under a directory
  * @kn: directory of interest, should be empty
@@ -382,8 +401,8 @@ void kernfs_kill_sb(struct super_block *sb);
 
 void kernfs_init(void);
 
-struct kernfs_node *kernfs_get_node_by_id(struct kernfs_root *root,
-       const union kernfs_node_id *id);
+struct kernfs_node *kernfs_find_and_get_node_by_id(struct kernfs_root *root,
+                                                  u64 id);
 #else  /* CONFIG_KERNFS */
 
 static inline enum kernfs_node_type kernfs_type(struct kernfs_node *kn)