retval=PTR_ERR(dir_page);if(IS_ERR(dir_page))gotoout1; ... } getname()返回有可能是一个分配的页面的首地址,也有可能因为内存不足返回ERR_PTR(-ENOMEM);先看返回是页面首地址的情况,接着 通过PTR_ERR()将这个指针类型的地址转化成为一个整型,再通过IS_ERR()来判断是否是一个有效的页面首地址,这跟...
void*ERR_PTR(longerror);longIS_ERR(constvoid*ptr);longPTR_ERR(constvoid*ptr); 第一个函数实际上把错误值作为指针返回。假若函数在内存申请失败后要执行语句return -ENOMEM;,则必须改为这样的语句:return ERR_PTR(-ENOMEM);。 第二个函数用于检查返回值是否是指针错误:if (IS_ERR(foo))。最后一个函数返...
1)合法指针:内核返回的指针一般是指向页面的边界(4K边界),即ptr & 0xfff == 0 2)非法指针:这样ptr的值不可能落在(0xfffff000,0xffffffff)之间(这个区间是内核高端内存所在的区间,关于用户空间和内核空间,可以看考这里。), 而一般内核的出错代码也是一个小负数,在-1000到0之间,转变成unsigned long,正好在(0x...
表示filp_open函数失败,IS_ERR为1,同时filp_open返回的错误地址对应一个linux的错误号, 如果想知道是哪个错误号,就用PTR_ERR函数来转化。 错误的返回地址和错误号是可以使用 ERR_PTR、PTR_ERR 相互转化的。
几个内核函数:filp_open、filp_read、IS_ERR、ERR_PTR、PTR_ERR,程序员大本营,技术文章内容聚合第一站。
static inline void *ERR_PTR(long error) { return (void *) error; } /* 将指针转化为错误号 */ static inline long PTR_ERR(const void *ptr) { return (long) ptr; } /* 判断返回的指针是错误信息还是实际地址,即指针是否落在最后一页 ...
Linux内核IS_ERR/ERR_PTR/PTR_ERR 对于一个指针,一般分为3类:1、有效指针;2、NULL;3、非法指针 IS_ERR/ERR_PTR/PTR_ERR均定义在include/linux/err.h文件中。 1、IS_ERR static inline bool __must_check IS_ERR(__force const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr); } 1 2 ...
error){return(void*)error;}staticinlinelong__must_checkPTR_ERR(constvoid*ptr){return(long)ptr;}staticinlinelong__must_checkIS_ERR(constvoid*ptr){returnIS_ERR_VALUE((unsignedlong)ptr);}staticinlinelong__must_checkIS_ERR_OR_NULL(constvoid*ptr){return!ptr||IS_ERR_VALUE((unsignedlong)ptr);...
static inline long PTR_ERR(const void *ptr) { return (long) ptr; } static inline long IS_ERR(const void *ptr) { return IS_ERR_VALUE((unsigned long)ptr); } 判断是否为错误指针也是很简单unlikely((x) >= (unsigned long)-MAX_ERRNO),这里问什么是大于简单说一下,以为错误码在返回的时候都去...
2.1 ERR_PTR static inline void * __must_check ERR_PTR(long error) { return (void *) error; } 比如: ERR_PTR(-EINVAL); 2.2 PTR_ERR static inline long __must_check PTR_ERR(__force const void *ptr) { return (long) ptr; } 比如: if (IS_ERR(kobj)) { error = PTR_ERR(kobj);...