* fhandler_disk_file.cc (fhandler_base::fstat_by_nfs_ea): Simplify.
Just call nfs_fetch_fattr3 if called via fstat. * nfs.cc (nfs_fetch_fattr3): New function to fetch NFS fattr3 info from file handle. * nfs.h (nfs_fetch_fattr3): Declare. * path.cc (symlink_info::check): Simplify NFS case. Just call nfs_fetch_fattr3.
This commit is contained in:
parent
1d694d8e5c
commit
1da77c2678
|
@ -1,3 +1,13 @@
|
||||||
|
2010-09-02 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
|
* fhandler_disk_file.cc (fhandler_base::fstat_by_nfs_ea): Simplify.
|
||||||
|
Just call nfs_fetch_fattr3 if called via fstat.
|
||||||
|
* nfs.cc (nfs_fetch_fattr3): New function to fetch NFS fattr3 info from
|
||||||
|
file handle.
|
||||||
|
* nfs.h (nfs_fetch_fattr3): Declare.
|
||||||
|
* path.cc (symlink_info::check): Simplify NFS case. Just call
|
||||||
|
nfs_fetch_fattr3.
|
||||||
|
|
||||||
2010-09-02 Corinna Vinschen <corinna@vinschen.de>
|
2010-09-02 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* fhandler_procsys.cc (fhandler_procsys::exists): Return virt_none
|
* fhandler_procsys.cc (fhandler_procsys::exists): Return virt_none
|
||||||
|
|
|
@ -293,16 +293,6 @@ path_conv::ndisk_links (DWORD nNumberOfLinks)
|
||||||
int __stdcall
|
int __stdcall
|
||||||
fhandler_base::fstat_by_nfs_ea (struct __stat64 *buf)
|
fhandler_base::fstat_by_nfs_ea (struct __stat64 *buf)
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
|
||||||
IO_STATUS_BLOCK io;
|
|
||||||
struct {
|
|
||||||
FILE_FULL_EA_INFORMATION ffei;
|
|
||||||
char buf[sizeof (NFS_V3_ATTR) + sizeof (fattr3)];
|
|
||||||
} ffei_buf;
|
|
||||||
struct {
|
|
||||||
FILE_GET_EA_INFORMATION fgei;
|
|
||||||
char buf[sizeof (NFS_V3_ATTR)];
|
|
||||||
} fgei_buf;
|
|
||||||
fattr3 *nfs_attr = pc.nfsattr ();
|
fattr3 *nfs_attr = pc.nfsattr ();
|
||||||
|
|
||||||
if (get_io_handle ())
|
if (get_io_handle ())
|
||||||
|
@ -314,16 +304,7 @@ fhandler_base::fstat_by_nfs_ea (struct __stat64 *buf)
|
||||||
NFS client. */
|
NFS client. */
|
||||||
if (get_access () & GENERIC_WRITE)
|
if (get_access () & GENERIC_WRITE)
|
||||||
FlushFileBuffers (get_io_handle ());
|
FlushFileBuffers (get_io_handle ());
|
||||||
|
nfs_fetch_fattr3 (get_io_handle (), nfs_attr);
|
||||||
fgei_buf.fgei.NextEntryOffset = 0;
|
|
||||||
fgei_buf.fgei.EaNameLength = sizeof (NFS_V3_ATTR) - 1;
|
|
||||||
stpcpy (fgei_buf.fgei.EaName, NFS_V3_ATTR);
|
|
||||||
status = NtQueryEaFile (get_io_handle (), &io,
|
|
||||||
&ffei_buf.ffei, sizeof ffei_buf, TRUE,
|
|
||||||
&fgei_buf.fgei, sizeof fgei_buf, NULL, TRUE);
|
|
||||||
if (NT_SUCCESS (status))
|
|
||||||
nfs_attr = (fattr3 *) (ffei_buf.ffei.EaName
|
|
||||||
+ ffei_buf.ffei.EaNameLength + 1);
|
|
||||||
}
|
}
|
||||||
buf->st_dev = nfs_attr->fsid;
|
buf->st_dev = nfs_attr->fsid;
|
||||||
buf->st_ino = nfs_attr->fileid;
|
buf->st_ino = nfs_attr->fileid;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* nfs.cc
|
/* nfs.cc
|
||||||
|
|
||||||
Copyright 2008 Red Hat, Inc.
|
Copyright 2008, 2010 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -9,6 +9,7 @@ details. */
|
||||||
#include "winsup.h"
|
#include "winsup.h"
|
||||||
#include "sys/fcntl.h"
|
#include "sys/fcntl.h"
|
||||||
#include "nfs.h"
|
#include "nfs.h"
|
||||||
|
#include "ntdll.h"
|
||||||
|
|
||||||
struct nfs_aol_ffei_t nfs_aol_ffei = { 0, 0, sizeof (NFS_ACT_ON_LINK) - 1, 0,
|
struct nfs_aol_ffei_t nfs_aol_ffei = { 0, 0, sizeof (NFS_ACT_ON_LINK) - 1, 0,
|
||||||
NFS_ACT_ON_LINK };
|
NFS_ACT_ON_LINK };
|
||||||
|
@ -16,3 +17,31 @@ struct nfs_aol_ffei_t nfs_aol_ffei = { 0, 0, sizeof (NFS_ACT_ON_LINK) - 1, 0,
|
||||||
uint32_t nfs_type_mapping[] = { 0, S_IFREG, S_IFDIR, S_IFBLK,
|
uint32_t nfs_type_mapping[] = { 0, S_IFREG, S_IFDIR, S_IFBLK,
|
||||||
S_IFCHR, S_IFLNK, S_IFSOCK, S_IFIFO };
|
S_IFCHR, S_IFLNK, S_IFSOCK, S_IFIFO };
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
nfs_fetch_fattr3 (HANDLE h, fattr3 *fattr_buf)
|
||||||
|
{
|
||||||
|
struct {
|
||||||
|
FILE_FULL_EA_INFORMATION ffei;
|
||||||
|
char buf[sizeof (NFS_V3_ATTR) + sizeof (fattr3)];
|
||||||
|
} ffei_buf;
|
||||||
|
struct {
|
||||||
|
FILE_GET_EA_INFORMATION fgei;
|
||||||
|
char buf[sizeof (NFS_V3_ATTR)];
|
||||||
|
} fgei_buf;
|
||||||
|
NTSTATUS status;
|
||||||
|
IO_STATUS_BLOCK io;
|
||||||
|
|
||||||
|
fgei_buf.fgei.NextEntryOffset = 0;
|
||||||
|
fgei_buf.fgei.EaNameLength = sizeof (NFS_V3_ATTR) - 1;
|
||||||
|
stpcpy (fgei_buf.fgei.EaName, NFS_V3_ATTR);
|
||||||
|
status = NtQueryEaFile (h, &io, &ffei_buf.ffei, sizeof ffei_buf, TRUE,
|
||||||
|
&fgei_buf.fgei, sizeof fgei_buf, NULL, TRUE);
|
||||||
|
if (NT_SUCCESS (status))
|
||||||
|
{
|
||||||
|
fattr3 *nfs_attr = (fattr3 *) (ffei_buf.ffei.EaName
|
||||||
|
+ ffei_buf.ffei.EaNameLength + 1);
|
||||||
|
if (fattr_buf)
|
||||||
|
memcpy (fattr_buf, nfs_attr, sizeof (fattr3));
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* nfs.h
|
/* nfs.h
|
||||||
|
|
||||||
Copyright 2008 Red Hat, Inc.
|
Copyright 2008, 2010 Red Hat, Inc.
|
||||||
|
|
||||||
This software is a copyrighted work licensed under the terms of the
|
This software is a copyrighted work licensed under the terms of the
|
||||||
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
Cygwin license. Please consult the file "CYGWIN_LICENSE" for
|
||||||
|
@ -53,3 +53,5 @@ struct nfs_aol_ffei_t {
|
||||||
extern struct nfs_aol_ffei_t nfs_aol_ffei;
|
extern struct nfs_aol_ffei_t nfs_aol_ffei;
|
||||||
|
|
||||||
extern uint32_t nfs_type_mapping[];
|
extern uint32_t nfs_type_mapping[];
|
||||||
|
|
||||||
|
extern NTSTATUS nfs_fetch_fattr3 (HANDLE h, fattr3 *fattr_buf);
|
||||||
|
|
|
@ -2404,29 +2404,10 @@ restart:
|
||||||
{
|
{
|
||||||
if (fs.is_nfs ())
|
if (fs.is_nfs ())
|
||||||
{
|
{
|
||||||
struct {
|
status = nfs_fetch_fattr3 (h, conv_hdl.nfsattr ());
|
||||||
FILE_FULL_EA_INFORMATION ffei;
|
|
||||||
char buf[sizeof (NFS_V3_ATTR) + sizeof (fattr3)];
|
|
||||||
} ffei_buf;
|
|
||||||
struct {
|
|
||||||
FILE_GET_EA_INFORMATION fgei;
|
|
||||||
char buf[sizeof (NFS_V3_ATTR)];
|
|
||||||
} fgei_buf;
|
|
||||||
|
|
||||||
fgei_buf.fgei.NextEntryOffset = 0;
|
|
||||||
fgei_buf.fgei.EaNameLength = sizeof (NFS_V3_ATTR) - 1;
|
|
||||||
stpcpy (fgei_buf.fgei.EaName, NFS_V3_ATTR);
|
|
||||||
status = NtQueryEaFile (h, &io, &ffei_buf.ffei, sizeof ffei_buf,
|
|
||||||
TRUE, &fgei_buf.fgei, sizeof fgei_buf,
|
|
||||||
NULL, TRUE);
|
|
||||||
if (NT_SUCCESS (status))
|
if (NT_SUCCESS (status))
|
||||||
{
|
fileattr = ((conv_hdl.nfsattr ()->type & 7) == NF3DIR)
|
||||||
fattr3 *nfs_attr = (fattr3 *)
|
? FILE_ATTRIBUTE_DIRECTORY : 0;
|
||||||
(ffei_buf.ffei.EaName + ffei_buf.ffei.EaNameLength + 1);
|
|
||||||
memcpy (conv_hdl.nfsattr (), nfs_attr, sizeof (fattr3));
|
|
||||||
fileattr = ((nfs_attr->type & 7) == NF3DIR)
|
|
||||||
? FILE_ATTRIBUTE_DIRECTORY : 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue