[OpenAFS] Solaris 10u6: ZFS cache?
Douglas E. Engert
deengert@anl.gov
Tue, 11 Nov 2008 10:43:12 -0600
This is a multi-part message in MIME format.
--------------080308020304050703080301
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Douglas E. Engert wrote:
>
> Mattias Pantzare wrote:
>> On Sat, Nov 1, 2008 at 19:53, Vincent Fox <vbfox@ucdavis.edu> wrote:
>>> So is there any way to using a ZFS filesystem for client cache?
>>> I tried Solaris 10 version 1.4.7 in namei binary & not and it
>>> panics the system.
>>
>> No.
>>
>> Someone have to implement that.
>
I have attached a patch based on Derrick's suggestion to use the
AFS_CACHE_VNODE_PATH code.
Some comments questions about this:
o The patch sets this as the default for sun4x_510, sun4x_511,
unx86_510 sunx86_511. I have only tested on sun4x_510 with
a ZFS root.
o The code will also be used on UFS cache partitions.
o There is code in afs/SOLARIS for a Xvfs file system.
Rather then overloading the osi_UfsOpen, it might be a
better choice to create a osi_ZfsOpen much like the
osi_XvfsOpen. Let me know if that would be better,
and I can rework the patch. It might be possible
to use VOP_GETATTR to get an inode as even with ZFS
they to generate inode numbers.
o The Solaris vn_open will use the user's CRED, and
it was found that permission denied was possible,
so pn_get_buf, lookuppnvp and VOP_OPEN where used
instead, using the cred of afs_osi_cred.
o The ois_DisableAtime routine was trying to update
the inode. I skipped that part of the code. Is this
OK or not? Is there another way to update the flag?
o The original patch would set the ainode to a signed
value, but on Solairs with 64 bit, the ainode was
defined to be unsigned long. This caused problems
with if (ainode < 0) and switch (ainode).
So the patch goes back to using afs_int32 for ainode.
The patch was against the 1.4.8pre3 source.
>
>> _______________________________________________
>> OpenAFS-info mailing list
>> OpenAFS-info@openafs.org
>> https://lists.openafs.org/mailman/listinfo/openafs-info
>>
>>
>
--
Douglas E. Engert <DEEngert@anl.gov>
Argonne National Laboratory
9700 South Cass Avenue
Argonne, Illinois 60439
(630) 252-5444
--------------080308020304050703080301
Content-Type: text/plain;
name="Solaris-vnode-path.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="Solaris-vnode-path.txt"
--- ./src/afs/SOLARIS/,osi_file.c Mon Mar 17 10:28:55 2008
+++ ./src/afs/SOLARIS/osi_file.c Tue Nov 11 09:24:36 2008
@@ -167,7 +167,13 @@
}
#endif /* AFS_HAVE_VXFS */
-#if defined(AFS_SUN57_64BIT_ENV)
+/*
+ * AFS_CACHE_VNODE_PATH used with any file system. Inodes are
+ * not used with ZFS. The ainode is not an inode number but a
+ * signed index to chucks in the cache
+ */
+
+#if !defined(AFS_CACHE_VNODE_PATH) && defined(AFS_SUN57_64BIT_ENV)
void *
osi_UfsOpen(ino_t ainode)
#else
@@ -175,22 +181,85 @@
osi_UfsOpen(afs_int32 ainode)
#endif
{
+#ifdef AFS_CACHE_VNODE_PATH
+ struct vnode *vp;
+#else
struct inode *ip;
+#endif
register struct osi_file *afile = NULL;
afs_int32 code = 0;
+#ifdef AFS_CACHE_VNODE_PATH
int dummy;
+ char fname[1024];
+ char namebuf[1024];
+ struct pathname lookpn;
+#endif
+ struct osi_stat tstat;
afile = (struct osi_file *)osi_AllocSmallSpace(sizeof(struct osi_file));
AFS_GUNLOCK();
+
+#ifdef AFS_CACHE_VNODE_PATH
+ if (ainode < 0) {
+ switch (ainode) {
+ case AFS_CACHE_CELLS_INODE:
+ snprintf(fname, 1024, "%s/%s", afs_cachebasedir, "CellItems");
+ break;
+ case AFS_CACHE_ITEMS_INODE:
+ snprintf(fname, 1024, "%s/%s", afs_cachebasedir, "CacheItems");
+ break;
+ case AFS_CACHE_VOLUME_INODE:
+ snprintf(fname, 1024, "%s/%s", afs_cachebasedir, "VolumeItems");
+ break;
+ default:
+ osi_Panic("Invalid negative inode");
+ }
+ } else {
+ dummy = ainode / afs_numfilesperdir;
+ snprintf(fname, 1024, "%s/D%d/V%d", afs_cachebasedir, dummy, ainode);
+ }
+
+ /* Can not use vn_open or lookupname, they use user's CRED()
+ * We need to run as root So must use low level lookuppnvp
+ * assume fname starts with /
+ */
+
+ code = pn_get_buf(fname, AFS_UIOSYS, &lookpn, namebuf, sizeof(namebuf));
+ if (code != 0)
+ osi_Panic("UfsOpen: pn_get_buf failed %ld %s %ld", code, fname, ainode);
+
+ VN_HOLD(rootdir); /* released in loopuppnvp */
+ code = lookuppnvp(&lookpn, NULL, FOLLOW, NULL, &vp,
+ rootdir, rootdir, &afs_osi_cred);
+ if (code != 0)
+ osi_Panic("UfsOpen: lookuppnvp failed %ld %s %ld", code, fname, ainode);
+
+#ifdef AFS_SUN511_ENV
+ code = VOP_OPEN(&vp, FREAD|FWRITE, &afs_osi_cred, NULL);
+#else
+ code = VOP_OPEN(&vp, FREAD|FWRITE, &afs_osi_cred);
+#endif
+
+ if (code != 0)
+ osi_Panic("UfsOpen: VOP_OPEN failed %ld %s %ld", code, fname, ainode);
+
+#else
code =
igetinode(afs_cacheVfsp, (dev_t) cacheDev.dev, (ino_t) ainode, &ip,
CRED(), &dummy);
+#endif
AFS_GLOCK();
if (code) {
osi_FreeSmallSpace(afile);
- osi_Panic("UfsOpen: igetinode failed");
+ osi_Panic("UfsOpen: igetinode failed %ld %s %ld", code, fname, ainode);
}
+#ifdef AFS_CACHE_VNODE_PATH
+ afile->vnode = vp;
+ code = afs_osi_Stat(afile, &tstat);
+ afile->size = tstat.size;
+#else
afile->vnode = ITOV(ip);
afile->size = VTOI(afile->vnode)->i_size;
+#endif
afile->offset = 0;
afile->proc = (int (*)())0;
afile->inum = ainode; /* for hint validity checking */
@@ -200,7 +269,7 @@
/**
* In Solaris 7 we use 64 bit inode numbers
*/
-#if defined(AFS_SUN57_64BIT_ENV)
+#if !defined(AFS_CACHE_VNODE_PATH) && defined(AFS_SUN57_64BIT_ENV)
void *
osi_UFSOpen(ino_t ainode)
#else
@@ -304,12 +373,14 @@
osi_DisableAtimes(struct vnode *avp)
{
if (afs_CacheFSType == AFS_SUN_UFS_CACHE) {
+#ifndef AFS_CACHE_VNODE_PATH
struct inode *ip = VTOI(avp);
rw_enter(&ip->i_contents, RW_READER);
mutex_enter(&ip->i_tlock);
ip->i_flag &= ~IACC;
mutex_exit(&ip->i_tlock);
rw_exit(&ip->i_contents);
+#endif
}
}
--- ./src/afs/,afs_prototypes.h Sat Jun 28 22:26:04 2008
+++ ./src/afs/afs_prototypes.h Tue Nov 11 08:22:30 2008
@@ -590,7 +590,7 @@
/* ARCH/osi_file.c */
extern int afs_osicred_initialized;
-#if defined(AFS_SUN57_64BIT_ENV) || defined(AFS_SGI62_ENV)
+#if !defined(AFS_CACHE_VNODE_PATH) && (defined(AFS_SUN57_64BIT_ENV) || defined(AFS_SGI62_ENV))
extern void *osi_UFSOpen(ino_t ainode);
#else
extern void *osi_UFSOpen(afs_int32 ainode);
--- ./src/config/,param.sunx86_510.h Fri Dec 23 19:09:53 2005
+++ ./src/config/param.sunx86_510.h Fri Nov 7 08:45:47 2008
@@ -38,6 +38,8 @@
#define AFS_HAVE_FLOCK_SYSID 1
+#define AFS_CACHE_VNODE_PATH 1
+
#include <afs/afs_sysnames.h>
#define AFS_GLOBAL_SUNLOCK 1 /* For global locking */
--- ./src/config/,param.sunx86_511.h Thu Dec 28 15:59:45 2006
+++ ./src/config/param.sunx86_511.h Fri Nov 7 08:46:14 2008
@@ -39,6 +39,8 @@
#define AFS_HAVE_FLOCK_SYSID 1
+#define AFS_CACHE_VNODE_PATH 1
+
#include <afs/afs_sysnames.h>
#define AFS_GLOBAL_SUNLOCK 1 /* For global locking */
--- ./src/config/,param.sun4x_510.h Fri Dec 23 19:09:53 2005
+++ ./src/config/param.sun4x_510.h Fri Nov 7 08:43:53 2008
@@ -34,6 +34,8 @@
#define AFS_3DISPARES 1 /* Utilize the 3 available disk inode 'spares' */
#endif /* AFS_NAMEI_ENV */
+#define AFS_CACHE_VNODE_PATH 1
+
#include <afs/afs_sysnames.h>
#define AFS_GLOBAL_SUNLOCK 1 /* For global locking */
--- ./src/config/,param.sun4x_511.h Thu Dec 28 15:59:45 2006
+++ ./src/config/param.sun4x_511.h Fri Nov 7 08:45:10 2008
@@ -35,6 +35,8 @@
#define AFS_3DISPARES 1 /* Utilize the 3 available disk inode 'spares' */
#endif /* AFS_NAMEI_ENV */
+#define AFS_CACHE_VNODE_PATH 1
+
#include <afs/afs_sysnames.h>
#define AFS_GLOBAL_SUNLOCK 1 /* For global locking */
--------------080308020304050703080301--