]> granicus.if.org Git - zfs/commitdiff
Add vn_mode_to_vtype/vn_vtype to_mode helpers
authorBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 11 Jan 2011 19:53:05 +0000 (11:53 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 12 Jan 2011 19:38:04 +0000 (11:38 -0800)
Add simple helpers to convert a vnode->v_type to a inode->i_mode.
These should be used sparingly but they are handy to have.

include/sys/mode.h
include/sys/vnode.h
module/spl/spl-vnode.c

index f3d8909448241b65f7a22ce46c40ba050ebc6016..ddd504f9f3609404f07e28b90fd357dee9b3f275 100644 (file)
@@ -25,4 +25,8 @@
 #ifndef _SPL_MODE_H
 #define _SPL_MODE_H
 
+#define IFTOVT(mode)   vn_mode_to_vtype(mode)
+#define VTTOIF(vtype)  vn_vtype_to_mode(vtype)
+#define MAKEIMODE(T, M) (VTTOIF(T) | ((M) & ~S_IFMT))
+
 #endif /* SPL_MODE_H */
index 104e65d15e6cabfc7ef580b176dfb7c3ffe26112..b5969b3520a5169f355b5f0868f44b71bf9b4dd4 100644 (file)
@@ -202,6 +202,8 @@ typedef struct caller_context {
 
 extern vnode_t *vn_alloc(int flag);
 void vn_free(vnode_t *vp);
+extern vtype_t vn_mode_to_vtype(mode_t);
+extern mode_t vn_vtype_to_mode(vtype_t);
 extern int vn_open(const char *path, uio_seg_t seg, int flags, int mode,
                   vnode_t **vpp, int x1, void *x2);
 extern int vn_openat(const char *path, uio_seg_t seg, int flags, int mode,
index 1847c779418e595f8d5a7b4240f1f3df799b06bd..765dc4e2ee4e43327c46f663c1dc9b2e3ac0f7a0 100644 (file)
@@ -42,8 +42,8 @@ static spl_kmem_cache_t *vn_file_cache;
 static spinlock_t vn_file_lock = SPIN_LOCK_UNLOCKED;
 static LIST_HEAD(vn_file_list);
 
-static vtype_t
-vn_get_sol_type(umode_t mode)
+vtype_t
+vn_mode_to_vtype(mode_t mode)
 {
        if (S_ISREG(mode))
                return VREG;
@@ -70,7 +70,36 @@ vn_get_sol_type(umode_t mode)
                return VCHR;
 
        return VNON;
-} /* vn_get_sol_type() */
+} /* vn_mode_to_vtype() */
+EXPORT_SYMBOL(vn_mode_to_vtype);
+
+mode_t
+vn_vtype_to_mode(vtype_t vtype)
+{
+       if (vtype == VREG)
+               return S_IFREG;
+
+       if (vtype == VDIR)
+               return S_IFDIR;
+
+       if (vtype == VCHR)
+               return S_IFCHR;
+
+       if (vtype == VBLK)
+               return S_IFBLK;
+
+       if (vtype == VFIFO)
+               return S_IFIFO;
+
+       if (vtype == VLNK)
+               return S_IFLNK;
+
+       if (vtype == VSOCK)
+               return S_IFSOCK;
+
+       return VNON;
+} /* vn_vtype_to_mode() */
+EXPORT_SYMBOL(vn_vtype_to_mode);
 
 vnode_t *
 vn_alloc(int flag)
@@ -150,7 +179,7 @@ vn_open(const char *path, uio_seg_t seg, int flags, int mode,
        mapping_set_gfp_mask(fp->f_mapping, saved_gfp & ~(__GFP_IO|__GFP_FS));
 
        mutex_enter(&vp->v_lock);
-       vp->v_type = vn_get_sol_type(stat.mode);
+       vp->v_type = vn_mode_to_vtype(stat.mode);
        vp->v_file = fp;
        vp->v_gfp_mask = saved_gfp;
        *vpp = vp;
@@ -439,7 +468,7 @@ vn_getattr(vnode_t *vp, vattr_t *vap, int flags, void *x3, void *x4)
        if (rc)
                SRETURN(-rc);
 
-       vap->va_type          = vn_get_sol_type(stat.mode);
+       vap->va_type          = vn_mode_to_vtype(stat.mode);
        vap->va_mode          = stat.mode;
        vap->va_uid           = stat.uid;
        vap->va_gid           = stat.gid;
@@ -539,7 +568,7 @@ vn_getf(int fd)
                SGOTO(out_vnode, rc);
 
        mutex_enter(&vp->v_lock);
-       vp->v_type = vn_get_sol_type(stat.mode);
+       vp->v_type = vn_mode_to_vtype(stat.mode);
        vp->v_file = lfp;
        mutex_exit(&vp->v_lock);