lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Date:	Thu, 3 Mar 2011 09:29:04 -0800 (PST)
From:	Dan Magenheimer <dan.magenheimer@...cle.com>
To:	Minchan Kim <minchan.kim@...il.com>
Cc:	Matt <jackdachef@...il.com>, gregkh@...e.de,
	Chris Mason <chris.mason@...cle.com>,
	linux-kernel@...r.kernel.org, linux-mm@...ck.org,
	ngupta@...are.org, linux-btrfs@...r.kernel.org,
	Josef Bacik <josef@...hat.com>,
	Dan Rosenberg <drosenberg@...curity.com>,
	Yan Zheng <zheng.z.yan@...el.com>, miaox@...fujitsu.com,
	Li Zefan <lizf@...fujitsu.com>
Subject: RE: [PATCH V2 0/3] drivers/staging: zcache: dynamic page cache/swap
 compression

> > I definitely see a bug in cleancache_get_key in the monolithic
> > zcache+cleancache+frontswap patch I posted on oss.oracle.com
> > that is corrected in linux-next but I don't see how it could
> > get provoked by btrfs.
> >
> > The bug is that, in cleancache_get_key, the return value of fhfn
> should
> > be checked against 255.  If the return value is 255,
> cleancache_get_key
> > should return -1.  This should disable cleancache for any filesystem
> > where KEY_MAX is too large.
> >
> > But cleancache_get_key always calls fhfn with connectable == 0 and
> > CLEANCACHE_KEY_MAX==6 should be greater than
> BTRFS_FID_SIZE_CONNECTABLE
> > (which I think should be 5?).  And the elements written into the
> > typecast btrfs_fid should be only writing the first 5 32-bit words.
> 
> BTRFS_FID_SIZE_NON_CONNECTALBE is 5,  not BTRFS_FID_SIZE_CONNECTABLE.
> Anyway, you passed connectable with 0 so it should be only writing the
> first 5 32-bit words as you said.
> That's one I missed. ;-)
> 
> Thanks.
> --
> Kind regards,
> Minchan Kim

Sorry, I realized that I solved this with Matt offlist and never
posted the solution on-list, so for the archives:

This patch applies on top of the cleancache patch.  It is really
a horrible hack but solving it correctly requires the interface
to encode_fh ops to change, which would require changes to many
filesystems, so best saved for a later time.  If/when cleancache
gets merged, this patch will need to be applied on top of it
for btrfs to work properly when cleancache is enabled.

Basically, the problem is that, in all current filesystems,
obtaining the filehandle requires a dentry ONLY if connectable
is set.  Otherwise, the dentry is only used to get the inode.
But cleancache_get_key only has an inode, and the alias list
of dentries associated with the inode may be empty.  So
either the encode_fh interface would need to be changed
or, in this hack-y solution, a dentry is created temporarily
only for the purpose of dereferencing it.

Signed-off-by: Dan Magenheimer <dan.magenheimer@...cle.com>

diff -Napur -X linux-2.6.37.1/Documentation/dontdiff linux-2.6.37.1/mm/cleancache.c linux-2.6.37.1-fix/mm/cleancache.c
--- linux-2.6.37.1/mm/cleancache.c	2011-02-25 11:38:47.000000000 -0800
+++ linux-2.6.37.1-fix/mm/cleancache.c	2011-02-25 08:53:46.000000000 -0800
@@ -78,15 +78,14 @@ static int cleancache_get_key(struct ino
 	int (*fhfn)(struct dentry *, __u32 *fh, int *, int);
 	int maxlen = CLEANCACHE_KEY_MAX;
 	struct super_block *sb = inode->i_sb;
-	struct dentry *d;
 
 	key->u.ino = inode->i_ino;
 	if (sb->s_export_op != NULL) {
 		fhfn = sb->s_export_op->encode_fh;
 		if  (fhfn) {
-			d = list_first_entry(&inode->i_dentry,
-						struct dentry, d_alias);
-			(void)(*fhfn)(d, &key->u.fh[0], &maxlen, 0);
+			struct dentry d;
+			d.d_inode = inode;
+			(void)(*fhfn)(&d, &key->u.fh[0], &maxlen, 0);
 			if (maxlen > CLEANCACHE_KEY_MAX)
 				return -1;
 		}
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ