diff options
Diffstat (limited to 'net/socket.c')
| -rw-r--r-- | net/socket.c | 61 | 
1 files changed, 29 insertions, 32 deletions
diff --git a/net/socket.c b/net/socket.c index a1bd16106625..5a9bf5ee2464 100644 --- a/net/socket.c +++ b/net/socket.c @@ -320,11 +320,38 @@ static const struct dentry_operations sockfs_dentry_operations = {  	.d_dname  = sockfs_dname,  }; +static int sockfs_xattr_get(const struct xattr_handler *handler, +			    struct dentry *dentry, struct inode *inode, +			    const char *suffix, void *value, size_t size) +{ +	if (value) { +		if (dentry->d_name.len + 1 > size) +			return -ERANGE; +		memcpy(value, dentry->d_name.name, dentry->d_name.len + 1); +	} +	return dentry->d_name.len + 1; +} + +#define XATTR_SOCKPROTONAME_SUFFIX "sockprotoname" +#define XATTR_NAME_SOCKPROTONAME (XATTR_SYSTEM_PREFIX XATTR_SOCKPROTONAME_SUFFIX) +#define XATTR_NAME_SOCKPROTONAME_LEN (sizeof(XATTR_NAME_SOCKPROTONAME)-1) + +static const struct xattr_handler sockfs_xattr_handler = { +	.name = XATTR_NAME_SOCKPROTONAME, +	.get = sockfs_xattr_get, +}; + +static const struct xattr_handler *sockfs_xattr_handlers[] = { +	&sockfs_xattr_handler, +	NULL +}; +  static struct dentry *sockfs_mount(struct file_system_type *fs_type,  			 int flags, const char *dev_name, void *data)  { -	return mount_pseudo(fs_type, "socket:", &sockfs_ops, -		&sockfs_dentry_operations, SOCKFS_MAGIC); +	return mount_pseudo_xattr(fs_type, "socket:", &sockfs_ops, +				  sockfs_xattr_handlers, +				  &sockfs_dentry_operations, SOCKFS_MAGIC);  }  static struct vfsmount *sock_mnt __read_mostly; @@ -463,35 +490,6 @@ static struct socket *sockfd_lookup_light(int fd, int *err, int *fput_needed)  	return NULL;  } -#define XATTR_SOCKPROTONAME_SUFFIX "sockprotoname" -#define XATTR_NAME_SOCKPROTONAME (XATTR_SYSTEM_PREFIX XATTR_SOCKPROTONAME_SUFFIX) -#define XATTR_NAME_SOCKPROTONAME_LEN (sizeof(XATTR_NAME_SOCKPROTONAME)-1) -static ssize_t sockfs_getxattr(struct dentry *dentry, struct inode *inode, -			       const char *name, void *value, size_t size) -{ -	const char *proto_name; -	size_t proto_size; -	int error; - -	error = -ENODATA; -	if (!strncmp(name, XATTR_NAME_SOCKPROTONAME, XATTR_NAME_SOCKPROTONAME_LEN)) { -		proto_name = dentry->d_name.name; -		proto_size = strlen(proto_name); - -		if (value) { -			error = -ERANGE; -			if (proto_size + 1 > size) -				goto out; - -			strncpy(value, proto_name, proto_size + 1); -		} -		error = proto_size + 1; -	} - -out: -	return error; -} -  static ssize_t sockfs_listxattr(struct dentry *dentry, char *buffer,  				size_t size)  { @@ -521,7 +519,6 @@ static ssize_t sockfs_listxattr(struct dentry *dentry, char *buffer,  }  static const struct inode_operations sockfs_inode_ops = { -	.getxattr = sockfs_getxattr,  	.listxattr = sockfs_listxattr,  };  |