diff options
Diffstat (limited to 'support')
-rw-r--r-- | support/export/xtab.c | 19 | ||||
-rw-r--r-- | support/include/exportfs.h | 4 | ||||
-rw-r--r-- | support/nfs/xio.c | 2 |
3 files changed, 18 insertions, 7 deletions
diff --git a/support/export/xtab.c b/support/export/xtab.c index c8adc06..b0c3095 100644 --- a/support/export/xtab.c +++ b/support/export/xtab.c @@ -21,6 +21,10 @@ static int xtab_read(char *xtab, int is_export) { + /* is_export == 0 => reading /proc/fs/nfs/exports - we know these things are exported to kernel + * is_export == 1 => reading /var/lib/nfs/etab - these things are allowed to be exported + * is_export == 2 => reading /var/lib/nfs/xtab - these things might be known to kernel + */ struct exportent *xp; nfs_export *exp; int lockid; @@ -33,11 +37,18 @@ xtab_read(char *xtab, int is_export) !(exp = export_create(xp))) { continue; } - if (is_export) { + switch (is_export) { + case 0: + exp->m_exported = 1; + break; + case 1: exp->m_xtabent = 1; exp->m_mayexport = 1; - } else - exp->m_exported = 1; + break; + case 2: + exp->m_exported = -1;/* may be exported */ + break; + } } endexportent(); xfunlock(lockid); @@ -53,7 +64,7 @@ xtab_mount_read(void) close(fd); return xtab_read(_PATH_PROC_EXPORTS, 0); } else - return xtab_read(_PATH_XTAB, 1); + return xtab_read(_PATH_XTAB, 2); } int diff --git a/support/include/exportfs.h b/support/include/exportfs.h index d440dc1..3ca248e 100644 --- a/support/include/exportfs.h +++ b/support/include/exportfs.h @@ -36,8 +36,8 @@ typedef struct mexport { struct mexport * m_next; struct mclient * m_client; struct exportent m_export; - int m_exported : 1, /* known to knfsd */ - m_xtabent : 1, /* xtab entry exists */ + int m_exported; /* known to knfsd. -1 means not sure */ + int m_xtabent : 1, /* xtab entry exists */ m_mayexport: 1, /* derived from xtabbed */ m_changed : 1; /* options (may) have changed */ } nfs_export; diff --git a/support/nfs/xio.c b/support/nfs/xio.c index 49ee6bc..0a250fc 100644 --- a/support/nfs/xio.c +++ b/support/nfs/xio.c @@ -55,7 +55,7 @@ xflock(char *fname, char *type) struct flock fl = { readonly? F_RDLCK : F_WRLCK, SEEK_SET, 0, 0, 0 }; int fd; - if ((fd = open(fname, readonly? O_RDONLY : O_RDWR)) < 0) { + if ((fd = open(fname, readonly? O_RDONLY : (O_RDWR|O_CREAT))) < 0) { xlog(L_WARNING, "could not open %s for locking", fname); return -1; } |