tags:

views:

276

answers:

1

I'm porting old linux kernel code for newer version 2.6.32.

There is a part that copies a file descriptor. The idea was to allocate a new file descriptor and a new struct file and use them with another f_op and , leaving all other fields of struct file equivalent to original's.

How do I do this in a modern kernel? I've written an approximate implementation but I don't know whether i should call file_get, path_get or do others use counter incrementation.

struct file * copy_file(const struct file * iOrig, int * oNewFd) {
  if (!orig)
    return 0; 
  *oNewFd = get_unused_fd();
  if (*oNewFd < 0)
    return 0;
  struct file * rv = alloc_file(orig->f_path.mnt, orig->f_path.dentry, orig->f_path.mode, orig->f_op);
  if (!rv)
    goto free_fd;
  fd_install(fd, rv);
  return rv;
free_fd:
  put_unused_fd(*oNewFd)
  return 0;
}

P.S. In fact having all fileds of original file copied is not neccessary. I just need to allow a new set of file operations in user-space. So creating a new descriptor owned by current with a given f_op will do.

+1  A: 

path_get sounds fine. Check out an example here http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/fs/pipe.c#L1046 and you'll be able to find more refs there if you need them.

ZXX