Modify struct vattr:
authorMatthew Dillon <dillon@dragonflybsd.org>
Fri, 2 Nov 2007 19:52:28 +0000 (19:52 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Fri, 2 Nov 2007 19:52:28 +0000 (19:52 +0000)
Increase va_nlink, va_fileid (the inode number), and va_gen from
32 bit to 64 bit integers.

Add va_uid_uuid, va_gid_uuid, and va_fsid_uuid, and flags to
indicate that these fields are valid.  The original va_uid and
va_gid are retained.

This change has no external visibility.

Modify struct statvfs:
Use spare fields to add f_fsid_uuid and f_uid_uuid to the
structure, and flags indicating that those fields are valid.

This change has minimal external visibility. The size of the
structure has not changed.

Modify struct stat:
Add a new file type S_IFDB.  DB files are like regular files but
access data on a record by record basis.  The seek position is a
64 bit record key and not a byte offset.  Further work in this
area will be done later on to support related UIO operations.

This change has minimal external visibility. The size of the
structure has not changed.

sys/kern/vfs_cache.c
sys/kern/vfs_subr.c
sys/kern/vfs_vnops.c
sys/sys/stat.h
sys/sys/statvfs.h
sys/sys/vfscache.h
sys/vfs/isofs/cd9660/cd9660_vnops.c
sys/vfs/msdosfs/msdosfs_vnops.c
sys/vfs/nfs/nfs_subs.c
sys/vfs/nfs/nfs_vnops.c

index 9435c7f..40a2e34 100644 (file)
@@ -67,7 +67,7 @@
  *
  *     @(#)vfs_cache.c 8.5 (Berkeley) 3/22/95
  * $FreeBSD: src/sys/kern/vfs_cache.c,v 1.42.2.6 2001/10/05 20:07:03 dillon Exp $
- * $DragonFly: src/sys/kern/vfs_cache.c,v 1.84 2007/08/13 17:43:55 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_cache.c,v 1.85 2007/11/02 19:52:25 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -1498,7 +1498,7 @@ cache_inefficient_scan(struct nchandle *nch, struct ucred *cred,
        if ((error = cache_vref(nch, cred, &pvp)) != 0)
                return (error);
        if (ncvp_debug)
-               kprintf("inefficient_scan: directory iosize %ld vattr fileid = %ld\n", vat.va_blocksize, (long)vat.va_fileid);
+               kprintf("inefficient_scan: directory iosize %ld vattr fileid = %lld\n", vat.va_blocksize, vat.va_fileid);
        if ((blksize = vat.va_blocksize) == 0)
                blksize = DEV_BSIZE;
        rbuf = kmalloc(blksize, M_TEMP, M_WAITOK);
@@ -1533,7 +1533,7 @@ again:
                            den->d_ino == vat.va_fileid) {
                                if (ncvp_debug) {
                                        kprintf("cache_inefficient_scan: "
-                                              "MATCHED inode %ld path %s/%*.*s\n",
+                                              "MATCHED inode %lld path %s/%*.*s\n",
                                               vat.va_fileid, nch->ncp->nc_name,
                                               den->d_namlen, den->d_namlen,
                                               den->d_name);
index a307e75..f8f525d 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_subr.c  8.31 (Berkeley) 5/26/95
  * $FreeBSD: src/sys/kern/vfs_subr.c,v 1.249.2.30 2003/04/04 20:35:57 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_subr.c,v 1.107 2007/10/24 21:56:41 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_subr.c,v 1.108 2007/11/02 19:52:25 dillon Exp $
  */
 
 /*
@@ -256,6 +256,7 @@ vattr_null(struct vattr *vap)
        vap->va_gen = VNOVAL;
        vap->va_vaflags = 0;
        vap->va_fsmid = VNOVAL;
+       /* va_*_uuid fields are only valid if related flags are set */
 }
 
 /*
index f2cb38d..7de52e1 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_vnops.c 8.2 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/vfs_vnops.c,v 1.87.2.13 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.53 2007/08/13 17:43:55 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.54 2007/11/02 19:52:25 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -845,6 +845,9 @@ vn_stat(struct vnode *vp, struct stat *sb, struct ucred *cred)
        case VREG:
                mode |= S_IFREG;
                break;
+       case VDATABASE:
+               mode |= S_IFDB;
+               break;
        case VDIR:
                mode |= S_IFDIR;
                break;
@@ -872,7 +875,10 @@ vn_stat(struct vnode *vp, struct stat *sb, struct ucred *cred)
                return (EBADF);
        };
        sb->st_mode = mode;
-       sb->st_nlink = vap->va_nlink;
+       if (vap->va_nlink > (nlink_t)-1)
+               sb->st_nlink = (nlink_t)-1;
+       else
+               sb->st_nlink = vap->va_nlink;
        sb->st_uid = vap->va_uid;
        sb->st_gid = vap->va_gid;
        sb->st_rdev = makeudev(vap->va_rmajor, vap->va_rminor);
@@ -934,7 +940,7 @@ vn_stat(struct vnode *vp, struct stat *sb, struct ucred *cred)
        if (suser_cred(cred, 0))
                sb->st_gen = 0;
        else
-               sb->st_gen = vap->va_gen;
+               sb->st_gen = (u_int32_t)vap->va_gen;
 
 #if (S_BLKSIZE == 512)
        /* Optimize this case */
index 389b9ad..5496080 100644 (file)
@@ -33,7 +33,7 @@
  *
  *     @(#)stat.h      8.12 (Berkeley) 6/16/95
  * $FreeBSD: src/sys/sys/stat.h,v 1.20 1999/12/29 04:24:47 peter Exp $
- * $DragonFly: src/sys/sys/stat.h,v 1.11 2006/12/05 23:14:55 dillon Exp $
+ * $DragonFly: src/sys/sys/stat.h,v 1.12 2007/11/02 19:52:24 dillon Exp $
  */
 
 #ifndef _SYS_STAT_H_
@@ -139,6 +139,7 @@ struct stat {
 #define        S_IFDIR  0040000                /* directory */
 #define        S_IFBLK  0060000                /* block special */
 #define        S_IFREG  0100000                /* regular */
+#define        S_IFDB   0110000                /* record access file */
 #define        S_IFLNK  0120000                /* symbolic link */
 #define        S_IFSOCK 0140000                /* socket */
 #define        S_IFWHT  0160000                /* whiteout */
@@ -149,6 +150,7 @@ struct stat {
 #define        S_ISCHR(m)      (((m) & 0170000) == 0020000)    /* char special */
 #define        S_ISBLK(m)      (((m) & 0170000) == 0060000)    /* block special */
 #define        S_ISREG(m)      (((m) & 0170000) == 0100000)    /* regular file */
+#define        S_ISDB(m)       (((m) & 0170000) == 0110000)    /* record access file */
 #define        S_ISFIFO(m)     (((m) & 0170000) == 0010000)    /* fifo or socket */
 #ifndef _POSIX_SOURCE
 #define        S_ISLNK(m)      (((m) & 0170000) == 0120000)    /* symbolic link */
index fed7419..9edd44f 100644 (file)
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/sys/statvfs.h,v 1.5 2005/07/24 12:40:36 joerg Exp $
+ * $DragonFly: src/sys/sys/statvfs.h,v 1.6 2007/11/02 19:52:24 dillon Exp $
  */
 
 #ifndef _SYS_STATVFS_H_
 #define _SYS_STATVFS_H_
 
 #include <sys/types.h>
+#include <sys/uuid.h>
 
 /*
  * The POSIX 1003.1 standard uses free and available nomenclature to mean the
@@ -67,12 +68,24 @@ struct statvfs {
        uint64_t        f_asyncreads;   /* count of async reads since mount */
        uint64_t        f_asyncwrites;  /* count of async writes since mount */
 
-       uint32_t        f_spare[8];     
+       /*
+        * DragonFly extensions - full uuid FSID and owner
+        */
+       uuid_t          f_fsid_uuid;
+       uuid_t          f_uid_uuid;
 };
 
-/* f_flag definitions */
-#define ST_RDONLY      0x1     /* fs is read-only */
-#define ST_NOSUID      0x2     /* fs does not support ST_ISUID or ST_ISGID */
+/*
+ * f_flag definitions
+ */
+#define ST_RDONLY      0x00000001      /* fs is read-only */
+#define ST_NOSUID      0x00000002      /* ST_ISUID or ST_ISGID not supported */
+
+/*
+ * DragonFly specific flags
+ */
+#define ST_FSID_UUID   0x40000000      /* f_fsid_uuid field is valid */
+#define ST_OWNER_UUID  0x80000000      /* f_owner_uuid field is valid */
 
 __BEGIN_DECLS
 int    fstatvfs(int, struct statvfs *);
index 1c778e6..0a4cd84 100644 (file)
@@ -63,7 +63,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/sys/vfscache.h,v 1.11 2007/11/01 22:05:22 dillon Exp $
+ * $DragonFly: src/sys/sys/vfscache.h,v 1.12 2007/11/02 19:52:24 dillon Exp $
  */
 /*
  * This module serves as a focal point for virtually all filesystem and
@@ -93,6 +93,9 @@
 #ifndef _SYS_VFSOPS_H_
 #include <sys/vfsops.h>
 #endif
+#ifndef _SYS_UUID_H_
+#include <sys/uuid.h>
+#endif
 
 /*
  * Vnode types.  VNON means no type.
@@ -116,21 +119,23 @@ enum vtagtype     {
 /*
  * Vnode attributes.  A field value of VNOVAL represents a field whose value
  * is unavailable (getattr) or which is not to be changed (setattr).
+ *
+ * Some vattr fields may be wider then what is reported to userland.
  */
 struct vattr {
        enum vtype      va_type;        /* vnode type (for create) */
-       nlink_t         va_nlink;       /* number of references to file */
+       u_int64_t       va_nlink;       /* number of references to file */
        u_short         va_mode;        /* files access mode and type */
        uid_t           va_uid;         /* owner user id */
        gid_t           va_gid;         /* owner group id */
        udev_t          va_fsid;        /* file system id */
-       long            va_fileid;      /* file id */
+       ino_t           va_fileid;      /* file id */
        u_quad_t        va_size;        /* file size in bytes */
        long            va_blocksize;   /* blocksize preferred for i/o */
        struct timespec va_atime;       /* time of last access */
        struct timespec va_mtime;       /* time of last modification */
        struct timespec va_ctime;       /* time file changed */
-       u_long          va_gen;         /* generation number of file */
+       u_int64_t       va_gen;         /* generation number of file */
        u_long          va_flags;       /* flags defined for file */
        int             va_rmajor;      /* device the special file represents */
        int             va_rminor;
@@ -139,13 +144,22 @@ struct vattr {
        u_int           va_vaflags;     /* operations flags, see below */
        long            va_spare;       /* remain quad aligned */
        int64_t         va_fsmid;       /* filesystem modification id */
+       uuid_t          va_uid_uuid;    /* native uuids if available */
+       uuid_t          va_gid_uuid;
+       uuid_t          va_fsid_uuid;
 };
 
 /*
  * Flags for va_vaflags.
+ *
+ * NOTE: The short versions for the uid, gid, and fsid are always populated
+ * even when the uuid versions are available.
  */
-#define        VA_UTIMES_NULL  0x01            /* utimes argument was NULL */
-#define VA_EXCLUSIVE   0x02            /* exclusive create request */
+#define        VA_UTIMES_NULL          0x0001  /* utimes argument was NULL */
+#define VA_EXCLUSIVE           0x0002  /* exclusive create request */
+#define VA_UID_UUID_VALID      0x0004  /* uuid fields also populated */
+#define VA_GID_UUID_VALID      0x0008  /* uuid fields also populated */
+#define VA_FSID_UUID_VALID     0x0010  /* uuid fields also populated */
 
 #if 0  /* NOT YET */
 
index 0fe160b..da91cdb 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)cd9660_vnops.c      8.19 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/isofs/cd9660/cd9660_vnops.c,v 1.62 1999/12/15 23:01:51 eivind Exp $
- * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vnops.c,v 1.37 2007/08/28 01:04:33 dillon Exp $
+ * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vnops.c,v 1.38 2007/11/02 19:52:26 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -103,6 +103,7 @@ cd9660_setattr(struct vop_setattr_args *ap)
                        return (EISDIR);
                case VLNK:
                case VREG:
+               case VDATABASE:
                        return (EROFS);
                case VCHR:
                case VBLK:
index e666f3b..3422ace 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/msdosfs/msdosfs_vnops.c,v 1.95.2.4 2003/06/13 15:05:47 trhodes Exp $ */
-/* $DragonFly: src/sys/vfs/msdosfs/msdosfs_vnops.c,v 1.52 2007/08/28 01:04:33 dillon Exp $ */
+/* $DragonFly: src/sys/vfs/msdosfs/msdosfs_vnops.c,v 1.53 2007/11/02 19:52:27 dillon Exp $ */
 /*     $NetBSD: msdosfs_vnops.c,v 1.68 1998/02/10 14:10:04 mrg Exp $   */
 
 /*-
@@ -402,9 +402,9 @@ msdosfs_setattr(struct vop_setattr_args *ap)
            (vap->va_bytes != VNOVAL) || (vap->va_gen != VNOVAL)) {
 #ifdef MSDOSFS_DEBUG
                kprintf("msdosfs_setattr(): returning EINVAL\n");
-               kprintf("    va_type %d, va_nlink %x, va_fsid %x, va_fileid %lx\n",
+               kprintf("    va_type %d, va_nlink %llx, va_fsid %x, va_fileid %llx\n",
                    vap->va_type, vap->va_nlink, vap->va_fsid, vap->va_fileid);
-               kprintf("    va_blocksize %lx, va_rmajor %x, va_bytes %qx, va_gen %lx\n",
+               kprintf("    va_blocksize %lx, va_rmajor %x, va_bytes %qx, va_gen %llx\n",
                    vap->va_blocksize, vap->va_rmajor, vap->va_bytes, vap->va_gen);
                kprintf("    va_uid %x, va_gid %x\n",
                    vap->va_uid, vap->va_gid);
index 7fc3dd8..271a352 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_subs.c  8.8 (Berkeley) 5/22/95
  * $FreeBSD: /repoman/r/ncvs/src/sys/nfsclient/nfs_subs.c,v 1.128 2004/04/14 23:23:55 peadar Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_subs.c,v 1.46 2007/05/09 00:53:35 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_subs.c,v 1.47 2007/11/02 19:52:28 dillon Exp $
  */
 
 /*
@@ -1231,8 +1231,7 @@ nfs_loadattrcache(struct vnode **vpp, struct mbuf **mdp, caddr_t *dposp,
                vap->va_size = fxdr_hyper(&fp->fa3_size);
                vap->va_blocksize = NFS_FABLKSIZE;
                vap->va_bytes = fxdr_hyper(&fp->fa3_used);
-               vap->va_fileid = fxdr_unsigned(int32_t,
-                   fp->fa3_fileid.nfsuquad[1]);
+               vap->va_fileid = fxdr_hyper(&fp->fa3_fileid);
                fxdr_nfsv3time(&fp->fa3_atime, &vap->va_atime);
                fxdr_nfsv3time(&fp->fa3_ctime, &vap->va_ctime);
                vap->va_flags = 0;
@@ -1758,8 +1757,13 @@ void
 nfsm_srvfattr(struct nfsrv_descript *nfsd, struct vattr *vap,
              struct nfs_fattr *fp)
 {
-
-       fp->fa_nlink = txdr_unsigned(vap->va_nlink);
+       /*
+        * NFS seems to truncate nlink to 16 bits, don't let it overflow.
+        */
+       if (vap->va_nlink > 65535)
+               fp->fa_nlink = 65535;
+       else
+               fp->fa_nlink = txdr_unsigned(vap->va_nlink);
        fp->fa_uid = txdr_unsigned(vap->va_uid);
        fp->fa_gid = txdr_unsigned(vap->va_gid);
        if (nfsd->nd_flag & ND_NFSV3) {
@@ -1771,8 +1775,7 @@ nfsm_srvfattr(struct nfsrv_descript *nfsd, struct vattr *vap,
                fp->fa3_rdev.specdata2 = txdr_unsigned(vap->va_rminor);
                fp->fa3_fsid.nfsuquad[0] = 0;
                fp->fa3_fsid.nfsuquad[1] = txdr_unsigned(vap->va_fsid);
-               fp->fa3_fileid.nfsuquad[0] = 0;
-               fp->fa3_fileid.nfsuquad[1] = txdr_unsigned(vap->va_fileid);
+               txdr_hyper(vap->va_fileid, &fp->fa3_fileid);
                txdr_nfsv3time(&vap->va_atime, &fp->fa3_atime);
                txdr_nfsv3time(&vap->va_mtime, &fp->fa3_mtime);
                txdr_nfsv3time(&vap->va_ctime, &fp->fa3_ctime);
index c6028d0..99ef955 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_vnops.c 8.16 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/nfs/nfs_vnops.c,v 1.150.2.5 2001/12/20 19:56:28 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.75 2007/08/13 17:43:57 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.76 2007/11/02 19:52:28 dillon Exp $
  */
 
 
@@ -3211,7 +3211,7 @@ nfs_print(struct vop_print_args *ap)
        struct vnode *vp = ap->a_vp;
        struct nfsnode *np = VTONFS(vp);
 
-       kprintf("tag VT_NFS, fileid %ld fsid 0x%x",
+       kprintf("tag VT_NFS, fileid %lld fsid 0x%x",
                np->n_vattr.va_fileid, np->n_vattr.va_fsid);
        if (vp->v_type == VFIFO)
                fifo_printinfo(vp);