ReactOS  0.4.12-dev-18-gf469aca
name_cache.h File Reference
#include "nfs41.h"
Include dependency graph for name_cache.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

static __inline struct nfs41_name_cacheclient_name_cache (IN nfs41_client *client)
 
static __inline struct nfs41_name_cachesession_name_cache (IN nfs41_session *session)
 
int nfs41_attr_cache_lookup (IN struct nfs41_name_cache *cache, IN uint64_t fileid, OUT nfs41_file_info *info_out)
 
int nfs41_attr_cache_update (IN struct nfs41_name_cache *cache, IN uint64_t fileid, IN const nfs41_file_info *info)
 
int nfs41_name_cache_create (OUT struct nfs41_name_cache **cache_out)
 
int nfs41_name_cache_free (IN OUT struct nfs41_name_cache **cache_out)
 
int nfs41_name_cache_lookup (IN struct nfs41_name_cache *cache, IN const char *path, IN const char *path_end, OUT OPTIONAL const char **remaining_path_out, OUT OPTIONAL nfs41_fh *parent_out, OUT OPTIONAL nfs41_fh *target_out, OUT OPTIONAL nfs41_file_info *info_out, OUT OPTIONAL bool_t *is_negative)
 
int nfs41_name_cache_insert (IN struct nfs41_name_cache *cache, IN const char *path, IN const nfs41_component *name, IN OPTIONAL const nfs41_fh *fh, IN OPTIONAL const nfs41_file_info *info, IN OPTIONAL const change_info4 *cinfo, IN enum open_delegation_type4 delegation)
 
int nfs41_name_cache_delegreturn (IN struct nfs41_name_cache *cache, IN uint64_t fileid, IN const char *path, IN const nfs41_component *name)
 
int nfs41_name_cache_remove (IN struct nfs41_name_cache *cache, IN const char *path, IN const nfs41_component *name, IN uint64_t fileid, IN const change_info4 *cinfo)
 
int nfs41_name_cache_rename (IN struct nfs41_name_cache *cache, IN const char *src_path, IN const nfs41_component *src_name, IN const change_info4 *src_cinfo, IN const char *dst_path, IN const nfs41_component *dst_name, IN const change_info4 *dst_cinfo)
 
int nfs41_name_cache_remove_stale (IN struct nfs41_name_cache *cache, IN nfs41_session *session, IN nfs41_abs_path *path)
 

Function Documentation

◆ client_name_cache()

static __inline struct nfs41_name_cache* client_name_cache ( IN nfs41_client client)
static

Definition at line 28 of file name_cache.h.

Referenced by nfs41_delegation_getattr(), and session_name_cache().

30 {
32 }
struct nfs41_name_cache * name_cache
Definition: nfs41.h:84
static __inline nfs41_server * client_server(IN nfs41_client *client)
Definition: nfs41.h:428
static FILE * client
Definition: client.c:41

◆ nfs41_attr_cache_lookup()

int nfs41_attr_cache_lookup ( IN struct nfs41_name_cache cache,
IN uint64_t  fileid,
OUT nfs41_file_info info_out 
)

Definition at line 859 of file name_cache.c.

Referenced by nfs41_cached_getattr(), nfs41_delegation_getattr(), and session_name_cache().

863 {
864  struct attr_cache_entry *entry;
865  int status = NO_ERROR;
866 
867  dprintf(NCLVL1, "--> nfs41_attr_cache_lookup(%llu)\n", fileid);
868 
870 
871  if (!name_cache_enabled(cache)) {
872  status = ERROR_NOT_SUPPORTED;
873  goto out_unlock;
874  }
875 
876  entry = attr_cache_search(&cache->attributes, fileid);
877  if (entry == NULL || attr_cache_entry_expired(entry)) {
878  status = ERROR_FILE_NOT_FOUND;
879  goto out_unlock;
880  }
881 
882  copy_attrs(info_out, entry);
883 
884 out_unlock:
886 
887  dprintf(NCLVL1, "<-- nfs41_attr_cache_lookup() returning %d\n", status);
888  return status;
889 }
Definition: cache.c:46
static void copy_attrs(OUT nfs41_file_info *dst, IN const struct attr_cache_entry *src)
Definition: name_cache.c:329
uint8_t entry
Definition: isohybrid.c:63
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
static __inline int attr_cache_entry_expired(IN const struct attr_cache_entry *entry)
Definition: name_cache.c:178
#define NO_ERROR
Definition: dderror.h:5
Definition: name_cache.c:80
#define dprintf
Definition: regdump.c:33
smooth NULL
Definition: ftsmooth.c:416
HANDLE lock
Definition: cache.c:50
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define ERROR_NOT_SUPPORTED
Definition: compat.h:90
static SERVICE_STATUS status
Definition: service.c:31
VOID WINAPI AcquireSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:61
VOID WINAPI ReleaseSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:89
static struct attr_cache_entry * attr_cache_search(IN struct attr_cache *cache, IN uint64_t fileid)
Definition: name_cache.c:219
Definition: ps.c:97

◆ nfs41_attr_cache_update()

int nfs41_attr_cache_update ( IN struct nfs41_name_cache cache,
IN uint64_t  fileid,
IN const nfs41_file_info info 
)

Definition at line 891 of file name_cache.c.

Referenced by nfs41_close(), nfs41_commit(), nfs41_create(), nfs41_getattr(), nfs41_link(), nfs41_remove(), nfs41_rename(), nfs41_setattr(), nfs41_write(), open_update_cache(), pnfs_rpc_layoutcommit(), and session_name_cache().

895 {
896  struct attr_cache_entry *entry;
897  int status = NO_ERROR;
898 
899  dprintf(NCLVL1, "--> nfs41_attr_cache_update(%llu)\n", fileid);
900 
902 
903  if (!name_cache_enabled(cache)) {
904  status = ERROR_NOT_SUPPORTED;
905  goto out_unlock;
906  }
907 
908  entry = attr_cache_search(&cache->attributes, fileid);
909  if (entry == NULL) {
910  status = ERROR_FILE_NOT_FOUND;
911  goto out_unlock;
912  }
913 
915 
916 out_unlock:
918 
919  dprintf(NCLVL1, "<-- nfs41_attr_cache_update() returning %d\n", status);
920  return status;
921 }
Definition: cache.c:46
VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:54
uint8_t entry
Definition: isohybrid.c:63
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
#define NO_ERROR
Definition: dderror.h:5
Definition: name_cache.c:80
#define dprintf
Definition: regdump.c:33
smooth NULL
Definition: ftsmooth.c:416
HANDLE lock
Definition: cache.c:50
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:82
static void attr_cache_update(IN struct attr_cache_entry *entry, IN const nfs41_file_info *info, IN enum open_delegation_type4 delegation)
Definition: name_cache.c:282
#define ERROR_NOT_SUPPORTED
Definition: compat.h:90
static SERVICE_STATUS status
Definition: service.c:31
static struct attr_cache_entry * attr_cache_search(IN struct attr_cache *cache, IN uint64_t fileid)
Definition: name_cache.c:219
Definition: ps.c:97

◆ nfs41_name_cache_create()

int nfs41_name_cache_create ( OUT struct nfs41_name_cache **  cache_out)

Definition at line 752 of file name_cache.c.

Referenced by server_create(), and session_name_cache().

754 {
755  struct nfs41_name_cache *cache;
756  int status = NO_ERROR;
757 
758  dprintf(NCLVL1, "nfs41_name_cache_create()\n");
759 
760  /* allocate the cache */
761  cache = calloc(1, sizeof(struct nfs41_name_cache));
762  if (cache == NULL) {
763  status = GetLastError();
764  goto out;
765  }
766 
767  list_init(&cache->exp_entries);
771  InitializeSRWLock(&cache->lock);
772 
773  /* allocate a pool of entries */
774  cache->pool = calloc(cache->max_entries, NAME_ENTRY_SIZE);
775  if (cache->pool == NULL) {
776  status = GetLastError();
777  goto out_err_cache;
778  }
779 
780  /* initialize the attribute cache */
781  status = attr_cache_init(&cache->attributes, cache->max_entries);
782  if (status)
783  goto out_err_pool;
784 
785  *cache_out = cache;
786 out:
787  return status;
788 
789 out_err_pool:
790  free(cache->pool);
791 out_err_cache:
792  free(cache);
793  goto out;
794 }
#define NAME_CACHE_EXPIRATION
Definition: name_cache.c:42
#define free
Definition: debug_ros.c:5
uint32_t max_delegations
Definition: name_cache.c:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
uint32_t expiration
Definition: name_cache.c:387
struct attr_cache attributes
Definition: name_cache.c:385
uint32_t max_entries
Definition: name_cache.c:389
#define NO_ERROR
Definition: dderror.h:5
struct list_entry exp_entries
Definition: name_cache.c:386
#define dprintf
Definition: regdump.c:33
smooth NULL
Definition: ftsmooth.c:416
#define NAME_CACHE_MAX_ENTRIES
Definition: name_cache.c:750
struct name_cache_entry * pool
Definition: name_cache.c:384
static FILE * out
Definition: regtests2xml.c:44
static IOleCache * cache
Definition: ole2.c:81
VOID WINAPI InitializeSRWLock(PSRWLOCK Lock)
Definition: sync.c:75
#define calloc
Definition: rosglue.h:14
static int attr_cache_init(IN struct attr_cache *cache, IN uint32_t max_entries)
Definition: name_cache.c:186
#define NAME_ENTRY_SIZE
Definition: name_cache.c:373
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
Definition: list.h:149
static SERVICE_STATUS status
Definition: service.c:31
Definition: ps.c:97

◆ nfs41_name_cache_delegreturn()

int nfs41_name_cache_delegreturn ( IN struct nfs41_name_cache cache,
IN uint64_t  fileid,
IN const char path,
IN const nfs41_component name 
)

Definition at line 1012 of file name_cache.c.

Referenced by nfs41_delegreturn(), and session_name_cache().

1017 {
1018  struct name_cache_entry *parent, *target;
1019  struct attr_cache_entry *attributes;
1020  int status;
1021 
1022  dprintf(NCLVL1, "--> nfs41_name_cache_delegreturn(%llu, '%s')\n",
1023  fileid, path);
1024 
1026 
1027  if (!name_cache_enabled(cache)) {
1028  status = ERROR_NOT_SUPPORTED;
1029  goto out_unlock;
1030  }
1031 
1032  status = name_cache_lookup(cache, 0, path,
1033  name->name + name->len, NULL, &parent, &target, NULL);
1034  if (status == NO_ERROR) {
1035  /* put the name cache entry back on the exp_entries list */
1036  list_add_head(&cache->exp_entries, &target->exp_entry);
1038 
1039  attributes = target->attributes;
1040  } else {
1041  /* should still have an attr cache entry */
1042  attributes = attr_cache_search(&cache->attributes, fileid);
1043  }
1044 
1045  if (attributes == NULL) {
1046  status = ERROR_FILE_NOT_FOUND;
1047  goto out_unlock;
1048  }
1049 
1050  /* release the reference from name_cache_entry_update() */
1051  if (attributes->delegated) {
1052  attributes->delegated = FALSE;
1053  attr_cache_entry_deref(&cache->attributes, attributes);
1054  assert(cache->delegations > 0);
1055  cache->delegations--;
1056  }
1057  status = NO_ERROR;
1058 
1059 out_unlock:
1061 
1062  dprintf(NCLVL1, "<-- nfs41_name_cache_delegreturn() returning %d\n", status);
1063  return status;
1064 }
Definition: cache.c:46
VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:54
static void name_cache_entry_updated(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry)
Definition: name_cache.c:510
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
Definition: list.h:96
#define assert(x)
Definition: debug.h:53
#define NO_ERROR
Definition: dderror.h:5
Definition: name_cache.c:80
#define dprintf
Definition: regdump.c:33
smooth NULL
Definition: ftsmooth.c:416
HANDLE lock
Definition: cache.c:50
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static int name_cache_lookup(IN struct nfs41_name_cache *cache, IN bool_t skip_invis, IN const char *path, IN const char *path_end, OUT OPTIONAL const char **remaining_path_out, OUT OPTIONAL struct name_cache_entry **parent_out, OUT OPTIONAL struct name_cache_entry **target_out, OUT OPTIONAL bool_t *is_negative)
Definition: name_cache.c:648
r parent
Definition: btrfs.c:2644
static __inline void attr_cache_entry_deref(IN struct attr_cache *cache, IN struct attr_cache_entry *entry)
Definition: name_cache.c:166
VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:82
Definition: services.c:325
#define ERROR_NOT_SUPPORTED
Definition: compat.h:90
Definition: name.c:36
GLenum target
Definition: glext.h:7315
static SERVICE_STATUS status
Definition: service.c:31
Definition: name_cache.c:362
static struct attr_cache_entry * attr_cache_search(IN struct attr_cache *cache, IN uint64_t fileid)
Definition: name_cache.c:219
WCHAR * name
Definition: name.c:40

◆ nfs41_name_cache_free()

int nfs41_name_cache_free ( IN OUT struct nfs41_name_cache **  cache_out)

Referenced by session_name_cache().

◆ nfs41_name_cache_insert()

int nfs41_name_cache_insert ( IN struct nfs41_name_cache cache,
IN const char path,
IN const nfs41_component name,
IN OPTIONAL const nfs41_fh fh,
IN OPTIONAL const nfs41_file_info info,
IN OPTIONAL const change_info4 cinfo,
IN enum open_delegation_type4  delegation 
)

Definition at line 923 of file name_cache.c.

Referenced by nfs41_create(), nfs41_link(), open_update_cache(), server_lookup(), and session_name_cache().

931 {
932  struct name_cache_entry *parent, *target;
933  int status;
934 
935  dprintf(NCLVL1, "--> nfs41_name_cache_insert('%.*s')\n",
936  name->name + name->len - path, path);
937 
939 
940  if (!name_cache_enabled(cache)) {
941  status = ERROR_NOT_SUPPORTED;
942  goto out_unlock;
943  }
944 
945  /* limit the number of delegations to prevent attr cache starvation */
946  if (is_delegation(delegation) &&
947  cache->delegations >= cache->max_delegations) {
948  status = ERROR_TOO_MANY_OPEN_FILES;
949  goto out_unlock;
950  }
951 
952  /* an empty path or component implies the root entry */
953  if (path == NULL || name == NULL || name->len == 0) {
954  /* create the root entry if it doesn't exist */
955  if (cache->root == NULL) {
956  const nfs41_component name = { "ROOT", 4 };
957  status = name_cache_entry_create(cache, &name, &cache->root);
958  if (status)
959  goto out_err_deleg;
960  }
961  target = cache->root;
962  } else {
963  /* find/create an entry under its parent */
964  status = name_cache_lookup(cache, 0, path,
965  name->name, NULL, NULL, &parent, NULL);
966  if (status)
967  goto out_err_deleg;
968 
969  if (cinfo && name_cache_entry_changed(cache, parent, cinfo)) {
971  goto out_err_deleg;
972  }
973 
974  status = name_cache_find_or_create(cache, parent, name, &target);
975  if (status)
976  goto out_err_deleg;
977  }
978 
979  /* pass in the new fh/attributes */
980  status = name_cache_entry_update(cache, target, fh, info, delegation);
981  if (status)
982  goto out_err_update;
983 
984 out_unlock:
986 
987  dprintf(NCLVL1, "<-- nfs41_name_cache_insert() returning %d\n",
988  status);
989  return status;
990 
991 out_err_update:
992  /* a failure in name_cache_entry_update() leaves a negative entry
993  * where there shouldn't be one; remove it from the cache */
995 
996 out_err_deleg:
997  if (is_delegation(delegation)) {
998  /* we still need a reference to the attributes for the delegation */
999  struct attr_cache_entry *attributes;
1000  status = attr_cache_find_or_create(&cache->attributes,
1001  info->fileid, &attributes);
1002  if (status == NO_ERROR) {
1003  attr_cache_update(attributes, info, delegation);
1004  cache->delegations++;
1005  }
1006  else
1007  status = ERROR_TOO_MANY_OPEN_FILES;
1008  }
1009  goto out_unlock;
1010 }
Definition: cache.c:46
VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:54
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
static int attr_cache_find_or_create(IN struct attr_cache *cache, IN uint64_t fileid, OUT struct attr_cache_entry **entry_out)
Definition: name_cache.c:244
#define NO_ERROR
Definition: dderror.h:5
Definition: name_cache.c:80
#define dprintf
Definition: regdump.c:33
static __inline bool_t is_delegation(IN enum open_delegation_type4 type)
Definition: name_cache.c:72
smooth NULL
Definition: ftsmooth.c:416
HANDLE lock
Definition: cache.c:50
static int name_cache_lookup(IN struct nfs41_name_cache *cache, IN bool_t skip_invis, IN const char *path, IN const char *path_end, OUT OPTIONAL const char **remaining_path_out, OUT OPTIONAL struct name_cache_entry **parent_out, OUT OPTIONAL struct name_cache_entry **target_out, OUT OPTIONAL bool_t *is_negative)
Definition: name_cache.c:648
static int name_cache_entry_create(IN struct nfs41_name_cache *cache, IN const nfs41_component *component, OUT struct name_cache_entry **entry_out)
Definition: name_cache.c:459
r parent
Definition: btrfs.c:2644
static void name_cache_entry_invalidate(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry)
Definition: name_cache.c:587
static int name_cache_find_or_create(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *parent, IN const nfs41_component *component, OUT struct name_cache_entry **target_out)
Definition: name_cache.c:712
static int name_cache_entry_changed(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry, IN const change_info4 *cinfo)
Definition: name_cache.c:563
VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:82
static int name_cache_entry_update(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry, IN OPTIONAL const nfs41_fh *fh, IN OPTIONAL const nfs41_file_info *info, IN enum open_delegation_type4 delegation)
Definition: name_cache.c:519
#define ERROR_TOO_MANY_OPEN_FILES
Definition: winerror.h:107
nfs41_fh fh
Definition: name_cache.c:364
Definition: services.c:325
static void attr_cache_update(IN struct attr_cache_entry *entry, IN const nfs41_file_info *info, IN enum open_delegation_type4 delegation)
Definition: name_cache.c:282
#define ERROR_NOT_SUPPORTED
Definition: compat.h:90
Definition: name.c:36
GLenum target
Definition: glext.h:7315
static SERVICE_STATUS status
Definition: service.c:31
Definition: name_cache.c:362
WCHAR * name
Definition: name.c:40

◆ nfs41_name_cache_lookup()

int nfs41_name_cache_lookup ( IN struct nfs41_name_cache cache,
IN const char path,
IN const char path_end,
OUT OPTIONAL const char **  remaining_path_out,
OUT OPTIONAL nfs41_fh parent_out,
OUT OPTIONAL nfs41_fh target_out,
OUT OPTIONAL nfs41_file_info info_out,
OUT OPTIONAL bool_t is_negative 
)

Definition at line 824 of file name_cache.c.

Referenced by nfs41_lookup(), and session_name_cache().

833 {
834  struct name_cache_entry *parent, *target;
835  const char *path_pos = path;
836  int status;
837 
839 
840  if (!name_cache_enabled(cache)) {
841  status = ERROR_NOT_SUPPORTED;
842  goto out_unlock;
843  }
844 
845  status = name_cache_lookup(cache, 1, path, path_end,
846  &path_pos, &parent, &target, is_negative);
847 
848  if (parent_out) copy_fh(parent_out, parent);
849  if (target_out) copy_fh(target_out, target);
850  if (info_out && target && target->attributes)
851  copy_attrs(info_out, target->attributes);
852 
853 out_unlock:
855  if (remaining_path_out) *remaining_path_out = path_pos;
856  return status;
857 }
Definition: cache.c:46
static void copy_attrs(OUT nfs41_file_info *dst, IN const struct attr_cache_entry *src)
Definition: name_cache.c:329
GLsizei const GLchar ** path
Definition: glext.h:7234
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
HANDLE lock
Definition: cache.c:50
static int name_cache_lookup(IN struct nfs41_name_cache *cache, IN bool_t skip_invis, IN const char *path, IN const char *path_end, OUT OPTIONAL const char **remaining_path_out, OUT OPTIONAL struct name_cache_entry **parent_out, OUT OPTIONAL struct name_cache_entry **target_out, OUT OPTIONAL bool_t *is_negative)
Definition: name_cache.c:648
r parent
Definition: btrfs.c:2644
static __inline void copy_fh(OUT nfs41_fh *dst, IN OPTIONAL const struct name_cache_entry *src)
Definition: name_cache.c:814
Definition: services.c:325
#define ERROR_NOT_SUPPORTED
Definition: compat.h:90
GLenum target
Definition: glext.h:7315
static SERVICE_STATUS status
Definition: service.c:31
Definition: name_cache.c:362
VOID WINAPI AcquireSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:61
VOID WINAPI ReleaseSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:89

◆ nfs41_name_cache_remove()

int nfs41_name_cache_remove ( IN struct nfs41_name_cache cache,
IN const char path,
IN const nfs41_component name,
IN uint64_t  fileid,
IN const change_info4 cinfo 
)

Definition at line 1066 of file name_cache.c.

Referenced by nfs41_remove(), and session_name_cache().

1072 {
1073  struct name_cache_entry *parent, *target;
1074  struct attr_cache_entry *attributes = NULL;
1075  int status;
1076 
1077  dprintf(NCLVL1, "--> nfs41_name_cache_remove('%s')\n", path);
1078 
1080 
1081  if (!name_cache_enabled(cache)) {
1082  status = ERROR_NOT_SUPPORTED;
1083  goto out_unlock;
1084  }
1085 
1086  status = name_cache_lookup(cache, 0, path,
1087  name->name + name->len, NULL, &parent, &target, NULL);
1088  if (status == ERROR_PATH_NOT_FOUND)
1089  goto out_attributes;
1090 
1091  if (cinfo && name_cache_entry_changed(cache, parent, cinfo)) {
1093  goto out_attributes;
1094  }
1095 
1096  if (status == ERROR_FILE_NOT_FOUND)
1097  goto out_attributes;
1098 
1099  if (target->attributes)
1100  target->attributes->numlinks--;
1101 
1102  /* make this a negative entry and unlink children */
1105 
1106 out_unlock:
1108 
1109  dprintf(NCLVL1, "<-- nfs41_name_cache_remove() returning %d\n", status);
1110  return status;
1111 
1112 out_attributes:
1113  /* in the presence of other links, we need to update numlinks
1114  * regardless of a failure to find the target entry */
1115  dprintf(NCLVL1, "nfs41_name_cache_remove: need to find attributes for %s\n", path);
1116  attributes = attr_cache_search(&cache->attributes, fileid);
1117  if (attributes)
1118  attributes->numlinks--;
1119  goto out_unlock;
1120 }
Definition: cache.c:46
VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:54
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
Definition: name_cache.c:80
#define dprintf
Definition: regdump.c:33
smooth NULL
Definition: ftsmooth.c:416
HANDLE lock
Definition: cache.c:50
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static int name_cache_lookup(IN struct nfs41_name_cache *cache, IN bool_t skip_invis, IN const char *path, IN const char *path_end, OUT OPTIONAL const char **remaining_path_out, OUT OPTIONAL struct name_cache_entry **parent_out, OUT OPTIONAL struct name_cache_entry **target_out, OUT OPTIONAL bool_t *is_negative)
Definition: name_cache.c:648
r parent
Definition: btrfs.c:2644
static void name_cache_entry_invalidate(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry)
Definition: name_cache.c:587
static void name_cache_unlink_children_recursive(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *parent)
Definition: name_cache.c:450
static int name_cache_entry_changed(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry, IN const change_info4 *cinfo)
Definition: name_cache.c:563
VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:82
static int name_cache_entry_update(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry, IN OPTIONAL const nfs41_fh *fh, IN OPTIONAL const nfs41_file_info *info, IN enum open_delegation_type4 delegation)
Definition: name_cache.c:519
Definition: services.c:325
#define ERROR_NOT_SUPPORTED
Definition: compat.h:90
Definition: name.c:36
GLenum target
Definition: glext.h:7315
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
static SERVICE_STATUS status
Definition: service.c:31
Definition: name_cache.c:362
static struct attr_cache_entry * attr_cache_search(IN struct attr_cache *cache, IN uint64_t fileid)
Definition: name_cache.c:219
WCHAR * name
Definition: name.c:40

◆ nfs41_name_cache_remove_stale()

int nfs41_name_cache_remove_stale ( IN struct nfs41_name_cache cache,
IN nfs41_session session,
IN nfs41_abs_path path 
)

Definition at line 1359 of file name_cache.c.

Referenced by compound_encode_send_decode(), and session_name_cache().

1363 {
1365  const char *path_pos = path->path;
1366  const char* const path_end = path->path + path->len;
1367  const uint32_t max_components = max_putfh_components(session);
1368  uint32_t count, index;
1369  int status = NO_ERROR;
1370 
1372 
1373  /* if there's no cache, don't check any components */
1374  if (!name_cache_enabled(cache))
1375  path_pos = path_end;
1376 
1378 
1379  /* hold a lock on the path to protect against rename */
1380  AcquireSRWLockShared(&path->lock);
1381 
1382  while (get_path_fhs(cache, path, &path_pos, max_components, files, &count)) {
1383  status = rpc_array_putfh(session, files, count, &index);
1384 
1385  if (status == NFS4ERR_STALE || status == NFS4ERR_FHEXPIRED) {
1386  status = delete_stale_component(cache,
1387  session, path, &files[index].name);
1388  break;
1389  }
1390  if (status) {
1391  status = nfs_to_windows_error(status, ERROR_FILE_NOT_FOUND);
1392  break;
1393  }
1394  }
1395 
1396  ReleaseSRWLockShared(&path->lock);
1397 
1398  return status;
1399 }
#define MAX_PUTFH_PER_COMPOUND
Definition: name_cache.c:1231
Definition: cache.c:46
int nfs_to_windows_error(int status, int default_error)
Definition: util.c:235
GLuint GLuint GLsizei count
Definition: gl.h:1545
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
#define NO_ERROR
Definition: dderror.h:5
static __inline uint32_t max_putfh_components(IN const nfs41_session *session)
Definition: name_cache.c:1352
HANDLE lock
Definition: cache.c:50
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static bool_t get_path_fhs(IN struct nfs41_name_cache *cache, IN nfs41_abs_path *path, IN OUT const char **path_pos, IN uint32_t max_components, OUT nfs41_path_fh *files, OUT uint32_t *count)
Definition: name_cache.c:1233
#define index(s, c)
Definition: various.h:29
Definition: services.c:325
UINT32 uint32_t
Definition: types.h:75
static int delete_stale_component(IN struct nfs41_name_cache *cache, IN nfs41_session *session, IN const nfs41_abs_path *path, IN const nfs41_component *component)
Definition: name_cache.c:1327
static int rpc_array_putfh(IN nfs41_session *session, IN nfs41_path_fh *files, IN uint32_t count, OUT uint32_t *valid_out)
Definition: name_cache.c:1283
Definition: name.c:36
static SERVICE_STATUS status
Definition: service.c:31
VOID WINAPI AcquireSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:61
VOID WINAPI ReleaseSRWLockShared(PSRWLOCK Lock)
Definition: sync.c:89
Definition: ps.c:97

◆ nfs41_name_cache_rename()

int nfs41_name_cache_rename ( IN struct nfs41_name_cache cache,
IN const char src_path,
IN const nfs41_component src_name,
IN const change_info4 src_cinfo,
IN const char dst_path,
IN const nfs41_component dst_name,
IN const change_info4 dst_cinfo 
)

Definition at line 1122 of file name_cache.c.

Referenced by nfs41_rename(), and session_name_cache().

1130 {
1131  struct name_cache_entry *src_parent, *src;
1132  struct name_cache_entry *dst_parent;
1133  int status = NO_ERROR;
1134 
1135  dprintf(NCLVL1, "--> nfs41_name_cache_rename('%s' to '%s')\n",
1136  src_path, dst_path);
1137 
1139 
1140  if (!name_cache_enabled(cache)) {
1141  status = ERROR_NOT_SUPPORTED;
1142  goto out_unlock;
1143  }
1144 
1145  /* look up dst_parent */
1146  status = name_cache_lookup(cache, 0, dst_path,
1147  dst_name->name, NULL, NULL, &dst_parent, NULL);
1148  /* we can't create the dst entry without a parent */
1149  if (status || dst_parent->attributes == NULL) {
1150  /* if src exists, make it negative */
1151  dprintf(NCLVL1, "nfs41_name_cache_rename: adding negative cache "
1152  "entry for %.*s\n", src_name->len, src_name->name);
1153  status = name_cache_lookup(cache, 0, src_path,
1154  src_name->name + src_name->len, NULL, NULL, &src, NULL);
1155  if (status == NO_ERROR) {
1158  }
1159  status = ERROR_PATH_NOT_FOUND;
1160  goto out_unlock;
1161  }
1162 
1163  /* look up src_parent and src */
1164  status = name_cache_lookup(cache, 0, src_path,
1165  src_name->name + src_name->len, NULL, &src_parent, &src, NULL);
1166  /* we can't create the dst entry without valid attributes */
1167  if (status || src->attributes == NULL) {
1168  /* remove dst if it exists */
1169  struct name_cache_entry *dst;
1170  dprintf(NCLVL1, "nfs41_name_cache_rename: removing negative cache "
1171  "entry for %.*s\n", dst_name->len, dst_name->name);
1172  dst = name_cache_search(cache, dst_parent, dst_name);
1173  if (dst) name_cache_unlink(cache, dst);
1174  goto out_unlock;
1175  }
1176 
1177  if (name_cache_entry_changed(cache, dst_parent, dst_cinfo)) {
1178  name_cache_entry_invalidate(cache, dst_parent);
1179  /* if dst_parent and src_parent are both gone,
1180  * we no longer have an entry to rename */
1181  if (dst_parent == src_parent)
1182  goto out_unlock;
1183  } else {
1184  struct name_cache_entry *existing;
1185  existing = name_cache_search(cache, dst_parent, dst_name);
1186  if (existing) {
1187  if (existing == src)
1188  goto out_unlock;
1189  /* remove the existing entry, but don't unlink it yet;
1190  * we may reuse it for a negative entry */
1191  name_cache_remove(existing, dst_parent);
1192  }
1193 
1194  /* move the src entry under dst_parent */
1195  name_cache_remove(src, src_parent);
1196  name_cache_entry_rename(src, dst_name);
1197  name_cache_insert(src, dst_parent);
1198 
1199  if (existing) {
1200  /* recycle 'existing' as the negative entry 'src' */
1201  name_cache_entry_rename(existing, src_name);
1202  name_cache_insert(existing, src_parent);
1203  }
1204  src = existing;
1205  }
1206 
1207  if (name_cache_entry_changed(cache, src_parent, src_cinfo)) {
1208  name_cache_entry_invalidate(cache, src_parent);
1209  goto out_unlock;
1210  }
1211 
1212  /* leave a negative entry where the file used to be */
1213  if (src == NULL) {
1214  /* src was moved, create a new entry in its place */
1215  status = name_cache_find_or_create(cache, src_parent, src_name, &src);
1216  if (status)
1217  goto out_unlock;
1218  }
1221 
1222 out_unlock:
1224 
1225  dprintf(NCLVL1, "<-- nfs41_name_cache_rename() returning %d\n", status);
1226  return status;
1227 }
Definition: cache.c:46
VOID WINAPI AcquireSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:54
static int name_cache_insert(IN struct name_cache_entry *entry, IN struct name_cache_entry *parent)
Definition: name_cache.c:696
static __inline bool_t name_cache_enabled(IN struct nfs41_name_cache *cache)
Definition: name_cache.c:401
#define NO_ERROR
Definition: dderror.h:5
GLuint const GLubyte GLvoid * src
Definition: s_context.h:57
#define dprintf
Definition: regdump.c:33
smooth NULL
Definition: ftsmooth.c:416
HANDLE lock
Definition: cache.c:50
static int name_cache_lookup(IN struct nfs41_name_cache *cache, IN bool_t skip_invis, IN const char *path, IN const char *path_end, OUT OPTIONAL const char **remaining_path_out, OUT OPTIONAL struct name_cache_entry **parent_out, OUT OPTIONAL struct name_cache_entry **target_out, OUT OPTIONAL bool_t *is_negative)
Definition: name_cache.c:648
static void name_cache_entry_invalidate(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry)
Definition: name_cache.c:587
static int name_cache_find_or_create(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *parent, IN const nfs41_component *component, OUT struct name_cache_entry **target_out)
Definition: name_cache.c:712
static void name_cache_unlink_children_recursive(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *parent)
Definition: name_cache.c:450
static int name_cache_entry_changed(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry, IN const change_info4 *cinfo)
Definition: name_cache.c:563
static __inline void name_cache_entry_rename(OUT struct name_cache_entry *entry, IN const nfs41_component *component)
Definition: name_cache.c:407
VOID WINAPI ReleaseSRWLockExclusive(PSRWLOCK Lock)
Definition: sync.c:82
static int name_cache_entry_update(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry, IN OPTIONAL const nfs41_fh *fh, IN OPTIONAL const nfs41_file_info *info, IN enum open_delegation_type4 delegation)
Definition: name_cache.c:519
GLuint const GLubyte GLvoid const GLvoid * dst
Definition: s_context.h:57
static __inline void name_cache_remove(IN struct name_cache_entry *entry, IN struct name_cache_entry *parent)
Definition: name_cache.c:416
static struct name_cache_entry * name_cache_search(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *parent, IN const nfs41_component *component)
Definition: name_cache.c:601
#define ERROR_NOT_SUPPORTED
Definition: compat.h:90
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
static SERVICE_STATUS status
Definition: service.c:31
Definition: name_cache.c:362
static __inline void name_cache_unlink(IN struct nfs41_name_cache *cache, IN struct name_cache_entry *entry)
Definition: name_cache.c:428
Definition: ps.c:97

◆ session_name_cache()

static __inline struct nfs41_name_cache* session_name_cache ( IN nfs41_session session)
static

Definition at line 34 of file name_cache.h.

Referenced by compound_encode_send_decode(), nfs41_cached_getattr(), nfs41_close(), nfs41_commit(), nfs41_create(), nfs41_delegreturn(), nfs41_getattr(), nfs41_link(), nfs41_lookup(), nfs41_remove(), nfs41_rename(), nfs41_setattr(), nfs41_write(), open_update_cache(), pnfs_rpc_layoutcommit(), and server_lookup().

36 {
37  return client_name_cache(session->client);
38 }
static __inline struct nfs41_name_cache * client_name_cache(IN nfs41_client *client)
Definition: name_cache.h:28