4

I'm working on some linux kernel stuff and I have a fake path called /dev/blah/whatever that points to /dev/block/real_device

The issue is that lookup_bdev will fail to follow the symlink so I'd like to massage the path upfront by getting the real path (/dev/block/real_device) so I can hand that off to lookup_bdev so it returns successfully instead of an error.

Or any other kernel call that would correctly retrieve the block_device information given the initial path.

Thanks

David
  • 3,324
  • 2
  • 27
  • 31
  • Try realpath() or canonicalize_file_name()? http://www.gnu.org/software/libc/manual/html_node/Symbolic-Links.html. Though, if you're working in kernel space, then this probably won't help. – Marc B Jan 29 '15 at 18:35

2 Answers2

4

Use VFS layer for this (dcache/nameidata in particular).

#include <linux/namei.h>
#include <linux/dcache.h>

...

struct path path;
char buf[256];
char* ptr;
int err = kern_path("/dev/disk/by-id/dm-name-lkdevel-root", 
                    LOOKUP_FOLLOW, &path);

if(!err) {
    ptr = d_path(&path, buf, 256);        

    if(!IS_ERR(ptr)) {
        /* ptr contains real path */
    }
}

This was tested on vanilla Linux 3.12

Note that d_path() may return weird results for special filesystems and append (deleted) suffix to deleted files.

myaut
  • 11,174
  • 2
  • 30
  • 62
0

Try to use sys_readlink() system call.

RedEyed
  • 2,062
  • 1
  • 23
  • 26