Lines Matching refs:cfid

16 static void free_cached_dir(struct cached_fid *cfid);
22 struct cached_fid *cfid; in find_or_create_cached_dir() local
25 list_for_each_entry(cfid, &cfids->entries, entry) { in find_or_create_cached_dir()
26 if (!strcmp(cfid->path, path)) { in find_or_create_cached_dir()
32 if (!cfid->has_lease) { in find_or_create_cached_dir()
36 kref_get(&cfid->refcount); in find_or_create_cached_dir()
38 return cfid; in find_or_create_cached_dir()
49 cfid = init_cached_dir(path); in find_or_create_cached_dir()
50 if (cfid == NULL) { in find_or_create_cached_dir()
54 cfid->cfids = cfids; in find_or_create_cached_dir()
56 list_add(&cfid->entry, &cfids->entries); in find_or_create_cached_dir()
57 cfid->on_list = true; in find_or_create_cached_dir()
58 kref_get(&cfid->refcount); in find_or_create_cached_dir()
60 return cfid; in find_or_create_cached_dir()
125 struct cached_fid *cfid; in open_cached_dir() local
146 cfid = find_or_create_cached_dir(cfids, path, lookup_only); in open_cached_dir()
147 if (cfid == NULL) { in open_cached_dir()
156 if (cfid->has_lease) { in open_cached_dir()
157 *ret_cfid = cfid; in open_cached_dir()
172 pfid = &cfid->fid; in open_cached_dir()
249 (char *)&cfid->file_all_info)) in open_cached_dir()
250 cfid->file_all_info_is_valid = true; in open_cached_dir()
261 cfid->dentry = dentry; in open_cached_dir()
262 cfid->tcon = tcon; in open_cached_dir()
263 cfid->time = jiffies; in open_cached_dir()
264 cfid->is_open = true; in open_cached_dir()
265 cfid->has_lease = true; in open_cached_dir()
274 if (!cfid->has_lease) { in open_cached_dir()
275 if (cfid->on_list) { in open_cached_dir()
276 list_del(&cfid->entry); in open_cached_dir()
277 cfid->on_list = false; in open_cached_dir()
284 free_cached_dir(cfid); in open_cached_dir()
285 cfid = NULL; in open_cached_dir()
289 *ret_cfid = cfid; in open_cached_dir()
298 struct cached_fid *cfid; in open_cached_dir_by_dentry() local
305 list_for_each_entry(cfid, &cfids->entries, entry) { in open_cached_dir_by_dentry()
306 if (dentry && cfid->dentry == dentry) { in open_cached_dir_by_dentry()
308 kref_get(&cfid->refcount); in open_cached_dir_by_dentry()
309 *ret_cfid = cfid; in open_cached_dir_by_dentry()
321 struct cached_fid *cfid = container_of(ref, struct cached_fid, in smb2_close_cached_fid() local
324 spin_lock(&cfid->cfids->cfid_list_lock); in smb2_close_cached_fid()
325 if (cfid->on_list) { in smb2_close_cached_fid()
326 list_del(&cfid->entry); in smb2_close_cached_fid()
327 cfid->on_list = false; in smb2_close_cached_fid()
328 cfid->cfids->num_entries--; in smb2_close_cached_fid()
330 spin_unlock(&cfid->cfids->cfid_list_lock); in smb2_close_cached_fid()
332 dput(cfid->dentry); in smb2_close_cached_fid()
333 cfid->dentry = NULL; in smb2_close_cached_fid()
335 if (cfid->is_open) { in smb2_close_cached_fid()
336 SMB2_close(0, cfid->tcon, cfid->fid.persistent_fid, in smb2_close_cached_fid()
337 cfid->fid.volatile_fid); in smb2_close_cached_fid()
340 free_cached_dir(cfid); in smb2_close_cached_fid()
346 struct cached_fid *cfid = NULL; in drop_cached_dir_by_name() local
349 rc = open_cached_dir(xid, tcon, name, cifs_sb, true, &cfid); in drop_cached_dir_by_name()
354 spin_lock(&cfid->cfids->cfid_list_lock); in drop_cached_dir_by_name()
355 if (cfid->has_lease) { in drop_cached_dir_by_name()
356 cfid->has_lease = false; in drop_cached_dir_by_name()
357 kref_put(&cfid->refcount, smb2_close_cached_fid); in drop_cached_dir_by_name()
359 spin_unlock(&cfid->cfids->cfid_list_lock); in drop_cached_dir_by_name()
360 close_cached_dir(cfid); in drop_cached_dir_by_name()
364 void close_cached_dir(struct cached_fid *cfid) in close_cached_dir() argument
366 kref_put(&cfid->refcount, smb2_close_cached_fid); in close_cached_dir()
376 struct cached_fid *cfid; in close_all_cached_dirs() local
389 list_for_each_entry(cfid, &cfids->entries, entry) { in close_all_cached_dirs()
390 dput(cfid->dentry); in close_all_cached_dirs()
391 cfid->dentry = NULL; in close_all_cached_dirs()
403 struct cached_fid *cfid, *q; in invalidate_all_cached_dirs() local
407 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in invalidate_all_cached_dirs()
408 list_move(&cfid->entry, &entry); in invalidate_all_cached_dirs()
410 cfid->is_open = false; in invalidate_all_cached_dirs()
411 cfid->on_list = false; in invalidate_all_cached_dirs()
413 kref_get(&cfid->refcount); in invalidate_all_cached_dirs()
417 list_for_each_entry_safe(cfid, q, &entry, entry) { in invalidate_all_cached_dirs()
418 list_del(&cfid->entry); in invalidate_all_cached_dirs()
419 cancel_work_sync(&cfid->lease_break); in invalidate_all_cached_dirs()
420 if (cfid->has_lease) { in invalidate_all_cached_dirs()
426 cfid->has_lease = false; in invalidate_all_cached_dirs()
428 kref_put(&cfid->refcount, smb2_close_cached_fid); in invalidate_all_cached_dirs()
431 kref_put(&cfid->refcount, smb2_close_cached_fid); in invalidate_all_cached_dirs()
438 struct cached_fid *cfid = container_of(work, in smb2_cached_lease_break() local
441 spin_lock(&cfid->cfids->cfid_list_lock); in smb2_cached_lease_break()
442 cfid->has_lease = false; in smb2_cached_lease_break()
443 spin_unlock(&cfid->cfids->cfid_list_lock); in smb2_cached_lease_break()
444 kref_put(&cfid->refcount, smb2_close_cached_fid); in smb2_cached_lease_break()
450 struct cached_fid *cfid; in cached_dir_lease_break() local
456 list_for_each_entry(cfid, &cfids->entries, entry) { in cached_dir_lease_break()
457 if (cfid->has_lease && in cached_dir_lease_break()
459 cfid->fid.lease_key, in cached_dir_lease_break()
461 cfid->time = 0; in cached_dir_lease_break()
466 list_del(&cfid->entry); in cached_dir_lease_break()
467 cfid->on_list = false; in cached_dir_lease_break()
471 &cfid->lease_break); in cached_dir_lease_break()
482 struct cached_fid *cfid; in init_cached_dir() local
484 cfid = kzalloc(sizeof(*cfid), GFP_ATOMIC); in init_cached_dir()
485 if (!cfid) in init_cached_dir()
487 cfid->path = kstrdup(path, GFP_ATOMIC); in init_cached_dir()
488 if (!cfid->path) { in init_cached_dir()
489 kfree(cfid); in init_cached_dir()
493 INIT_WORK(&cfid->lease_break, smb2_cached_lease_break); in init_cached_dir()
494 INIT_LIST_HEAD(&cfid->entry); in init_cached_dir()
495 INIT_LIST_HEAD(&cfid->dirents.entries); in init_cached_dir()
496 mutex_init(&cfid->dirents.de_mutex); in init_cached_dir()
497 spin_lock_init(&cfid->fid_lock); in init_cached_dir()
498 kref_init(&cfid->refcount); in init_cached_dir()
499 return cfid; in init_cached_dir()
502 static void free_cached_dir(struct cached_fid *cfid) in free_cached_dir() argument
506 dput(cfid->dentry); in free_cached_dir()
507 cfid->dentry = NULL; in free_cached_dir()
512 list_for_each_entry_safe(dirent, q, &cfid->dirents.entries, entry) { in free_cached_dir()
518 kfree(cfid->path); in free_cached_dir()
519 cfid->path = NULL; in free_cached_dir()
520 kfree(cfid); in free_cached_dir()
541 struct cached_fid *cfid, *q; in free_cached_dirs() local
545 list_for_each_entry_safe(cfid, q, &cfids->entries, entry) { in free_cached_dirs()
546 cfid->on_list = false; in free_cached_dirs()
547 cfid->is_open = false; in free_cached_dirs()
548 list_move(&cfid->entry, &entry); in free_cached_dirs()
552 list_for_each_entry_safe(cfid, q, &entry, entry) { in free_cached_dirs()
553 list_del(&cfid->entry); in free_cached_dirs()
554 free_cached_dir(cfid); in free_cached_dirs()