mirror of https://gitee.com/openkylin/linux.git
FS-Cache fixes
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIVAwUAVDwD3ROxKuMESys7AQLayg//Tmdi4eLzcky/HcOfAoVIY3B5Wvs1MBbN 3HhaYWKDeJvWxFmRDfQK0c1dyjBA2Xe7bPhdwQ8S9epAWAoW6D4g3Mg2+YReGLCK U/CcrMHN77RSydTG0Mj/Z99IynSdf9rwdNrCEy8NiNkGe8Z/JCFPpZurRCc4PL44 4miTUq3ESMTGkUsa9BH+T0ngEka2ZdwnmzlYkdzeqmjmlbFx8RxcEewBeAoAlU73 eihKKyX+1uWX/2DmJol5NtZx+BbNkFsO+pX+s+70TsbjiyILCAmgh5meTpkGsDrW iJGcgxwhcmyq1aTPcHRmXeNsVenbqRefGUtz7B5Q0x1Uk+ofRYfVVdiyTS2juGbC DFGyNBUcFqsmbSMxM+yZGSzgR9KbzoZHDR/ppbJfMqIoe+oGju/NE+AZ6Q3f2/Es AIGc8imc96QU08OnrZtreZxfgFMcFxBoGHvAM9AUr1ue80SWhVRZjwYx/JcIP7Cm TKyilgb5hfxJ7zon+JuHSqttpeG3zOTjjhcKDmJlybYkKlTeRXm6ZcKVrro5d2+z GLnH32HQRJvXBZslymqb7OgkxIW4ySO3PcAWTosUv9+zG0BPR1mB0NVQrSLEPk4L JHA+Mjp8O37pN3kRantVNHk73t0z4qkbi8Ixft0yAus9qNNFMeKh+7NbBRjxUZAU ARcAbvVMyT0= =RtLr -----END PGP SIGNATURE----- Merge tag 'fscache-fixes-20141013' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs Pull fs-cache fixes from David Howells: "Two fixes for bugs in CacheFiles and a cleanup in FS-Cache" * tag 'fscache-fixes-20141013' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs: fs/fscache/object-list.c: use __seq_open_private() CacheFiles: Fix incorrect test for in-memory object collision CacheFiles: Handle object being killed before being set up
This commit is contained in:
commit
1b5a5f59e3
|
@ -268,20 +268,27 @@ static void cachefiles_drop_object(struct fscache_object *_object)
|
|||
ASSERT((atomic_read(&object->usage) & 0xffff0000) != 0x6b6b0000);
|
||||
#endif
|
||||
|
||||
/* delete retired objects */
|
||||
if (test_bit(FSCACHE_OBJECT_RETIRED, &object->fscache.flags) &&
|
||||
_object != cache->cache.fsdef
|
||||
) {
|
||||
_debug("- retire object OBJ%x", object->fscache.debug_id);
|
||||
cachefiles_begin_secure(cache, &saved_cred);
|
||||
cachefiles_delete_object(cache, object);
|
||||
cachefiles_end_secure(cache, saved_cred);
|
||||
}
|
||||
/* We need to tidy the object up if we did in fact manage to open it.
|
||||
* It's possible for us to get here before the object is fully
|
||||
* initialised if the parent goes away or the object gets retired
|
||||
* before we set it up.
|
||||
*/
|
||||
if (object->dentry) {
|
||||
/* delete retired objects */
|
||||
if (test_bit(FSCACHE_OBJECT_RETIRED, &object->fscache.flags) &&
|
||||
_object != cache->cache.fsdef
|
||||
) {
|
||||
_debug("- retire object OBJ%x", object->fscache.debug_id);
|
||||
cachefiles_begin_secure(cache, &saved_cred);
|
||||
cachefiles_delete_object(cache, object);
|
||||
cachefiles_end_secure(cache, saved_cred);
|
||||
}
|
||||
|
||||
/* close the filesystem stuff attached to the object */
|
||||
if (object->backer != object->dentry)
|
||||
dput(object->backer);
|
||||
object->backer = NULL;
|
||||
/* close the filesystem stuff attached to the object */
|
||||
if (object->backer != object->dentry)
|
||||
dput(object->backer);
|
||||
object->backer = NULL;
|
||||
}
|
||||
|
||||
/* note that the object is now inactive */
|
||||
if (test_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags)) {
|
||||
|
|
|
@ -189,7 +189,7 @@ static int cachefiles_mark_object_active(struct cachefiles_cache *cache,
|
|||
/* an old object from a previous incarnation is hogging the slot - we
|
||||
* need to wait for it to be destroyed */
|
||||
wait_for_old_object:
|
||||
if (fscache_object_is_live(&object->fscache)) {
|
||||
if (fscache_object_is_live(&xobject->fscache)) {
|
||||
pr_err("\n");
|
||||
pr_err("Error: Unexpected object collision\n");
|
||||
cachefiles_printk_object(object, xobject);
|
||||
|
|
|
@ -380,26 +380,14 @@ static void fscache_objlist_config(struct fscache_objlist_data *data)
|
|||
static int fscache_objlist_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct fscache_objlist_data *data;
|
||||
struct seq_file *m;
|
||||
int ret;
|
||||
|
||||
ret = seq_open(file, &fscache_objlist_ops);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
m = file->private_data;
|
||||
|
||||
/* buffer for key extraction */
|
||||
data = kmalloc(sizeof(struct fscache_objlist_data), GFP_KERNEL);
|
||||
if (!data) {
|
||||
seq_release(inode, file);
|
||||
data = __seq_open_private(file, &fscache_objlist_ops, sizeof(*data));
|
||||
if (!data)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* get the configuration key */
|
||||
fscache_objlist_config(data);
|
||||
|
||||
m->private = data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue