]>
git.ipfire.org Git - people/ms/linux.git/blob - fs/ceph/cache.c
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_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
),
41 void ceph_fscache_unregister_inode_cookie(struct ceph_inode_info
*ci
)
43 fscache_relinquish_cookie(ceph_fscache_cookie(ci
), false);
46 void ceph_fscache_use_cookie(struct inode
*inode
, bool will_modify
)
48 struct ceph_inode_info
*ci
= ceph_inode(inode
);
50 fscache_use_cookie(ceph_fscache_cookie(ci
), will_modify
);
53 void ceph_fscache_unuse_cookie(struct inode
*inode
, bool update
)
55 struct ceph_inode_info
*ci
= ceph_inode(inode
);
58 loff_t i_size
= i_size_read(inode
);
60 fscache_unuse_cookie(ceph_fscache_cookie(ci
),
61 &ci
->i_version
, &i_size
);
63 fscache_unuse_cookie(ceph_fscache_cookie(ci
), NULL
, NULL
);
67 void ceph_fscache_update(struct inode
*inode
)
69 struct ceph_inode_info
*ci
= ceph_inode(inode
);
70 loff_t i_size
= i_size_read(inode
);
72 fscache_update_cookie(ceph_fscache_cookie(ci
), &ci
->i_version
, &i_size
);
75 void ceph_fscache_invalidate(struct inode
*inode
, bool dio_write
)
77 struct ceph_inode_info
*ci
= ceph_inode(inode
);
79 fscache_invalidate(ceph_fscache_cookie(ci
),
80 &ci
->i_version
, i_size_read(inode
),
81 dio_write
? FSCACHE_INVAL_DIO_WRITE
: 0);
84 int ceph_fscache_register_fs(struct ceph_fs_client
* fsc
, struct fs_context
*fc
)
86 const struct ceph_fsid
*fsid
= &fsc
->client
->fsid
;
87 const char *fscache_uniq
= fsc
->mount_options
->fscache_uniq
;
88 size_t uniq_len
= fscache_uniq
? strlen(fscache_uniq
) : 0;
92 name
= kasprintf(GFP_KERNEL
, "ceph,%pU%s%s", fsid
, uniq_len
? "," : "",
93 uniq_len
? fscache_uniq
: "");
97 fsc
->fscache
= fscache_acquire_volume(name
, NULL
, NULL
, 0);
98 if (IS_ERR_OR_NULL(fsc
->fscache
)) {
99 errorfc(fc
, "Unable to register fscache cookie for %s", name
);
100 err
= fsc
->fscache
? PTR_ERR(fsc
->fscache
) : -EOPNOTSUPP
;
107 void ceph_fscache_unregister_fs(struct ceph_fs_client
* fsc
)
109 fscache_relinquish_volume(fsc
->fscache
, NULL
, false);