1 // SPDX-License-Identifier: GPL-2.0-only
3 * Ceph cache definitions.
5 * Copyright (C) 2013 by Adfin Solutions, Inc. All Rights Reserved.
6 * Written by Milosz Tanski (milosz@adfin.com)
9 #include <linux/ceph/ceph_debug.h>
11 #include <linux/fs_context.h>
15 void ceph_fscache_register_inode_cookie(struct inode
*inode
)
17 struct ceph_inode_info
*ci
= ceph_inode(inode
);
18 struct ceph_fs_client
*fsc
= ceph_inode_to_fs_client(inode
);
20 /* No caching for filesystem? */
24 /* Regular files only */
25 if (!S_ISREG(inode
->i_mode
))
28 /* Only new inodes! */
29 if (!(inode
->i_state
& I_NEW
))
32 WARN_ON_ONCE(ci
->netfs
.cache
);
35 fscache_acquire_cookie(fsc
->fscache
, 0,
36 &ci
->i_vino
, sizeof(ci
->i_vino
),
37 &ci
->i_version
, sizeof(ci
->i_version
),
40 mapping_set_release_always(inode
->i_mapping
);
43 void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info
*ci
)
45 fscache_relinquish_cookie(ceph_fscache_cookie(ci
), false);
48 void ceph_fscache_use_cookie(struct inode
*inode
, bool will_modify
)
50 struct ceph_inode_info
*ci
= ceph_inode(inode
);
52 fscache_use_cookie(ceph_fscache_cookie(ci
), will_modify
);
55 void ceph_fscache_unuse_cookie(struct inode
*inode
, bool update
)
57 struct ceph_inode_info
*ci
= ceph_inode(inode
);
60 loff_t i_size
= i_size_read(inode
);
62 fscache_unuse_cookie(ceph_fscache_cookie(ci
),
63 &ci
->i_version
, &i_size
);
65 fscache_unuse_cookie(ceph_fscache_cookie(ci
), NULL
, NULL
);
69 void ceph_fscache_update(struct inode
*inode
)
71 struct ceph_inode_info
*ci
= ceph_inode(inode
);
72 loff_t i_size
= i_size_read(inode
);
74 fscache_update_cookie(ceph_fscache_cookie(ci
), &ci
->i_version
, &i_size
);
77 void ceph_fscache_invalidate(struct inode
*inode
, bool dio_write
)
79 struct ceph_inode_info
*ci
= ceph_inode(inode
);
81 fscache_invalidate(ceph_fscache_cookie(ci
),
82 &ci
->i_version
, i_size_read(inode
),
83 dio_write
? FSCACHE_INVAL_DIO_WRITE
: 0);
86 int ceph_fscache_register_fs(struct ceph_fs_client
* fsc
, struct fs_context
*fc
)
88 const struct ceph_fsid
*fsid
= &fsc
->client
->fsid
;
89 const char *fscache_uniq
= fsc
->mount_options
->fscache_uniq
;
90 size_t uniq_len
= fscache_uniq
? strlen(fscache_uniq
) : 0;
94 name
= kasprintf(GFP_KERNEL
, "ceph,%pU%s%s", fsid
, uniq_len
? "," : "",
95 uniq_len
? fscache_uniq
: "");
99 fsc
->fscache
= fscache_acquire_volume(name
, NULL
, NULL
, 0);
100 if (IS_ERR_OR_NULL(fsc
->fscache
)) {
101 errorfc(fc
, "Unable to register fscache cookie for %s", name
);
102 err
= fsc
->fscache
? PTR_ERR(fsc
->fscache
) : -EOPNOTSUPP
;
109 void ceph_fscache_unregister_fs(struct ceph_fs_client
* fsc
)
111 fscache_relinquish_volume(fsc
->fscache
, NULL
, false);