@@ -949,6 +949,21 @@ SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
949
949
return error ;
950
950
}
951
951
952
+ int xattr_list_one (char * * buffer , ssize_t * remaining_size , const char * name )
953
+ {
954
+ size_t len ;
955
+
956
+ len = strlen (name ) + 1 ;
957
+ if (* buffer ) {
958
+ if (* remaining_size < len )
959
+ return - ERANGE ;
960
+ memcpy (* buffer , name , len );
961
+ * buffer += len ;
962
+ }
963
+ * remaining_size -= len ;
964
+ return 0 ;
965
+ }
966
+
952
967
/*
953
968
* Combine the results of the list() operation from every xattr_handler in the
954
969
* list.
@@ -957,33 +972,22 @@ ssize_t
957
972
generic_listxattr (struct dentry * dentry , char * buffer , size_t buffer_size )
958
973
{
959
974
const struct xattr_handler * handler , * * handlers = dentry -> d_sb -> s_xattr ;
960
- unsigned int size = 0 ;
961
-
962
- if (!buffer ) {
963
- for_each_xattr_handler (handlers , handler ) {
964
- if (!handler -> name ||
965
- (handler -> list && !handler -> list (dentry )))
966
- continue ;
967
- size += strlen (handler -> name ) + 1 ;
968
- }
969
- } else {
970
- char * buf = buffer ;
971
- size_t len ;
972
-
973
- for_each_xattr_handler (handlers , handler ) {
974
- if (!handler -> name ||
975
- (handler -> list && !handler -> list (dentry )))
976
- continue ;
977
- len = strlen (handler -> name );
978
- if (len + 1 > buffer_size )
979
- return - ERANGE ;
980
- memcpy (buf , handler -> name , len + 1 );
981
- buf += len + 1 ;
982
- buffer_size -= len + 1 ;
983
- }
984
- size = buf - buffer ;
975
+ ssize_t remaining_size = buffer_size ;
976
+ int err = 0 ;
977
+
978
+ err = posix_acl_listxattr (d_inode (dentry ), & buffer , & remaining_size );
979
+ if (err )
980
+ return err ;
981
+
982
+ for_each_xattr_handler (handlers , handler ) {
983
+ if (!handler -> name || (handler -> list && !handler -> list (dentry )))
984
+ continue ;
985
+ err = xattr_list_one (& buffer , & remaining_size , handler -> name );
986
+ if (err )
987
+ return err ;
985
988
}
986
- return size ;
989
+
990
+ return err ? err : buffer_size - remaining_size ;
987
991
}
988
992
EXPORT_SYMBOL (generic_listxattr );
989
993
@@ -1245,20 +1249,6 @@ static bool xattr_is_trusted(const char *name)
1245
1249
return !strncmp (name , XATTR_TRUSTED_PREFIX , XATTR_TRUSTED_PREFIX_LEN );
1246
1250
}
1247
1251
1248
- static int xattr_list_one (char * * buffer , ssize_t * remaining_size ,
1249
- const char * name )
1250
- {
1251
- size_t len = strlen (name ) + 1 ;
1252
- if (* buffer ) {
1253
- if (* remaining_size < len )
1254
- return - ERANGE ;
1255
- memcpy (* buffer , name , len );
1256
- * buffer += len ;
1257
- }
1258
- * remaining_size -= len ;
1259
- return 0 ;
1260
- }
1261
-
1262
1252
/**
1263
1253
* simple_xattr_list - list all xattr objects
1264
1254
* @inode: inode from which to get the xattrs
@@ -1287,22 +1277,9 @@ ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs,
1287
1277
ssize_t remaining_size = size ;
1288
1278
int err = 0 ;
1289
1279
1290
- #ifdef CONFIG_FS_POSIX_ACL
1291
- if (IS_POSIXACL (inode )) {
1292
- if (inode -> i_acl ) {
1293
- err = xattr_list_one (& buffer , & remaining_size ,
1294
- XATTR_NAME_POSIX_ACL_ACCESS );
1295
- if (err )
1296
- return err ;
1297
- }
1298
- if (inode -> i_default_acl ) {
1299
- err = xattr_list_one (& buffer , & remaining_size ,
1300
- XATTR_NAME_POSIX_ACL_DEFAULT );
1301
- if (err )
1302
- return err ;
1303
- }
1304
- }
1305
- #endif
1280
+ err = posix_acl_listxattr (inode , & buffer , & remaining_size );
1281
+ if (err )
1282
+ return err ;
1306
1283
1307
1284
read_lock (& xattrs -> lock );
1308
1285
for (rbp = rb_first (& xattrs -> rb_root ); rbp ; rbp = rb_next (rbp )) {
0 commit comments