vol-lock-fd-type-20090323
[openafs.git] / src / vol / partition.h
index e471dea..a8206f0 100644 (file)
@@ -5,6 +5,8 @@
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
+ *
+ * Portions Copyright (c) 2006 Sine Nomine Associates
  */
 
 /*
@@ -27,6 +29,7 @@
 #define        AFS_RDSKDEV     "/dev/r"
 #endif
 
+
 /* All Vice partitions on a server will have the following name prefix */
 #define VICE_PARTITION_PREFIX  "/vicep"
 #define VICE_PREFIX_SIZE       (sizeof(VICE_PARTITION_PREFIX)-1)
  * variant for VGetPartition as well. Also, the VolPartitionInfo RPC does
  * a swap before sending the data out on the wire.
  */
-struct DiskPartition {
-    struct DiskPartition *next;
-    char       *name;          /* Mounted partition name */
-    char       *devName;       /* Device mounted on */
-    Device     device;         /* device number */
-    int                lock_fd;        /* File descriptor of this partition if locked; otherwise -1;
-                                  Not used by the file server */
-    int                free;           /* Total number of blocks (1K) presumed
-                                  available on this partition (accounting
-                                  for the minfree parameter for the
-                                  partition).  This is adjusted
-                                  approximately by the sizes of files
-                                  and directories read/written, and
-                                  periodically the superblock is read and
-                                  this is recomputed.  This number can
-                                  be negative, if the partition starts
-                                  out too full */
-    int                totalUsable;    /* Total number of blocks available on this
-                                  partition, taking into account the minfree
-                                  parameter for the partition (see the
-                                  4.2bsd command tunefs, but note that the
-                                  bug mentioned there--that the superblock
-                                  is not reread--does not apply here.  The
-                                  superblock is re-read periodically by
-                                  VSetPartitionDiskUsage().) */
-    int                minFree;        /* Number blocks to be kept free, as last read
-                                  from the superblock */
-    int                flags;
-    int        f_files;        /* total number of files in this partition */
+struct DiskPartition64 {
+    struct DiskPartition64 *next;
+    char *name;                        /* Mounted partition name */
+    char *devName;             /* Device mounted on */
+    Device device;             /* device number */
+    afs_int32 index;            /* partition index (0<=x<=VOLMAXPARTS) */
+    FD_t lock_fd;              /* File descriptor of this partition if locked; otherwise -1;
+                                * Not used by the file server */
+    afs_int64 free;            /* Total number of blocks (1K) presumed
+                                * available on this partition (accounting
+                                * for the minfree parameter for the
+                                * partition).  This is adjusted
+                                * approximately by the sizes of files
+                                * and directories read/written, and
+                                * periodically the superblock is read and
+                                * this is recomputed.  This number can
+                                * be negative, if the partition starts
+                                * out too full */
+    afs_int64 totalUsable;     /* Total number of blocks available on this
+                                * partition, taking into account the minfree
+                                * parameter for the partition (see the
+                                * 4.2bsd command tunefs, but note that the
+                                * bug mentioned there--that the superblock
+                                * is not reread--does not apply here.  The
+                                * superblock is re-read periodically by
+                                * VSetPartitionDiskUsage().) */
+    afs_int64 minFree;         /* Number blocks to be kept free, as last read
+                                * from the superblock */
+    int flags;
+    afs_int64 f_files;         /* total number of files in this partition */
+#ifdef AFS_DEMAND_ATTACH_FS
+    struct {
+       struct rx_queue head;   /* list of volumes on this partition (VByPList) */
+       afs_uint32 len;         /* length of volume list */
+       int busy;               /* asynch vol list op in progress */
+       pthread_cond_t cv;      /* vol_list.busy change cond var */
+    } vol_list;
+#endif /* AFS_DEMAND_ATTACH_FS */
+};
+
+struct DiskPartitionStats64 {
+    afs_int64 free;
+    afs_int64 totalUsable;
+    afs_int64 minFree;
+    afs_int64 f_files;
+#ifdef AFS_DEMAND_ATTACH_FS
+    afs_int32 vol_list_len;
+#endif
 };
+
 #define        PART_DONTUPDATE 1
-#define PART_DUPLICATE  2 /* NT - used if we find more than one partition 
-                          * using the same drive. Will be dumped before
-                          * all partitions attached.
-                          */
+#define PART_DUPLICATE  2      /* NT - used if we find more than one partition 
+                                * using the same drive. Will be dumped before
+                                * all partitions attached.
+                                */
 
 #ifdef AFS_NT40_ENV
 #include <WINNT/vptab.h>
@@ -90,8 +113,15 @@ extern int VValidVPTEntry(struct vptab *vptp);
 #endif
 
 
-extern struct DiskPartition *DiskPartitionList;
-extern struct DiskPartition *VGetPartition();
+struct Volume;                 /* Potentially forward definition */
+
+extern struct DiskPartition64 *DiskPartitionList;
+extern struct DiskPartition64 *VGetPartition(char * name, int abortp);
+extern struct DiskPartition64 *VGetPartition_r(char * name, int abortp);
+#ifdef AFS_DEMAND_ATTACH_FS
+extern struct DiskPartition64 *VGetPartitionById(afs_int32 index, int abortp);
+extern struct DiskPartition64 *VGetPartitionById_r(afs_int32 index, int abortp);
+#endif
 extern int VAttachPartitions(void);
 extern void VLockPartition(char *name);
 extern void VLockPartition_r(char *name);
@@ -99,10 +129,11 @@ extern void VUnlockPartition(char *name);
 extern void VUnlockPartition_r(char *name);
 extern void VResetDiskUsage(void);
 extern void VResetDiskUsage_r(void);
-extern void VSetPartitionDiskUsage(register struct DiskPartition *dp);
-extern void VSetPartitionDiskUsage_r(register struct DiskPartition *dp);
-extern char *VPartitionPath(struct DiskPartition *p);
-/*extern void VAdjustDiskUsage(Error *ec, Volume *vp, afs_int32 blocks,
-                            afs_int32 checkBlocks); */
+extern void VSetPartitionDiskUsage(register struct DiskPartition64 *dp);
+extern void VSetPartitionDiskUsage_r(register struct DiskPartition64 *dp);
+extern char *VPartitionPath(struct DiskPartition64 *p);
+extern void VAdjustDiskUsage(Error * ec, struct Volume *vp,
+                            afs_sfsize_t blocks, afs_sfsize_t checkBlocks);
+extern int VDiskUsage(struct Volume *vp, afs_sfsize_t blocks);
 extern void VPrintDiskStats(void);
-
+extern int VInitPartitionPackage(void);