2009-10-06 22:31:06 +04:00
/*
* Some non - inline ceph helpers
*/
2010-04-07 02:14:15 +04:00
# include <linux/module.h>
# include <linux/ceph/types.h>
2009-10-06 22:31:06 +04:00
2009-10-10 03:38:45 +04:00
/*
* return true if @ layout appears to be valid
*/
int ceph_file_layout_is_valid ( const struct ceph_file_layout * layout )
{
__u32 su = le32_to_cpu ( layout - > fl_stripe_unit ) ;
__u32 sc = le32_to_cpu ( layout - > fl_stripe_count ) ;
__u32 os = le32_to_cpu ( layout - > fl_object_size ) ;
/* stripe unit, object size must be non-zero, 64k increment */
if ( ! su | | ( su & ( CEPH_MIN_STRIPE_UNIT - 1 ) ) )
return 0 ;
if ( ! os | | ( os & ( CEPH_MIN_STRIPE_UNIT - 1 ) ) )
return 0 ;
/* object size must be a multiple of stripe unit */
if ( os < su | | os % su )
return 0 ;
/* stripe count must be non-zero */
if ( ! sc )
return 0 ;
return 1 ;
}
2009-10-06 22:31:06 +04:00
int ceph_flags_to_mode ( int flags )
{
2010-05-26 03:46:24 +04:00
int mode ;
2009-10-06 22:31:06 +04:00
# ifdef O_DIRECTORY /* fixme */
if ( ( flags & O_DIRECTORY ) = = O_DIRECTORY )
return CEPH_FILE_MODE_PIN ;
# endif
2010-05-26 03:46:24 +04:00
2011-07-19 22:25:04 +04:00
switch ( flags & O_ACCMODE ) {
case O_WRONLY :
2010-05-26 03:46:24 +04:00
mode = CEPH_FILE_MODE_WR ;
2011-07-19 22:25:04 +04:00
break ;
case O_RDONLY :
2010-05-26 03:46:24 +04:00
mode = CEPH_FILE_MODE_RD ;
2011-07-19 22:25:04 +04:00
break ;
case O_RDWR :
case O_ACCMODE : /* this is what the VFS does */
mode = CEPH_FILE_MODE_RDWR ;
break ;
}
2009-10-06 22:31:06 +04:00
# ifdef O_LAZY
if ( flags & O_LAZY )
2010-05-26 03:46:24 +04:00
mode | = CEPH_FILE_MODE_LAZY ;
2009-10-06 22:31:06 +04:00
# endif
2010-05-26 03:46:24 +04:00
return mode ;
2009-10-06 22:31:06 +04:00
}
2010-04-07 02:14:15 +04:00
EXPORT_SYMBOL ( ceph_flags_to_mode ) ;
2009-10-06 22:31:06 +04:00
int ceph_caps_for_mode ( int mode )
{
2010-05-26 03:46:24 +04:00
int caps = CEPH_CAP_PIN ;
if ( mode & CEPH_FILE_MODE_RD )
caps | = CEPH_CAP_FILE_SHARED |
2009-10-06 22:31:06 +04:00
CEPH_CAP_FILE_RD | CEPH_CAP_FILE_CACHE ;
2010-05-26 03:46:24 +04:00
if ( mode & CEPH_FILE_MODE_WR )
caps | = CEPH_CAP_FILE_EXCL |
2009-10-06 22:31:06 +04:00
CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER |
CEPH_CAP_AUTH_SHARED | CEPH_CAP_AUTH_EXCL |
CEPH_CAP_XATTR_SHARED | CEPH_CAP_XATTR_EXCL ;
2010-05-26 03:46:24 +04:00
if ( mode & CEPH_FILE_MODE_LAZY )
caps | = CEPH_CAP_FILE_LAZYIO ;
return caps ;
2009-10-06 22:31:06 +04:00
}
2010-04-07 02:14:15 +04:00
EXPORT_SYMBOL ( ceph_caps_for_mode ) ;