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: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Thu, 21 May 2009 00:54:18 -0700
From:	ebiederm@...ssion.com (Eric W. Biederman)
To:	Tejun Heo <tj@...nel.org>
Cc:	Andrew Morton <akpm@...ux-foundation.org>,
	Greg Kroah-Hartman <gregkh@...e.de>,
	linux-kernel@...r.kernel.org,
	Cornelia Huck <cornelia.huck@...ibm.com>,
	linux-fsdevel@...r.kernel.org,
	"Eric W. Biederman" <ebiederm@...stanetworks.com>
Subject: Re: [PATCH 08/20] sysfs: Optimize just changing the sysfs file mode.

Tejun Heo <tj@...nel.org> writes:

> Eric W. Biederman wrote:
>> From: Eric W. Biederman <ebiederm@...ssion.com>
>> 
>> Don't allocate a struct iattr for the sysfs dentry if just
>> the mode changes because we have a field for that on the
>> sysfs_dirent, and we can trigger that case with sysfs_chmod_file.
>> 
>> Signed-off-by: Eric W. Biederman <ebiederm@...stanetworks.com>
>> ---
>>  fs/sysfs/inode.c |   22 ++++++++++++++--------
>>  1 files changed, 14 insertions(+), 8 deletions(-)
>> 
>> diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c
>> index 555f0ff..70ff2a2 100644
>> --- a/fs/sysfs/inode.c
>> +++ b/fs/sysfs/inode.c
>> @@ -60,12 +60,16 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
>>  		return error;
>>  
>>  	iattr->ia_valid &= ~ATTR_SIZE; /* ignore size changes */
>> +	if (iattr->ia_valid & ATTR_MODE) {
>> +		if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
>> +			iattr->ia_mode &= ~S_ISGID;
>> +	}
>>  
>>  	error = inode_setattr(inode, iattr);
>>  	if (error)
>>  		return error;
>>  
>> -	if (!sd_iattr) {
>> +	if (!sd_iattr && (ia_valid & ~ATTR_MODE)) {
>>  		/* setting attributes for the first time, allocate now */
>>  		sd_iattr = kzalloc(sizeof(struct iattr), GFP_KERNEL);
>>  		if (!sd_iattr)
>> @@ -78,6 +82,13 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
>>  		sd->s_iattr = sd_iattr;
>>  	}
>>  
>> +	if (ia_valid & ATTR_MODE)
>> +		sd->s_mode = iattr->ia_mode;
>> +
>> +	/* If we don't need the extra attributes leave */
>> +	if (!sd_iattr)
>> +		return 0;
>
> One visible difference is lack of timestamp update.  Is there any use
> case where sysfs file mode changing needs to be fast?\

Not really.  If the time changes we set something besides ATTR_MODE
like ATTR_MTIME or ATTR_CTIME.  If we come in through any of the
user space entry points ATTR_CTIME appears to be set so this optimization
will not trigger.

I think there are cases where we only opportunistically track time
changes, when the structure is allocated that this changes but it
is a very small percentage of the time.

The practical effect of my changes should be that we only track timestamps
when user space actually performs an explicit change to the file.

If someone was depending on some weird indirect side effect like that
on one of the 5-6 files that calls sysfs_chmod let's make it explicit.

For me this isn't about making this go faster.  This is about keeping
the sysfs data structures small when we can.

It doesn't really complicate the code and we wind up doing the obvious thing.

Eric
--
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